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 f755b6907229066498e6b48290f1a790ac5ddd48..686e941c542b4ab55363945bc3d987e3d68fd78d 100644 |
--- a/core/src/fxge/ge/fx_ge_fontmap.cpp |
+++ b/core/src/fxge/ge/fx_ge_fontmap.cpp |
@@ -9,9 +9,31 @@ |
#include "../../../include/fxge/fx_ge.h" |
#include "../../../include/fxge/fx_freetype.h" |
#include "text_int.h" |
+ |
#define GET_TT_SHORT(w) (FX_WORD)(((w)[0] << 8) | (w)[1]) |
#define GET_TT_LONG(w) \ |
(FX_DWORD)(((w)[0] << 24) | ((w)[1] << 16) | ((w)[2] << 8) | (w)[3]) |
+ |
+namespace { |
+ |
+CFX_ByteString KeyNameFromFace(const CFX_ByteString& face_name, |
+ int weight, |
+ FX_BOOL bItalic) { |
+ CFX_ByteString key(face_name); |
+ key += ','; |
+ key += CFX_ByteString::FormatInteger(weight); |
+ key += bItalic ? 'I' : 'N'; |
+ return key; |
+} |
+ |
+CFX_ByteString KeyNameFromSize(int ttc_size, FX_DWORD checksum) { |
+ CFX_ByteString key; |
+ key.Format("%d:%d", ttc_size, checksum); |
+ return key; |
+} |
+ |
+} // namespace |
+ |
CFX_SubstFont::CFX_SubstFont() { |
m_ExtHandle = NULL; |
m_Charset = 0; |
@@ -74,14 +96,10 @@ void CFX_FontMgr::InitFTLibrary() { |
} |
} |
void CFX_FontMgr::FreeCache() { |
- FX_POSITION pos = m_FaceMap.GetStartPosition(); |
- while (pos) { |
- CFX_ByteString Key; |
- CTTFontDesc* face; |
- m_FaceMap.GetNextAssoc(pos, Key, (void*&)face); |
- delete face; |
- } |
- m_FaceMap.RemoveAll(); |
+ for (const auto& pair : m_FaceMap) { |
+ delete pair.second; |
+ } |
+ m_FaceMap.clear(); |
} |
void CFX_FontMgr::SetSystemFontInfo(IFX_SystemFontInfo* pFontInfo) { |
m_pBuiltinMapper->SetSystemFontInfo(pFontInfo); |
@@ -103,18 +121,14 @@ FXFT_Face CFX_FontMgr::GetCachedFace(const CFX_ByteString& face_name, |
int weight, |
FX_BOOL bItalic, |
uint8_t*& pFontData) { |
- CFX_ByteString key(face_name); |
- key += ','; |
- key += CFX_ByteString::FormatInteger(weight); |
- key += bItalic ? 'I' : 'N'; |
- CTTFontDesc* pFontDesc = NULL; |
- m_FaceMap.Lookup(key, (void*&)pFontDesc); |
- if (pFontDesc) { |
- pFontData = pFontDesc->m_pFontData; |
- pFontDesc->m_RefCount++; |
- return pFontDesc->m_SingleFace.m_pFace; |
- } |
- return NULL; |
+ auto it = m_FaceMap.find(KeyNameFromFace(face_name, weight, bItalic)); |
+ if (it == m_FaceMap.end()) |
+ return nullptr; |
+ |
+ CTTFontDesc* pFontDesc = it->second; |
+ pFontData = pFontDesc->m_pFontData; |
+ pFontDesc->m_RefCount++; |
+ return pFontDesc->m_SingleFace.m_pFace; |
} |
FXFT_Face CFX_FontMgr::AddCachedFace(const CFX_ByteString& face_name, |
int weight, |
@@ -148,11 +162,7 @@ FXFT_Face CFX_FontMgr::AddCachedFace(const CFX_ByteString& face_name, |
delete pFontDesc; |
return NULL; |
} |
- CFX_ByteString key(face_name); |
- key += ','; |
- key += CFX_ByteString::FormatInteger(weight); |
- key += bItalic ? 'I' : 'N'; |
- m_FaceMap.SetAt(key, pFontDesc); |
+ m_FaceMap[KeyNameFromFace(face_name, weight, bItalic)] = pFontDesc; |
return pFontDesc->m_SingleFace.m_pFace; |
} |
const FX_CHAR* const g_Base14FontNames[14] = { |
@@ -305,17 +315,15 @@ FXFT_Face CFX_FontMgr::GetCachedTTCFace(int ttc_size, |
FX_DWORD checksum, |
int font_offset, |
uint8_t*& pFontData) { |
- CFX_ByteString key; |
- key.Format("%d:%d", ttc_size, checksum); |
- CTTFontDesc* pFontDesc = NULL; |
- m_FaceMap.Lookup(key, (void*&)pFontDesc); |
- if (pFontDesc == NULL) { |
- return NULL; |
- } |
+ auto it = m_FaceMap.find(KeyNameFromSize(ttc_size, checksum)); |
+ if (it == m_FaceMap.end()) |
+ return nullptr; |
+ |
+ CTTFontDesc* pFontDesc = it->second; |
pFontData = pFontDesc->m_pFontData; |
pFontDesc->m_RefCount++; |
int face_index = GetTTCIndex(pFontDesc->m_pFontData, ttc_size, font_offset); |
- if (pFontDesc->m_TTCFace.m_pFaces[face_index] == NULL) { |
+ if (!pFontDesc->m_TTCFace.m_pFaces[face_index]) { |
pFontDesc->m_TTCFace.m_pFaces[face_index] = |
GetFixedFace(pFontDesc->m_pFontData, ttc_size, face_index); |
} |
@@ -326,8 +334,6 @@ FXFT_Face CFX_FontMgr::AddCachedTTCFace(int ttc_size, |
uint8_t* pData, |
FX_DWORD size, |
int font_offset) { |
- CFX_ByteString key; |
- key.Format("%d:%d", ttc_size, checksum); |
CTTFontDesc* pFontDesc = new CTTFontDesc; |
if (!pFontDesc) { |
return NULL; |
@@ -338,8 +344,7 @@ FXFT_Face CFX_FontMgr::AddCachedTTCFace(int ttc_size, |
pFontDesc->m_TTCFace.m_pFaces[i] = NULL; |
} |
pFontDesc->m_RefCount++; |
- key.Format("%d:%d", ttc_size, checksum); |
- m_FaceMap.SetAt(key, pFontDesc); |
+ m_FaceMap[KeyNameFromSize(ttc_size, checksum)] = pFontDesc; |
int face_index = GetTTCIndex(pFontDesc->m_pFontData, ttc_size, font_offset); |
pFontDesc->m_TTCFace.m_pFaces[face_index] = |
GetFixedFace(pFontDesc->m_pFontData, ttc_size, face_index); |
@@ -382,18 +387,16 @@ FXFT_Face CFX_FontMgr::GetFileFace(const FX_CHAR* filename, int face_index) { |
return face; |
} |
void CFX_FontMgr::ReleaseFace(FXFT_Face face) { |
- if (face == NULL) { |
+ if (!face) { |
return; |
} |
- FX_POSITION pos = m_FaceMap.GetStartPosition(); |
FX_BOOL bNeedFaceDone = TRUE; |
- while (pos) { |
- CFX_ByteString Key; |
- CTTFontDesc* ttface; |
- m_FaceMap.GetNextAssoc(pos, Key, (void*&)ttface); |
- int nRet = ttface->ReleaseFace(face); |
+ auto it = m_FaceMap.begin(); |
+ while (it != m_FaceMap.end()) { |
+ auto temp = it++; |
+ int nRet = temp->second->ReleaseFace(face); |
if (nRet == 0) { |
- m_FaceMap.RemoveKey(Key); |
+ m_FaceMap.erase(temp); |
bNeedFaceDone = FALSE; |
} else if (nRet > 0) { |
bNeedFaceDone = FALSE; |
@@ -1373,12 +1376,8 @@ IFX_SystemFontInfo* IFX_SystemFontInfo::CreateDefault() { |
#endif |
CFX_FolderFontInfo::CFX_FolderFontInfo() {} |
CFX_FolderFontInfo::~CFX_FolderFontInfo() { |
- FX_POSITION pos = m_FontList.GetStartPosition(); |
- while (pos) { |
- CFX_ByteString key; |
- void* value; |
- m_FontList.GetNextAssoc(pos, key, value); |
- delete (CFX_FontFaceInfo*)value; |
+ for (const auto& pair : m_FontList) { |
+ delete pair.second; |
} |
} |
void CFX_FolderFontInfo::AddPath(const CFX_ByteStringC& path) { |
@@ -1488,8 +1487,7 @@ void CFX_FolderFontInfo::ReportFace(CFX_ByteString& path, |
if (style != "Regular") { |
facename += " " + style; |
} |
- void* p; |
- if (m_FontList.Lookup(facename, p)) { |
+ if (m_FontList.find(facename) != m_FontList.end()) { |
return; |
} |
CFX_FontFaceInfo* pInfo = |
@@ -1533,7 +1531,7 @@ void CFX_FolderFontInfo::ReportFace(CFX_ByteString& path, |
if (facename.Find(FX_BSTRC("Serif")) > -1) { |
pInfo->m_Styles |= FXFONT_SERIF; |
} |
- m_FontList.SetAt(facename, pInfo); |
+ m_FontList[facename] = pInfo; |
} |
void* CFX_FolderFontInfo::MapFont(int weight, |
FX_BOOL bItalic, |
@@ -1550,11 +1548,8 @@ void* CFX_FolderFontInfo::MapFontByUnicode(FX_DWORD dwUnicode, |
return NULL; |
} |
void* CFX_FolderFontInfo::GetFont(const FX_CHAR* face) { |
- void* p; |
- if (!m_FontList.Lookup(face, p)) { |
- return NULL; |
- } |
- return p; |
+ auto it = m_FontList.find(face); |
+ return it != m_FontList.end() ? it->second : nullptr; |
} |
FX_DWORD CFX_FolderFontInfo::GetFontData(void* hFont, |
FX_DWORD table, |