mirror of
https://github.com/ClassiCube/ClassiCube.git
synced 2025-09-15 02:25:32 -04:00
Make measuring text slightly faster for system fonts
This commit is contained in:
parent
b9aa8a7544
commit
4e0c4ffe2e
@ -423,7 +423,7 @@ void Drawer2D_Underline(Bitmap* bmp, int x, int y, int width, int height, Bitmap
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void Drawer2D_DrawCore(Bitmap* bmp, struct DrawTextArgs* args, int x, int y, cc_bool shadow) {
|
static void DrawBitmappedTextCore(Bitmap* bmp, struct DrawTextArgs* args, int x, int y, cc_bool shadow) {
|
||||||
BitmapCol col;
|
BitmapCol col;
|
||||||
String text = args->text;
|
String text = args->text;
|
||||||
int i, point = args->font->size, count = 0;
|
int i, point = args->font->size, count = 0;
|
||||||
@ -528,9 +528,9 @@ static void DrawBitmappedText(Bitmap* bmp, struct DrawTextArgs* args, int x, int
|
|||||||
int offset = Drawer2D_ShadowOffset(args->font->size);
|
int offset = Drawer2D_ShadowOffset(args->font->size);
|
||||||
|
|
||||||
if (args->useShadow) {
|
if (args->useShadow) {
|
||||||
Drawer2D_DrawCore(bmp, args, x + offset, y + offset, true);
|
DrawBitmappedTextCore(bmp, args, x + offset, y + offset, true);
|
||||||
}
|
}
|
||||||
Drawer2D_DrawCore(bmp, args, x, y, false);
|
DrawBitmappedTextCore(bmp, args, x, y, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int MeasureBitmappedWidth(const struct DrawTextArgs* args) {
|
static int MeasureBitmappedWidth(const struct DrawTextArgs* args) {
|
||||||
@ -586,24 +586,9 @@ void Drawer2D_DrawText(Bitmap* bmp, struct DrawTextArgs* args, int x, int y) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int Drawer2D_TextWidth(struct DrawTextArgs* args) {
|
int Drawer2D_TextWidth(struct DrawTextArgs* args) {
|
||||||
String value = args->text;
|
|
||||||
char nextCol = 'f';
|
|
||||||
int i, width;
|
|
||||||
|
|
||||||
if (Drawer2D_IsEmptyText(&args->text)) return 0;
|
if (Drawer2D_IsEmptyText(&args->text)) return 0;
|
||||||
if (Drawer2D_BitmappedText) return MeasureBitmappedWidth(args);
|
if (Drawer2D_BitmappedText) return MeasureBitmappedWidth(args);
|
||||||
width = 0;
|
return Font_SysTextWidth(args);
|
||||||
|
|
||||||
for (i = 0; i < value.length; ) {
|
|
||||||
i = Drawer2D_NextPart(i, &value, &args->text, &nextCol);
|
|
||||||
|
|
||||||
if (!args->text.length) continue;
|
|
||||||
width += Font_SysTextWidth(args);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (args->useShadow) width += 2;
|
|
||||||
args->text = value;
|
|
||||||
return width;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int Drawer2D_TextHeight(struct DrawTextArgs* args) {
|
int Drawer2D_TextHeight(struct DrawTextArgs* args) {
|
||||||
@ -1064,24 +1049,32 @@ static int Font_SysTextWidth(struct DrawTextArgs* args) {
|
|||||||
Codepoint cp;
|
Codepoint cp;
|
||||||
|
|
||||||
for (i = 0; i < text.length; i++) {
|
for (i = 0; i < text.length; i++) {
|
||||||
charWidth = font->widths[(cc_uint8)text.buffer[i]];
|
char c = text.buffer[i];
|
||||||
|
if (c == '&' && Drawer2D_ValidColCodeAt(&text, i + 1)) {
|
||||||
|
i++; continue; /* skip over the colour code */
|
||||||
|
}
|
||||||
|
|
||||||
|
charWidth = font->widths[(cc_uint8)c];
|
||||||
/* need to calculate glyph width */
|
/* need to calculate glyph width */
|
||||||
if (charWidth == UInt16_MaxValue) {
|
if (charWidth == UInt16_MaxValue) {
|
||||||
cp = Convert_CP437ToUnicode(text.buffer[i]);
|
cp = Convert_CP437ToUnicode(c);
|
||||||
res = FT_Load_Char(face, cp, 0);
|
res = FT_Load_Char(face, cp, 0);
|
||||||
|
|
||||||
if (res) {
|
if (res) {
|
||||||
Platform_Log2("Error %i measuring width of %r", &res, &text.buffer[i]);
|
Platform_Log2("Error %i measuring width of %r", &res, &c);
|
||||||
charWidth = 0;
|
charWidth = 0;
|
||||||
} else {
|
} else {
|
||||||
charWidth = face->glyph->advance.x;
|
charWidth = face->glyph->advance.x;
|
||||||
}
|
}
|
||||||
|
|
||||||
font->widths[(cc_uint8)text.buffer[i]] = charWidth;
|
font->widths[(cc_uint8)c] = charWidth;
|
||||||
}
|
}
|
||||||
width += charWidth;
|
width += charWidth;
|
||||||
}
|
}
|
||||||
return TEXT_CEIL(width);
|
|
||||||
|
width = TEXT_CEIL(width);
|
||||||
|
if (args->useShadow) width += 2;
|
||||||
|
return width;
|
||||||
}
|
}
|
||||||
|
|
||||||
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) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user