| 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 100688c4e0f39ace1235bb589718da13632166b4..f4091e0136870ec9bedbe6f598eb9976ffbfec4e 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,
|
| @@ -145,11 +159,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] = {
|
| @@ -302,17 +312,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);
|
| }
|
| @@ -323,8 +331,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;
|
| pFontDesc->m_Type = 2;
|
| pFontDesc->m_pFontData = pData;
|
| @@ -332,8 +338,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);
|
| @@ -376,16 +381,14 @@ 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();
|
| - while (pos) {
|
| - CFX_ByteString Key;
|
| - CTTFontDesc* ttface;
|
| - m_FaceMap.GetNextAssoc(pos, Key, (void*&)ttface);
|
| - if (ttface->ReleaseFace(face)) {
|
| - m_FaceMap.RemoveKey(Key);
|
| + auto it = m_FaceMap.begin();
|
| + while (it != m_FaceMap.end()) {
|
| + auto temp = it++;
|
| + if (temp->second->ReleaseFace(face)) {
|
| + m_FaceMap.erase(temp);
|
| }
|
| }
|
| }
|
| @@ -1274,12 +1277,8 @@ IFX_SystemFontInfo* IFX_SystemFontInfo::CreateDefault(const char** pUnused) {
|
| #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) {
|
| @@ -1389,8 +1388,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 =
|
| @@ -1434,7 +1432,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,
|
| @@ -1445,11 +1443,8 @@ void* CFX_FolderFontInfo::MapFont(int weight,
|
| 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,
|
|
|