Fixed a regression where text shaping stopped working

This commit is contained in:
Leon Styhre 2024-08-04 12:16:13 +02:00
parent b288bd172c
commit 91d3f3a43a
2 changed files with 14 additions and 14 deletions

View file

@ -885,7 +885,7 @@ void Font::rebuildTextures()
// Re-upload the texture data. // Re-upload the texture data.
for (auto it = mGlyphMap.cbegin(); it != mGlyphMap.cend(); ++it) { for (auto it = mGlyphMap.cbegin(); it != mGlyphMap.cend(); ++it) {
FT_Face* face {getFaceForChar(it->first, returnedFont)}; FT_Face* face {getFaceForChar(it->first, &returnedFont)};
FT_GlyphSlot glyphSlot {(*face)->glyph}; FT_GlyphSlot glyphSlot {(*face)->glyph};
// Load the glyph bitmap through FreeType. // Load the glyph bitmap through FreeType.
@ -906,7 +906,7 @@ void Font::rebuildTextures()
for (auto it = mGlyphMapByIndex.cbegin(); it != mGlyphMapByIndex.cend(); ++it) { for (auto it = mGlyphMapByIndex.cbegin(); it != mGlyphMapByIndex.cend(); ++it) {
FT_Face* face { FT_Face* face {
getFaceForGlyphIndex(std::get<0>(it->first), std::get<1>(it->first), returnedFont)}; getFaceForGlyphIndex(std::get<0>(it->first), std::get<1>(it->first), &returnedFont)};
FT_GlyphSlot glyphSlot {(*face)->glyph}; FT_GlyphSlot glyphSlot {(*face)->glyph};
// Load the glyph bitmap through FreeType. // Load the glyph bitmap through FreeType.
@ -956,11 +956,11 @@ void Font::getTextureForNewGlyph(const glm::ivec2& glyphSize,
} }
} }
FT_Face* Font::getFaceForChar(unsigned int id, hb_font_t* returnedFont) FT_Face* Font::getFaceForChar(unsigned int id, hb_font_t** returnedFont)
{ {
// Look for the glyph in our current font and then in the fallback fonts if needed. // Look for the glyph in our current font and then in the fallback fonts if needed.
if (FT_Get_Char_Index(mFontFace->face, id) != 0) { if (FT_Get_Char_Index(mFontFace->face, id) != 0) {
returnedFont = mFontHB; *returnedFont = mFontHB;
return &mFontFace->face; return &mFontFace->face;
} }
@ -969,20 +969,20 @@ FT_Face* Font::getFaceForChar(unsigned int id, hb_font_t* returnedFont)
// This is most definitely not thread safe. // This is most definitely not thread safe.
FT_Set_Char_Size(font.face->face, static_cast<FT_F26Dot6>(0.0f), FT_Set_Char_Size(font.face->face, static_cast<FT_F26Dot6>(0.0f),
static_cast<FT_F26Dot6>(mFontSize * 64.0f), 0, 0); static_cast<FT_F26Dot6>(mFontSize * 64.0f), 0, 0);
returnedFont = font.fontHB; *returnedFont = font.fontHB;
return &font.face->face; return &font.face->face;
} }
} }
// Couldn't find a valid glyph, return the current font face so we get a "no glyph" character. // Couldn't find a valid glyph, return the current font face so we get a "no glyph" character.
returnedFont = nullptr; *returnedFont = nullptr;
return &mFontFace->face; return &mFontFace->face;
} }
FT_Face* Font::getFaceForGlyphIndex(unsigned int id, hb_font_t* fontArg, hb_font_t* returnedFont) FT_Face* Font::getFaceForGlyphIndex(unsigned int id, hb_font_t* fontArg, hb_font_t** returnedFont)
{ {
if (mFontFace->fontHB == fontArg && FT_Load_Glyph(mFontFace->face, id, FT_LOAD_RENDER) == 0) { if (mFontFace->fontHB == fontArg && FT_Load_Glyph(mFontFace->face, id, FT_LOAD_RENDER) == 0) {
returnedFont = mFontHB; *returnedFont = mFontHB;
return &mFontFace->face; return &mFontFace->face;
} }
@ -990,13 +990,13 @@ FT_Face* Font::getFaceForGlyphIndex(unsigned int id, hb_font_t* fontArg, hb_font
if (font.fontHB == fontArg && FT_Load_Glyph(font.face->face, id, FT_LOAD_RENDER) == 0) { if (font.fontHB == fontArg && FT_Load_Glyph(font.face->face, id, FT_LOAD_RENDER) == 0) {
FT_Set_Char_Size(font.face->face, static_cast<FT_F26Dot6>(0.0f), FT_Set_Char_Size(font.face->face, static_cast<FT_F26Dot6>(0.0f),
static_cast<FT_F26Dot6>(mFontSize * 64.0f), 0, 0); static_cast<FT_F26Dot6>(mFontSize * 64.0f), 0, 0);
returnedFont = font.fontHB; *returnedFont = font.fontHB;
return &font.face->face; return &font.face->face;
} }
} }
// Couldn't find a valid glyph, return the current font face so we get a "no glyph" character. // Couldn't find a valid glyph, return the current font face so we get a "no glyph" character.
returnedFont = nullptr; *returnedFont = nullptr;
return &mFontFace->face; return &mFontFace->face;
} }
@ -1010,7 +1010,7 @@ Font::Glyph* Font::getGlyph(const unsigned int id)
hb_font_t* returnedFont {nullptr}; hb_font_t* returnedFont {nullptr};
// We need to create a new entry. // We need to create a new entry.
FT_Face* face {getFaceForChar(id, returnedFont)}; FT_Face* face {getFaceForChar(id, &returnedFont)};
if (!face) { if (!face) {
LOG(LogError) << "Couldn't find appropriate font face for character " << id << " for font " LOG(LogError) << "Couldn't find appropriate font face for character " << id << " for font "
<< mPath; << mPath;
@ -1082,7 +1082,7 @@ Font::Glyph* Font::getGlyphByIndex(const unsigned int id, hb_font_t* fontArg, in
hb_font_t* returnedFont {nullptr}; hb_font_t* returnedFont {nullptr};
// We need to create a new entry. // We need to create a new entry.
FT_Face* face {getFaceForGlyphIndex(id, fontArg, returnedFont)}; FT_Face* face {getFaceForGlyphIndex(id, fontArg, &returnedFont)};
if (!face) { if (!face) {
LOG(LogError) << "Couldn't find appropriate font face for character " << id << " for font " LOG(LogError) << "Couldn't find appropriate font face for character " << id << " for font "
<< mPath; << mPath;

View file

@ -221,8 +221,8 @@ private:
glm::ivec2& cursorOut); glm::ivec2& cursorOut);
std::vector<FallbackFontCache> getFallbackFontPaths(); std::vector<FallbackFontCache> getFallbackFontPaths();
FT_Face* getFaceForChar(unsigned int id, hb_font_t* returnedFont); FT_Face* getFaceForChar(unsigned int id, hb_font_t** returnedFont);
FT_Face* getFaceForGlyphIndex(unsigned int id, hb_font_t* fontArg, hb_font_t* returnedFont); FT_Face* getFaceForGlyphIndex(unsigned int id, hb_font_t* fontArg, hb_font_t** returnedFont);
Glyph* getGlyph(const unsigned int id); Glyph* getGlyph(const unsigned int id);
Glyph* getGlyphByIndex(const unsigned int id, hb_font_t* fontArg, int xAdvance); Glyph* getGlyphByIndex(const unsigned int id, hb_font_t* fontArg, int xAdvance);