Cache height for fonts

This commit is contained in:
UnknownShadow200 2019-08-29 15:16:44 +10:00
parent 12833fdaa5
commit 11e44e9a6b
2 changed files with 21 additions and 26 deletions

View File

@ -47,6 +47,9 @@ static String font_candidates[9] = {
String_FromConst("Roboto") /* android */ String_FromConst("Roboto") /* android */
}; };
/* adjusts height to be closer to system fonts */
static int Drawer2D_AdjHeight(int point) { return Math_CeilDiv(point * 3, 2); }
void Drawer2D_MakeFont(struct FontDesc* desc, int size, int style) { void Drawer2D_MakeFont(struct FontDesc* desc, int size, int style) {
int i; int i;
ReturnCode res; ReturnCode res;
@ -55,6 +58,7 @@ void Drawer2D_MakeFont(struct FontDesc* desc, int size, int style) {
desc->handle = NULL; desc->handle = NULL;
desc->size = size; desc->size = size;
desc->style = style; desc->style = style;
desc->height = Drawer2D_AdjHeight(size);
} else { } else {
font_candidates[0] = Drawer2D_FontName; font_candidates[0] = Drawer2D_FontName;
@ -137,8 +141,6 @@ void Drawer2D_SetFontBitmap(Bitmap* bmp) {
/* Measures width of the given text when drawn with the given system font. */ /* Measures width of the given text when drawn with the given system font. */
static int Font_SysTextWidth(struct DrawTextArgs* args); static int Font_SysTextWidth(struct DrawTextArgs* args);
/* Measures height of any text when drawn with the given system font. */
static int Font_SysFontHeight(const struct FontDesc* desc);
/* Draws the given text with the given system font onto the given bitmap. */ /* Draws the given text with the given system font onto the given bitmap. */
static int Font_SysTextDraw(struct DrawTextArgs* args, Bitmap* bmp, int x, int y, BitmapCol col, bool shadow); static int Font_SysTextDraw(struct DrawTextArgs* args, Bitmap* bmp, int x, int y, BitmapCol col, bool shadow);
@ -368,12 +370,12 @@ CC_NOINLINE static BitmapCol Drawer2D_ShadowCol(BitmapCol c) {
c.R >>= 2; c.G >>= 2; c.B >>= 2; return c; c.R >>= 2; c.G >>= 2; c.B >>= 2; return c;
} }
/* TODO: Needs to account for DPI */
#define Drawer2D_ShadowOffset(point) (point / 8) #define Drawer2D_ShadowOffset(point) (point / 8)
#define Drawer2D_XPadding(point) (Math_CeilDiv(point, 8)) #define Drawer2D_XPadding(point) (Math_CeilDiv(point, 8))
static int Drawer2D_Width(int point, char c) { static int Drawer2D_Width(int point, char c) {
return Math_CeilDiv(tileWidths[(cc_uint8)c] * point, tileSize); return Math_CeilDiv(tileWidths[(cc_uint8)c] * point, tileSize);
} }
static int Drawer2D_AdjHeight(int point) { return Math_CeilDiv(point * 3, 2); }
void Drawer2D_ReducePadding_Tex(struct Texture* tex, int point, int scale) { void Drawer2D_ReducePadding_Tex(struct Texture* tex, int point, int scale) {
int padding; int padding;
@ -467,7 +469,7 @@ static void Drawer2D_DrawCore(Bitmap* bmp, struct DrawTextArgs* args, int x, int
dstHeight = point; begX = x; dstHeight = point; begX = x;
/* adjust coords to make drawn text match GDI fonts */ /* adjust coords to make drawn text match GDI fonts */
xPadding = Drawer2D_XPadding(point); xPadding = Drawer2D_XPadding(point);
yPadding = (Drawer2D_AdjHeight(dstHeight) - dstHeight) / 2; yPadding = (args->font->height - dstHeight) / 2;
for (yy = 0; yy < dstHeight; yy++) { for (yy = 0; yy < dstHeight; yy++) {
dstY = y + (yy + yPadding); dstY = y + (yy + yPadding);
@ -609,15 +611,10 @@ int Drawer2D_TextHeight(struct DrawTextArgs* args) {
} }
int Drawer2D_FontHeight(const struct FontDesc* font, bool useShadow) { int Drawer2D_FontHeight(const struct FontDesc* font, bool useShadow) {
int height, point; int height = font->height;
if (Drawer2D_BitmappedText) { if (Drawer2D_BitmappedText) {
point = font->size; if (useShadow) { height += Drawer2D_ShadowOffset(font->size); }
/* adjust coords to make drawn text match GDI fonts */
height = Drawer2D_AdjHeight(point);
if (useShadow) { height += Drawer2D_ShadowOffset(point); }
} else { } else {
height = Font_SysFontHeight(font);
if (useShadow) height += 2; if (useShadow) height += 2;
} }
return height; return height;
@ -740,18 +737,18 @@ String Font_Lookup(const String* fontName, int style) {
} }
ReturnCode Font_Make(FontDesc* desc, const String* fontName, int size, int style) { ReturnCode Font_Make(FontDesc* desc, const String* fontName, int size, int style) {
desc->Size = size; desc->size = size;
desc->Style = style; desc->style = style;
desc->height = 0;
return 0; return 0;
} }
void Font_Free(FontDesc* desc) { void Font_Free(FontDesc* desc) {
desc->Size = 0; desc->size = 0;
desc->Style = 0; desc->style = 0;
} }
void SysFonts_Register(const String* path) { } void SysFonts_Register(const String* path) { }
static int Font_SysTextWidth(struct DrawTextArgs* args) { return 0; } static int Font_SysTextWidth(struct DrawTextArgs* args) { return 0; }
static int Font_SysFontHeight(const FontDesc* font) { return 0; }
static int Font_SysTextDraw(struct DrawTextArgs* args, Bitmap* bmp, int x, int y, BitmapCol col, bool shadow) { return 0; } static int Font_SysTextDraw(struct DrawTextArgs* args, Bitmap* bmp, int x, int y, BitmapCol col, bool shadow) { return 0; }
#else #else
#include "freetype/ft2build.h" #include "freetype/ft2build.h"
@ -991,6 +988,7 @@ String Font_Lookup(const String* fontName, int style) {
return path.length ? path : Font_LookupOf(fontName, 'R'); return path.length ? path : Font_LookupOf(fontName, 'R');
} }
#define TEXT_CEIL(x) (((x) + 63) >> 6)
ReturnCode Font_Make(struct FontDesc* desc, const String* fontName, int size, int style) { ReturnCode Font_Make(struct FontDesc* desc, const String* fontName, int size, int style) {
struct SysFont* font; struct SysFont* font;
String value, path, index; String value, path, index;
@ -1012,7 +1010,11 @@ ReturnCode Font_Make(struct FontDesc* desc, const String* fontName, int size, in
desc->handle = font; desc->handle = font;
if ((err = FT_New_Face(ft_lib, &args, faceIndex, &font->face))) return err; if ((err = FT_New_Face(ft_lib, &args, faceIndex, &font->face))) return err;
return FT_Set_Char_Size(font->face, size * 64, 0, Display_DpiX, Display_DpiY); if ((err = FT_Set_Char_Size(font->face, size * 64, 0, Display_DpiX, Display_DpiY))) return err;
/* height of any text when drawn with the given system font */
desc->height = TEXT_CEIL(font->face->size->metrics.height);
return 0;
} }
void Font_Free(struct FontDesc* desc) { void Font_Free(struct FontDesc* desc) {
@ -1028,7 +1030,6 @@ void Font_Free(struct FontDesc* desc) {
desc->handle = NULL; desc->handle = NULL;
} }
#define TEXT_CEIL(x) (((x) + 63) >> 6)
static int Font_SysTextWidth(struct DrawTextArgs* args) { static int Font_SysTextWidth(struct DrawTextArgs* args) {
struct SysFont* font = (struct SysFont*)args->font->handle; struct SysFont* font = (struct SysFont*)args->font->handle;
FT_Face face = font->face; FT_Face face = font->face;
@ -1058,12 +1059,6 @@ static int Font_SysTextWidth(struct DrawTextArgs* args) {
return TEXT_CEIL(width); return TEXT_CEIL(width);
} }
static int Font_SysFontHeight(const struct FontDesc* desc) {
struct SysFont* font = (struct SysFont*)desc->handle;
FT_Face face = font->face;
return TEXT_CEIL(face->size->metrics.height);
}
static void DrawGrayscaleGlyph(FT_Bitmap* img, Bitmap* bmp, int x, int y, BitmapCol col) { static void DrawGrayscaleGlyph(FT_Bitmap* img, Bitmap* bmp, int x, int y, BitmapCol col) {
cc_uint8* src; cc_uint8* src;
BitmapCol* dst; BitmapCol* dst;
@ -1133,7 +1128,7 @@ static int Font_SysTextDraw(struct DrawTextArgs* args, Bitmap* bmp, int x, int y
FT_Set_Transform(face, NULL, &delta); FT_Set_Transform(face, NULL, &delta);
} }
height = TEXT_CEIL(face->size->metrics.height); height = args->font->height;
descender = TEXT_CEIL(face->size->metrics.descender); descender = TEXT_CEIL(face->size->metrics.descender);
for (i = 0; i < text.length; i++) { for (i = 0; i < text.length; i++) {

View File

@ -7,7 +7,7 @@
Copyright 2014-2019 ClassiCube | Licensed under BSD-3 Copyright 2014-2019 ClassiCube | Licensed under BSD-3
*/ */
struct FontDesc { void* handle; cc_uint16 size, style; }; struct FontDesc { void* handle; cc_uint16 size, style; int height; };
struct DrawTextArgs { String text; struct FontDesc* font; bool useShadow; }; struct DrawTextArgs { String text; struct FontDesc* font; bool useShadow; };
struct Texture; struct Texture;
struct IGameComponent; struct IGameComponent;