Files
kichikuou_xsystem35-sdl2/src/font_sdlttf.c
T
2017-02-18 18:16:32 +09:00

121 lines
2.1 KiB
C

#include "config.h"
#include <SDL.h>
#include <SDL_ttf.h>
#include "portab.h"
#include "system.h"
#include "font.h"
typedef struct {
int size;
int type;
TTF_Font *id;
} FontTable;
#define FONTTABLEMAX 256
static FontTable fonttbl[FONTTABLEMAX];
static int fontcnt = 0;
static TTF_Font *fontset;
static FONT *this;
static void font_insert(int size, int type, ttfont *fontset) {
fonttbl[fontcnt].size = size;
fonttbl[fontcnt].type = type;
fonttbl[fontcnt].id = fontset;
if (fontcnt >= (FONTTABLEMAX -1)) {
WARNING("Font table is full.\n");
} else {
fontcnt++;
}
}
static FontTable *font_lookup(int size, int type) {
int i;
for (i = 0; i < fontcnt; i++) {
if (fonttbl[i].size == size && fonttbl[i].type == type) {
return &fonttbl[i];
}
}
return NULL;
}
static void font_ttf_sel_font(int type, int size) {
FontTable *tbl;
if (NULL == (tbl = font_lookup(size, type))) {
TTF_Font *fs;
fs = TTF_OpenFont(this->name[type], size);
if (fs == NULL) {
WARNING("%s is not found:\n", this->name[type]);
return;
}
font_insert(size, type, fs);
fontset = fs;
} else {
fontset = tbl->id;
}
}
static void *font_sdlttf_get_glyph(unsigned char *msg) {
}
static int font_sdlttf_draw_glyph(int x, int y, unsigned char *str, int cl) {
SDL_Surface *fs;
SDL_Color fg;
SDL_Rect r_src, r_dst;
int w, h;
fg = SDL_MapRGB(sdl_dib->format,
sdl_col[cl].r, sdl_col[cl].g, sdl_col[cl].b);
if (this->antialiase_on) {
fs = TTF_RenderText_Shaded(fontset, str, cl);
} else {
fs = TTF_RenderText_Solid(fonset, str, cl);
}
TTF_SizeText(fontset, str, &w, &h);
setRect(r_src, 0, 0, w, h);
setRect(r_dst, x, y, w, h);
SDL_LockSurface(sdl_dib);
SDL_BlitSurface(fs, &r_src, sdl_dib, &r_dst);
SDL_UnlockSurface(sdl_dib);
return w;
}
static boolean drawable() {
return TRUE;
}
FONT *font_ttf_new() {
FONT *f = malloc(sizeof(FONT));
f->sel_font = font_sdlttf_sel_font;
f->get_glyph = font_sdlttf_get_glyph;
f->draw_glyph = font_sdlttf_draw_glyph;
f->self_drawable = drawable;
f->antialiase_on = FALSE;
for (i = 0; i < 4; i++) {
fontmaps[i].etype = -1;
}
TTF_Init();
this = f;
return f;
}