diff --git a/src/gpufont/font.hpp b/src/gpufont/font.hpp index f5b9a77..688f78c 100644 --- a/src/gpufont/font.hpp +++ b/src/gpufont/font.hpp @@ -702,6 +702,7 @@ class Font { int i = 0; stringstream text; + bool useNotdef = false; for(const auto & glyphIdentity : variationText){ const uint32_t & charcode = glyphIdentity.charcode; @@ -720,9 +721,31 @@ class Font { const_cast (glyphIdentity.coords)); // danger? FT_UInt glyphIndex = FT_Get_Char_Index(face, charcode); - if(!glyphIndex){ - continue; - } + // NOTE: 0 means no glyph as in '.notdef' + // we actually WANT the notdef glyph to render + // and let FreeType handle this. + // + // we leave the unwanted logic below for reference + // and delete it some time when we're absolutely sure + // we do not need it (probably yes). + // + //if(!glyphIndex){ + //std::cout << "[font] no glyph index for character " << charcode << ": " << "" << std::endl; + //if(!useNotdef){ + //glyphIndex = FT_Get_Char_Index(face, 0x110000); + //std::cout << "[font] no glyph index for character " << charcode << ": " << "attempt replace with notdef" << std::endl; + //if(!glyphIndex){ + //glyphIndex = FT_Get_Char_Index(face, 0x25A1); + //std::cout << "[font] no glyph index for character " << charcode << ": " << "attempt replace with white square" << std::endl; + //if(!glyphIndex){ + //std::cerr << "[font] absolutely no glyph index for character " << charcode << ": " << "" << std::endl; + //continue; + //} + //} + //useNotdef = true; + //} + //continue; + //} FT_Error error = FT_Load_Glyph(face, glyphIndex, loadFlags); if(error){ @@ -1318,7 +1341,16 @@ class Font { } auto glyphIt = glyphs.find(glyphIdentity); - Glyph & glyph = (glyphIt == glyphs.end()) ? glyphs.begin()->second : glyphIt->second; // in case we have no glyph, draw first one? + if(glyphIt == glyphs.end()){ + glyphIt = glyphs.find({0x110000, glyphIdentity.coords}); + if(glyphIt == glyphs.end()){ + glyphIt = glyphs.find({0x25A1, glyphIdentity.coords}); + if(glyphIt == glyphs.end()){ + glyphIt = glyphs.begin(); + } + } + } + Glyph & glyph = glyphIt->second; // in case we have no glyph, draw first one? // NOTE: should we do this? if(previous != 0 && glyph.index != 0){