Index: core/src/fxge/ge/fx_ge_fontmap.cpp |
diff --git a/core/src/fxge/ge/fx_ge_fontmap.cpp b/core/src/fxge/ge/fx_ge_fontmap.cpp |
index 6781369455df6c9cf9c431349d241c9b13479531..77f94865605476e0c759eb78b945fe73ab3ac0f5 100644 |
--- a/core/src/fxge/ge/fx_ge_fontmap.cpp |
+++ b/core/src/fxge/ge/fx_ge_fontmap.cpp |
@@ -437,10 +437,10 @@ CTTFontDesc::~CTTFontDesc() { |
} |
FX_Free(m_pFontData); |
} |
-FX_BOOL CTTFontDesc::ReleaseFace(FXFT_Face face) { |
+int CTTFontDesc::ReleaseFace(FXFT_Face face) { |
if (m_Type == 1) { |
if (m_SingleFace.m_pFace != face) { |
- return FALSE; |
+ return -1; |
} |
} else if (m_Type == 2) { |
int i; |
@@ -449,15 +449,15 @@ FX_BOOL CTTFontDesc::ReleaseFace(FXFT_Face face) { |
break; |
} |
if (i == 16) { |
- return FALSE; |
+ return -1; |
} |
} |
m_RefCount--; |
if (m_RefCount) { |
- return FALSE; |
+ return m_RefCount; |
} |
delete this; |
- return TRUE; |
+ return 0; |
} |
CFX_FontMgr::CFX_FontMgr() : m_FTLibrary(nullptr) { |
@@ -621,13 +621,20 @@ void CFX_FontMgr::ReleaseFace(FXFT_Face face) { |
if (!face) { |
return; |
} |
+ FX_BOOL bNeedFaceDone = TRUE; |
auto it = m_FaceMap.begin(); |
while (it != m_FaceMap.end()) { |
auto temp = it++; |
- if (temp->second->ReleaseFace(face)) { |
+ int nRet = temp->second->ReleaseFace(face); |
+ if (nRet == -1) |
+ continue; |
+ bNeedFaceDone = FALSE; |
+ if (nRet == 0) |
m_FaceMap.erase(temp); |
- } |
+ break; |
} |
+ if (bNeedFaceDone && !m_pBuiltinMapper->IsBuiltinFace(face)) |
+ FXFT_Done_Face(face); |
} |
bool CFX_FontMgr::GetBuiltinFont(size_t index, |