| 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 2dfb3c7a1750997b0ceb1a228a73c18b4117fc20..63cbecd0ebb45da2ff23a5c4d3a7a53e703fa35f 100644
|
| --- a/core/src/fxge/ge/fx_ge_fontmap.cpp
|
| +++ b/core/src/fxge/ge/fx_ge_fontmap.cpp
|
| @@ -80,31 +80,31 @@ int32_t CTTFontDesc::ReleaseFace(FXFT_Face face) {
|
| delete this;
|
| return 0;
|
| }
|
| +
|
| CFX_FontMgr::CFX_FontMgr() : m_FTLibrary(nullptr) {
|
| - m_pBuiltinMapper = new CFX_FontMapper(this);
|
| - FXSYS_memset(m_ExternalFonts, 0, sizeof m_ExternalFonts);
|
| + m_pBuiltinMapper.reset(new CFX_FontMapper(this));
|
| }
|
| +
|
| CFX_FontMgr::~CFX_FontMgr() {
|
| - delete m_pBuiltinMapper;
|
| - FreeCache();
|
| - if (m_FTLibrary) {
|
| - FXFT_Done_FreeType(m_FTLibrary);
|
| - }
|
| + for (const auto& pair : m_FaceMap)
|
| + delete pair.second;
|
| +
|
| + // |m_pBuiltinMapper| references |m_FTLibrary|, so it has to be destroyed
|
| + // first.
|
| + m_pBuiltinMapper.reset();
|
| + FXFT_Done_FreeType(m_FTLibrary);
|
| }
|
| +
|
| void CFX_FontMgr::InitFTLibrary() {
|
| - if (m_FTLibrary == NULL) {
|
| - FXFT_Init_FreeType(&m_FTLibrary);
|
| - }
|
| -}
|
| -void CFX_FontMgr::FreeCache() {
|
| - for (const auto& pair : m_FaceMap) {
|
| - delete pair.second;
|
| - }
|
| - m_FaceMap.clear();
|
| + if (m_FTLibrary)
|
| + return;
|
| + FXFT_Init_FreeType(&m_FTLibrary);
|
| }
|
| +
|
| void CFX_FontMgr::SetSystemFontInfo(IFX_SystemFontInfo* pFontInfo) {
|
| m_pBuiltinMapper->SetSystemFontInfo(pFontInfo);
|
| }
|
| +
|
| FXFT_Face CFX_FontMgr::FindSubstFont(const CFX_ByteString& face_name,
|
| FX_BOOL bTrueType,
|
| FX_DWORD flags,
|
| @@ -112,12 +112,11 @@ FXFT_Face CFX_FontMgr::FindSubstFont(const CFX_ByteString& face_name,
|
| int italic_angle,
|
| int CharsetCP,
|
| CFX_SubstFont* pSubstFont) {
|
| - if (!m_FTLibrary) {
|
| - FXFT_Init_FreeType(&m_FTLibrary);
|
| - }
|
| + InitFTLibrary();
|
| return m_pBuiltinMapper->FindSubstFont(face_name, bTrueType, flags, weight,
|
| italic_angle, CharsetCP, pSubstFont);
|
| }
|
| +
|
| FXFT_Face CFX_FontMgr::GetCachedFace(const CFX_ByteString& face_name,
|
| int weight,
|
| FX_BOOL bItalic,
|
| @@ -144,11 +143,9 @@ FXFT_Face CFX_FontMgr::AddCachedFace(const CFX_ByteString& face_name,
|
| pFontDesc->m_SingleFace.m_bItalic = bItalic;
|
| pFontDesc->m_pFontData = pData;
|
| pFontDesc->m_RefCount = 1;
|
| - FXFT_Library library;
|
| - if (m_FTLibrary == NULL) {
|
| - FXFT_Init_FreeType(&m_FTLibrary);
|
| - }
|
| - library = m_FTLibrary;
|
| +
|
| + InitFTLibrary();
|
| + FXFT_Library library = m_FTLibrary;
|
| int ret = FXFT_New_Memory_Face(library, pData, size, face_index,
|
| &pFontDesc->m_SingleFace.m_pFace);
|
| if (ret) {
|
| @@ -335,42 +332,27 @@ FXFT_Face CFX_FontMgr::AddCachedTTCFace(int ttc_size,
|
| GetFixedFace(pFontDesc->m_pFontData, ttc_size, face_index);
|
| return pFontDesc->m_TTCFace.m_pFaces[face_index];
|
| }
|
| +
|
| FXFT_Face CFX_FontMgr::GetFixedFace(const uint8_t* pData,
|
| FX_DWORD size,
|
| int face_index) {
|
| - FXFT_Library library;
|
| - if (m_FTLibrary == NULL) {
|
| - FXFT_Init_FreeType(&m_FTLibrary);
|
| - }
|
| - library = m_FTLibrary;
|
| - FXFT_Face face = NULL;
|
| - int ret = FXFT_New_Memory_Face(library, pData, size, face_index, &face);
|
| - if (ret) {
|
| - return NULL;
|
| - }
|
| - ret = FXFT_Set_Pixel_Sizes(face, 64, 64);
|
| - if (ret) {
|
| - return NULL;
|
| - }
|
| - return face;
|
| + InitFTLibrary();
|
| + FXFT_Library library = m_FTLibrary;
|
| + FXFT_Face face = nullptr;
|
| + if (FXFT_New_Memory_Face(library, pData, size, face_index, &face))
|
| + return nullptr;
|
| + return FXFT_Set_Pixel_Sizes(face, 64, 64) ? nullptr : face;
|
| }
|
| +
|
| FXFT_Face CFX_FontMgr::GetFileFace(const FX_CHAR* filename, int face_index) {
|
| - FXFT_Library library;
|
| - if (m_FTLibrary == NULL) {
|
| - FXFT_Init_FreeType(&m_FTLibrary);
|
| - }
|
| - library = m_FTLibrary;
|
| - FXFT_Face face = NULL;
|
| - int ret = FXFT_New_Face(library, filename, face_index, &face);
|
| - if (ret) {
|
| - return NULL;
|
| - }
|
| - ret = FXFT_Set_Pixel_Sizes(face, 64, 64);
|
| - if (ret) {
|
| - return NULL;
|
| - }
|
| - return face;
|
| + InitFTLibrary();
|
| + FXFT_Library library = m_FTLibrary;
|
| + FXFT_Face face = nullptr;
|
| + if (FXFT_New_Face(library, filename, face_index, &face))
|
| + return nullptr;
|
| + return FXFT_Set_Pixel_Sizes(face, 64, 64) ? nullptr : face;
|
| }
|
| +
|
| void CFX_FontMgr::ReleaseFace(FXFT_Face face) {
|
| if (!face) {
|
| return;
|
| @@ -1066,19 +1048,7 @@ FXFT_Face CFX_FontMapper::FindSubstFont(const CFX_ByteString& name,
|
| iBaseFont += 2;
|
| }
|
| }
|
| - if (m_pFontMgr->m_ExternalFonts[iBaseFont].m_pFontData) {
|
| - if (m_FoxitFaces[iBaseFont]) {
|
| - return m_FoxitFaces[iBaseFont];
|
| - }
|
| - m_FoxitFaces[iBaseFont] = m_pFontMgr->GetFixedFace(
|
| - m_pFontMgr->m_ExternalFonts[iBaseFont].m_pFontData,
|
| - m_pFontMgr->m_ExternalFonts[iBaseFont].m_dwSize, 0);
|
| - if (m_FoxitFaces[iBaseFont]) {
|
| - return m_FoxitFaces[iBaseFont];
|
| - }
|
| - } else {
|
| - family = g_Base14FontNames[iBaseFont];
|
| - }
|
| + family = g_Base14FontNames[iBaseFont];
|
| pSubstFont->m_SubstFlags |= FXFONT_SUBST_STANDARD;
|
| }
|
| } else {
|
|
|