From 7c57b1d6ca1bc39f93e6e9a0a7d96d312a180ee0 Mon Sep 17 00:00:00 2001 From: Francesco Abbate Date: Sat, 30 May 2020 20:01:37 +0200 Subject: [PATCH] Adjust the font's height when creating the bitmap Now the font's height to compute the bitmap is computed correcty but: - STB truetype takes the pixel height as a float - AGG takes an integer --- notes.md | 52 +++------------------------------- tests/agg_font_render_test.cpp | 16 +++++++---- tests/stb_font_render_test.c | 1 + 3 files changed, 16 insertions(+), 53 deletions(-) diff --git a/notes.md b/notes.md index 5efb8627..6d677080 100644 --- a/notes.md +++ b/notes.md @@ -79,6 +79,9 @@ So BakeFontBitmap gets pixel_height = (ascent - descent) * font->size / unitsPerEm; ``` +In turns BakeFontBitmap passes pixel_height to ScaleForPixelHeight() and uses the +resulting 'scale' to scale the glyphs by passing it to MakeGlyphBitmap(). + This is equal almost equal to font->height except the 0.5, the missing linegap calculation and the fact that this latter is an integer instead of a float. @@ -109,54 +112,7 @@ FT_Done_FreeType (end with library) ## Freetype2's metrics related function and structs -FT_New_Face - -```c -typedef struct FT_FaceRec_ -{ - FT_Long num_faces; - FT_Long face_index; - - FT_Long face_flags; - FT_Long style_flags; - - FT_Long num_glyphs; - - FT_String* family_name; - FT_String* style_name; - - FT_Int num_fixed_sizes; - FT_Bitmap_Size* available_sizes; - - FT_Int num_charmaps; - FT_CharMap* charmaps; - - FT_Generic generic; - - /*# The following member variables (down to `underline_thickness`) */ - /*# are only relevant to scalable outlines; cf. @FT_Bitmap_Size */ - /*# for bitmap fonts. */ - FT_BBox bbox; - - FT_UShort units_per_EM; - FT_Short ascender; - FT_Short descender; - FT_Short height; - - FT_Short max_advance_width; - FT_Short max_advance_height; - - FT_Short underline_position; - FT_Short underline_thickness; - - FT_GlyphSlot glyph; - FT_Size size; - FT_CharMap charmap; - - /* private part omitted. */ - -} FT_FaceRec; -``` +FT_New_Face return a FT_Face (a pointer) with font face information. ## AGG font engine's font size diff --git a/tests/agg_font_render_test.cpp b/tests/agg_font_render_test.cpp index 7a50a341..b15558f2 100644 --- a/tests/agg_font_render_test.cpp +++ b/tests/agg_font_render_test.cpp @@ -25,6 +25,9 @@ struct RenFontA { font_renderer_alpha *renderer; float size; int height; + // For some reason the font's height used in renderer.c + // when calling BakeFontBitmap is 0.5 off from 'height'. + float height_bitmap; }; template @@ -57,7 +60,7 @@ RenFontA* ren_load_font_agg(const char *filename, float size) { font = (RenFontA *) check_alloc(calloc(1, sizeof(RenFontA))); font->size = size; - font->renderer = new font_renderer_alpha(true, false); + font->renderer = new font_renderer_alpha(false, false); font->renderer->load_font(filename); int ascender, descender; @@ -66,6 +69,7 @@ RenFontA* ren_load_font_agg(const char *filename, float size) { float scale = font->renderer->scale_for_em_to_pixels(size); font->height = (ascender - descender) * scale + 0.5; + font->height_bitmap = (ascender - descender) * scale; fprintf(stderr, "Font height: %d\n", font->height); @@ -84,15 +88,17 @@ retry: memset(set->image->pixels, 0x00, width * height * pixel_size); + fprintf(stderr, "Using height: %g in BakeFontBitmap\n", font->height_bitmap); + agg::rendering_buffer ren_buf((agg::int8u *) set->image->pixels, width, height, -width * pixel_size); // FIXME: figure out how to precisely layout each glyph. - double x = 4, y = height - font->size * 3 / 2; + double x = 4, y = height - font->height * 3 / 2; int res = 0; const agg::alpha8 text_color(0xff); for (int i = 0; i < 256; i++) { - if (x + font->size * 3 / 2 > width) { + if (x + font->height * 3 / 2 > width) { x = 4; - y -= font->size * 3 / 2; + y -= font->height * 3 / 2; } if (y < 0) { res = -1; @@ -101,7 +107,7 @@ retry: // FIXME: we are ignoring idx and with a char we cannot pass codepoint > 255. char text[2] = {char(i % 256), 0}; // FIXME: using font->size below is wrong. - font->renderer->render_text(ren_buf, font->size, text_color, x, y, text); + font->renderer->render_text(ren_buf, font->height_bitmap, text_color, x, y, text); } /* retry with a larger image buffer if the buffer wasn't large enough */ diff --git a/tests/stb_font_render_test.c b/tests/stb_font_render_test.c index 3a70e703..dcf0bf50 100644 --- a/tests/stb_font_render_test.c +++ b/tests/stb_font_render_test.c @@ -107,6 +107,7 @@ retry: float s = stbtt_ScaleForMappingEmToPixels(&font->stbfont, 1) / stbtt_ScaleForPixelHeight(&font->stbfont, 1); + fprintf(stderr, "Using height: %g in BakeFontBitmap\n", font->size * s); int res = stbtt_BakeFontBitmap( font->data, 0, font->size * s, (void*) set->image->pixels, width, height, idx * 256, 256, set->glyphs);