From 151baaa8ffbcb034a74089d584b2da4a291671da Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Tue, 8 Mar 2016 15:14:54 +0100 Subject: [PATCH] Freetype: use actual metrics instead of bitmap data. also skip empty glyphs (whitespace chars/missing glyphs etc). --- source/Graphics/Font/FreeTypeDriver.cpp | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/source/Graphics/Font/FreeTypeDriver.cpp b/source/Graphics/Font/FreeTypeDriver.cpp index 4d3ca98..14dcf19 100644 --- a/source/Graphics/Font/FreeTypeDriver.cpp +++ b/source/Graphics/Font/FreeTypeDriver.cpp @@ -105,19 +105,24 @@ Font::Glyph FreeTypeDriver::loadGlyph(unsigned int codepoint, Image& img) FT_Error error = FT_Load_Char(m_face, codepoint, flags); if (!error) { - - FT_GlyphSlot slot = m_face->glyph; + FT_Glyph_Metrics& metrics = m_face->glyph->metrics; - if (slot->bitmap.buffer) { - img.create(PixelFormat::PF_Alpha, - slot->bitmap.width, - slot->bitmap.rows, - slot->bitmap.buffer); + if (metrics.width > 0 && metrics.height > 0) { + + FT_Bitmap& bmp = m_face->glyph->bitmap; + + img.create(PixelFormat::PF_Alpha, + bmp.width, + bmp.rows, + bmp.buffer); + + glyph.offset.x = metrics.horiBearingX / (1 << 6); + glyph.offset.y = metrics.horiBearingY / (1 << 6); + glyph.size.x = metrics.width / (1 << 6); + glyph.size.y = metrics.height / (1 << 6); } - glyph.offset = vec2b(slot->bitmap_left, slot->bitmap_top); - glyph.size = vec2b(slot->bitmap.width, slot->bitmap.rows); - glyph.advance = static_cast(slot->advance.x >> 6); + glyph.advance = static_cast(metrics.horiAdvance >> 6); } else { log("FreeType: failed to load glyph for character code '%c'\n", codepoint); }