Index: core/src/fxge/ge/fx_ge_text.cpp |
diff --git a/core/src/fxge/ge/fx_ge_text.cpp b/core/src/fxge/ge/fx_ge_text.cpp |
index a8e7bb8c3cd88efb53263bd09afe7aadd27aecc1..f01bdcfb3ee36873b2ebb49bdb76b15fd17418e9 100644 |
--- a/core/src/fxge/ge/fx_ge_text.cpp |
+++ b/core/src/fxge/ge/fx_ge_text.cpp |
@@ -14,6 +14,33 @@ |
#define FX_GAMMA(value) (value) |
#define FX_GAMMA_INVERSE(value) (value) |
+namespace { |
+ |
+void ResetTransform(FT_Face face) { |
+ FXFT_Matrix matrix; |
+ matrix.xx = 0x10000L; |
+ matrix.xy = 0; |
+ matrix.yx = 0; |
+ matrix.yy = 0x10000L; |
+ FXFT_Set_Transform(face, &matrix, 0); |
+} |
+ |
+// Sets the given transform on the font, and resets it to the identity when it |
+// goes out of scope. |
+class ScopedFontTransform { |
+ public: |
+ ScopedFontTransform(FT_Face face, FXFT_Matrix* matrix) : m_Face(face) { |
+ FXFT_Set_Transform(m_Face, matrix, 0); |
+ } |
+ |
+ ~ScopedFontTransform() { ResetTransform(m_Face); } |
+ |
+ private: |
+ FT_Face m_Face; |
+}; |
+ |
+} // namespace |
+ |
FX_RECT FXGE_GetGlyphsBBox(FXTEXT_GLYPHPOS* pGlyphAndPos, |
int nChars, |
int anti_alias, |
@@ -1156,6 +1183,7 @@ CFX_FaceCache* CFX_FontCache::GetCachedFace(CFX_Font* pFont) { |
counted_face_cache->m_nCount++; |
return counted_face_cache->m_Obj; |
} |
+ |
CFX_FaceCache* face_cache = new CFX_FaceCache(bExternal ? nullptr : face); |
CFX_CountedFaceCache* counted_face_cache = new CFX_CountedFaceCache; |
counted_face_cache->m_nCount = 2; |
@@ -1524,7 +1552,7 @@ CFX_GlyphBitmap* CFX_FaceCache::RenderGlyph(CFX_Font* pFont, |
pFont->GetSubstFont()->m_Weight); |
} |
} |
- FXFT_Set_Transform(m_Face, &ft_matrix, 0); |
+ ScopedFontTransform scoped_transform(m_Face, &ft_matrix); |
int load_flags = (m_Face->face_flags & FT_FACE_FLAG_SFNT) |
? FXFT_LOAD_NO_BITMAP |
: (FXFT_LOAD_NO_BITMAP | FT_LOAD_NO_HINTING); |
@@ -1791,7 +1819,7 @@ CFX_PathData* CFX_Font::LoadGlyphPath(FX_DWORD glyph_index, int dest_width) { |
AdjustMMParams(glyph_index, dest_width, m_pSubstFont->m_Weight); |
} |
} |
- FXFT_Set_Transform(m_Face, &ft_matrix, 0); |
+ ScopedFontTransform scoped_transform(m_Face, &ft_matrix); |
int load_flags = FXFT_LOAD_NO_BITMAP; |
if (!(m_Face->face_flags & FT_FACE_FLAG_SFNT) || !FT_IS_TRICKY(m_Face)) { |
load_flags |= FT_LOAD_NO_HINTING; |