From 1ddfbba3666a835b59fc79b59aaae367ee93a6ea Mon Sep 17 00:00:00 2001 From: Jakob Fries Date: Sat, 22 Dec 2007 02:55:19 +0000 Subject: add new font stuff --- src/engine/client/ec_ui.c | 158 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 158 insertions(+) (limited to 'src/engine/client/ec_ui.c') diff --git a/src/engine/client/ec_ui.c b/src/engine/client/ec_ui.c index 5ba9c0d9..b0e088a0 100644 --- a/src/engine/client/ec_ui.c +++ b/src/engine/client/ec_ui.c @@ -275,3 +275,161 @@ void ui_margin(const struct rect *original, int pixels, struct rect *other_rect) other_rect->w = r.w - 2*pixels; other_rect->h = r.h - 2*pixels; } + +typedef struct +{ + short x, y; + short width, height; + short x_offset, y_offset; + short x_advance; +} FONT_CHARACTER; + +typedef struct +{ + short size; + short width, height; + + short line_height; + short base; + + FONT_CHARACTER characters[256]; + + short kerning[256*256]; +} FONT_DATA; + +int font_load(FONT *font, const char *filename) +{ + FONT_DATA font_data; + IOHANDLE file; + + dbg_msg("font/load", "loading %s", filename); + file = io_open(filename, IOFLAG_READ); + + if(file) + { + int i; + + io_read(file, &font_data, sizeof(FONT_DATA)); + io_close(file); + +#if defined(CONF_ARCH_ENDIAN_BIG) + swap_endian(&font_data, 2, sizeof(FONT_DATA)/2); +#endif + + dbg_msg("font/load", "width: %d, height: %d, sizeof(FONT_DATA): %d", font_data.width, font_data.height, sizeof(FONT_DATA)); + + { + float scale_factor_x = ((float)font_data.size)/font_data.width; + float scale_factor_y = ((float)font_data.size)/font_data.height; + float scale_factor_tex_x = 1.0f/font_data.width; + float scale_factor_tex_y = 1.0f/font_data.height; + + for (i = 0; i < 256; i++) + { + float tex_x0 = font_data.characters[i].x*scale_factor_tex_x; + float tex_y0 = font_data.characters[i].y*scale_factor_tex_y; + float tex_x1 = (font_data.characters[i].x+font_data.characters[i].width)*scale_factor_tex_x; + float tex_y1 = (font_data.characters[i].y+font_data.characters[i].height)*scale_factor_tex_y; + + float width = font_data.characters[i].width*scale_factor_x; + float height = font_data.characters[i].height*scale_factor_y; + float x_offset = font_data.characters[i].x_offset*scale_factor_x; + float y_offset = font_data.characters[i].y_offset*scale_factor_y; + float x_advance = font_data.characters[i].x_advance*scale_factor_x; + + font->characters[i].tex_x0 = tex_x0; + font->characters[i].tex_y0 = tex_y0; + font->characters[i].tex_x1 = tex_x1; + font->characters[i].tex_y1 = tex_y1; + font->characters[i].width = width; + font->characters[i].height = height; + font->characters[i].x_offset = x_offset; + font->characters[i].y_offset = y_offset; + font->characters[i].x_advance = x_advance; + + } + + for (i = 0; i < 256*256; i++) + { + font->kerning[i] = font_data.kerning[i]*scale_factor_x; + } + } + + return 0; + } + else + return -1; +} + +int font_save(FONT *font, const char *filename) +{ + return 0; +} + +float font_string_width(FONT *font, const char *string, float size) +{ + float width = 0.0f; + + const unsigned char *c = (unsigned char *)string; + + while (*c) + { + float tex_x0, tex_y0, tex_x1, tex_y1; + float char_width, char_height; + float x_offset, y_offset, x_advance; + + font_character_info(font, *c, &tex_x0, &tex_y0, &tex_x1, &tex_y1, &char_width, &char_height, &x_offset, &y_offset, &x_advance); + + + width += x_advance; + + c++; + } + + + return width*size; +} + +void font_character_info(FONT *font, unsigned char c, float *tex_x0, float *tex_y0, float *tex_x1, float *tex_y1, float *width, float *height, float *x_offset, float *y_offset, float *x_advance) +{ + CHARACTER *character = &font->characters[c]; + + *tex_x0 = character->tex_x0; + *tex_y0 = character->tex_y0; + *tex_x1 = character->tex_x1; + *tex_y1 = character->tex_y1; + *width = character->width; + *height = character->height; + *x_offset = character->x_offset; + *y_offset = character->y_offset; + *x_advance = character->x_advance; +} + +void font_render(FONT *font, const char *string, float x, float y, float size) +{ + const unsigned char *c = (unsigned char *)string; + + gfx_texture_set(font->texture); + + gfx_quads_begin(); + gfx_setcolor(1.0f, 1.0f, 1.0f, 1.0f); + + while (*c) + { + float tex_x0, tex_y0, tex_x1, tex_y1; + float width, height; + float x_offset, y_offset, x_advance; + + font_character_info(font, *c, &tex_x0, &tex_y0, &tex_x1, &tex_y1, &width, &height, &x_offset, &y_offset, &x_advance); + + gfx_quads_setsubset(tex_x0, tex_y0, tex_x1, tex_y1); + + gfx_quads_drawTL(x+x_offset*size, y+y_offset*size, width*size, height*size); + + x += x_advance*size; + + c++; + } + + gfx_quads_end(); +} -- cgit 1.4.1