| Index: xfa/fgas/font/cfgas_fontmgr.cpp
|
| diff --git a/xfa/fgas/font/cfgas_fontmgr.cpp b/xfa/fgas/font/cfgas_fontmgr.cpp
|
| index 5cf5a46d0e4ce0574b4fe880cf1da4ac995c8d99..1849441a1681616691237ef978291d802997a60f 100644
|
| --- a/xfa/fgas/font/cfgas_fontmgr.cpp
|
| +++ b/xfa/fgas/font/cfgas_fontmgr.cpp
|
| @@ -15,6 +15,7 @@
|
| #include "core/fxge/cfx_gemodule.h"
|
| #include "core/fxge/ifx_systemfontinfo.h"
|
| #include "third_party/base/ptr_util.h"
|
| +#include "third_party/base/stl_util.h"
|
| #include "xfa/fgas/crt/fgas_codepage.h"
|
| #include "xfa/fgas/font/cfgas_gefont.h"
|
| #include "xfa/fgas/font/fgas_fontutils.h"
|
| @@ -101,38 +102,25 @@ std::unique_ptr<CFGAS_FontMgr> CFGAS_FontMgr::Create(
|
| }
|
|
|
| CFGAS_FontMgr::CFGAS_FontMgr(FX_LPEnumAllFonts pEnumerator)
|
| - : m_pEnumerator(pEnumerator),
|
| - m_FontFaces(100),
|
| - m_CPFonts(8),
|
| - m_FamilyFonts(16),
|
| - m_UnicodeFonts(16),
|
| - m_BufferFonts(4),
|
| - m_StreamFonts(4),
|
| - m_DeriveFonts(4) {
|
| + : m_pEnumerator(pEnumerator), m_FontFaces(100) {
|
| if (m_pEnumerator)
|
| m_pEnumerator(m_FontFaces, nullptr, 0xFEFF);
|
| }
|
|
|
| CFGAS_FontMgr::~CFGAS_FontMgr() {
|
| m_FontFaces.RemoveAll(false);
|
| - m_CPFonts.RemoveAll();
|
| - m_FamilyFonts.RemoveAll();
|
| - m_UnicodeFonts.RemoveAll();
|
| - m_BufferFonts.RemoveAll();
|
| - m_StreamFonts.RemoveAll();
|
| - m_DeriveFonts.RemoveAll();
|
| - for (int32_t i = m_Fonts.GetUpperBound(); i >= 0; i--)
|
| - m_Fonts[i]->Release();
|
| }
|
|
|
| -CFGAS_GEFont* CFGAS_FontMgr::GetFontByCodePage(uint16_t wCodePage,
|
| - uint32_t dwFontStyles,
|
| - const FX_WCHAR* pszFontFamily) {
|
| +CFX_RetainPtr<CFGAS_GEFont> CFGAS_FontMgr::GetFontByCodePage(
|
| + uint16_t wCodePage,
|
| + uint32_t dwFontStyles,
|
| + const FX_WCHAR* pszFontFamily) {
|
| uint32_t dwHash = FGAS_GetFontHashCode(wCodePage, dwFontStyles);
|
| - CFGAS_GEFont* pFont = nullptr;
|
| - if (m_CPFonts.Lookup((void*)(uintptr_t)dwHash, (void*&)pFont))
|
| - return pFont ? LoadFont(pFont, dwFontStyles, wCodePage) : nullptr;
|
| - FX_FONTDESCRIPTOR const* pFD =
|
| + auto it = m_CPFonts.find(dwHash);
|
| + if (it != m_CPFonts.end()) {
|
| + return it->second ? LoadFont(it->second, dwFontStyles, wCodePage) : nullptr;
|
| + }
|
| + const FX_FONTDESCRIPTOR* pFD =
|
| FindFont(pszFontFamily, dwFontStyles, true, wCodePage);
|
| if (!pFD)
|
| pFD = FindFont(nullptr, dwFontStyles, true, wCodePage);
|
| @@ -141,32 +129,34 @@ CFGAS_GEFont* CFGAS_FontMgr::GetFontByCodePage(uint16_t wCodePage,
|
| if (!pFD)
|
| return nullptr;
|
|
|
| - pFont =
|
| + CFX_RetainPtr<CFGAS_GEFont> pFont =
|
| CFGAS_GEFont::LoadFont(pFD->wsFontFace, dwFontStyles, wCodePage, this);
|
| if (!pFont)
|
| return nullptr;
|
|
|
| - m_Fonts.Add(pFont);
|
| - m_CPFonts.SetAt((void*)(uintptr_t)dwHash, (void*)pFont);
|
| + m_Fonts.push_back(pFont);
|
| + m_CPFonts[dwHash] = pFont;
|
| dwHash = FGAS_GetFontFamilyHash(pFD->wsFontFace, dwFontStyles, wCodePage);
|
| - m_FamilyFonts.SetAt((void*)(uintptr_t)dwHash, (void*)pFont);
|
| + m_FamilyFonts[dwHash] = pFont;
|
| return LoadFont(pFont, dwFontStyles, wCodePage);
|
| }
|
|
|
| -CFGAS_GEFont* CFGAS_FontMgr::GetFontByUnicode(FX_WCHAR wUnicode,
|
| - uint32_t dwFontStyles,
|
| - const FX_WCHAR* pszFontFamily) {
|
| +CFX_RetainPtr<CFGAS_GEFont> CFGAS_FontMgr::GetFontByUnicode(
|
| + FX_WCHAR wUnicode,
|
| + uint32_t dwFontStyles,
|
| + const FX_WCHAR* pszFontFamily) {
|
| const FGAS_FONTUSB* pRet = FGAS_GetUnicodeBitField(wUnicode);
|
| if (pRet->wBitField == 999)
|
| return nullptr;
|
|
|
| uint32_t dwHash =
|
| FGAS_GetFontFamilyHash(pszFontFamily, dwFontStyles, pRet->wBitField);
|
| - CFGAS_GEFont* pFont = nullptr;
|
| - if (m_UnicodeFonts.Lookup((void*)(uintptr_t)dwHash, (void*&)pFont))
|
| - return pFont ? LoadFont(pFont, dwFontStyles, pRet->wCodePage) : nullptr;
|
| -
|
| - FX_FONTDESCRIPTOR const* pFD =
|
| + auto it = m_UnicodeFonts.find(dwHash);
|
| + if (it != m_UnicodeFonts.end()) {
|
| + return it->second ? LoadFont(it->second, dwFontStyles, pRet->wCodePage)
|
| + : nullptr;
|
| + }
|
| + const FX_FONTDESCRIPTOR* pFD =
|
| FindFont(pszFontFamily, dwFontStyles, false, pRet->wCodePage,
|
| pRet->wBitField, wUnicode);
|
| if (!pFD && pszFontFamily) {
|
| @@ -178,28 +168,31 @@ CFGAS_GEFont* CFGAS_FontMgr::GetFontByUnicode(FX_WCHAR wUnicode,
|
|
|
| uint16_t wCodePage = FX_GetCodePageFromCharset(pFD->uCharSet);
|
| const FX_WCHAR* pFontFace = pFD->wsFontFace;
|
| - pFont = CFGAS_GEFont::LoadFont(pFontFace, dwFontStyles, wCodePage, this);
|
| + CFX_RetainPtr<CFGAS_GEFont> pFont =
|
| + CFGAS_GEFont::LoadFont(pFontFace, dwFontStyles, wCodePage, this);
|
| if (!pFont)
|
| return nullptr;
|
|
|
| - m_Fonts.Add(pFont);
|
| - m_UnicodeFonts.SetAt((void*)(uintptr_t)dwHash, (void*)pFont);
|
| - dwHash = FGAS_GetFontHashCode(wCodePage, dwFontStyles);
|
| - m_CPFonts.SetAt((void*)(uintptr_t)dwHash, (void*)pFont);
|
| - dwHash = FGAS_GetFontFamilyHash(pFontFace, dwFontStyles, wCodePage);
|
| - m_FamilyFonts.SetAt((void*)(uintptr_t)dwHash, (void*)pFont);
|
| + m_Fonts.push_back(pFont);
|
| + m_UnicodeFonts[dwHash] = pFont;
|
| + m_CPFonts[FGAS_GetFontHashCode(wCodePage, dwFontStyles)] = pFont;
|
| + m_FamilyFonts[FGAS_GetFontFamilyHash(pFontFace, dwFontStyles, wCodePage)] =
|
| + pFont;
|
| return LoadFont(pFont, dwFontStyles, wCodePage);
|
| }
|
|
|
| -CFGAS_GEFont* CFGAS_FontMgr::LoadFont(const FX_WCHAR* pszFontFamily,
|
| - uint32_t dwFontStyles,
|
| - uint16_t wCodePage) {
|
| +CFX_RetainPtr<CFGAS_GEFont> CFGAS_FontMgr::LoadFont(
|
| + const FX_WCHAR* pszFontFamily,
|
| + uint32_t dwFontStyles,
|
| + uint16_t wCodePage) {
|
| + CFX_RetainPtr<CFGAS_GEFont> pFont;
|
| uint32_t dwHash =
|
| FGAS_GetFontFamilyHash(pszFontFamily, dwFontStyles, wCodePage);
|
| - CFGAS_GEFont* pFont = nullptr;
|
| - if (m_FamilyFonts.Lookup((void*)(uintptr_t)dwHash, (void*&)pFont))
|
| - return pFont ? LoadFont(pFont, dwFontStyles, wCodePage) : nullptr;
|
| - FX_FONTDESCRIPTOR const* pFD =
|
| + auto it = m_FamilyFonts.find(dwHash);
|
| + if (it != m_FamilyFonts.end())
|
| + return it->second ? LoadFont(it->second, dwFontStyles, wCodePage) : nullptr;
|
| +
|
| + const FX_FONTDESCRIPTOR* pFD =
|
| FindFont(pszFontFamily, dwFontStyles, true, wCodePage);
|
| if (!pFD)
|
| pFD = FindFont(pszFontFamily, dwFontStyles, false, wCodePage);
|
| @@ -208,71 +201,66 @@ CFGAS_GEFont* CFGAS_FontMgr::LoadFont(const FX_WCHAR* pszFontFamily,
|
|
|
| if (wCodePage == 0xFFFF)
|
| wCodePage = FX_GetCodePageFromCharset(pFD->uCharSet);
|
| +
|
| pFont =
|
| CFGAS_GEFont::LoadFont(pFD->wsFontFace, dwFontStyles, wCodePage, this);
|
| if (!pFont)
|
| return nullptr;
|
|
|
| - m_Fonts.Add(pFont);
|
| - m_FamilyFonts.SetAt((void*)(uintptr_t)dwHash, (void*)pFont);
|
| + m_Fonts.push_back(pFont);
|
| + m_FamilyFonts[dwHash] = pFont;
|
| dwHash = FGAS_GetFontHashCode(wCodePage, dwFontStyles);
|
| - m_CPFonts.SetAt((void*)(uintptr_t)dwHash, (void*)pFont);
|
| + m_CPFonts[dwHash] = pFont;
|
| return LoadFont(pFont, dwFontStyles, wCodePage);
|
| }
|
|
|
| -CFGAS_GEFont* CFGAS_FontMgr::LoadFont(CFGAS_GEFont* pSrcFont,
|
| - uint32_t dwFontStyles,
|
| - uint16_t wCodePage) {
|
| - ASSERT(pSrcFont);
|
| +CFX_RetainPtr<CFGAS_GEFont> CFGAS_FontMgr::LoadFont(
|
| + const CFX_RetainPtr<CFGAS_GEFont>& pSrcFont,
|
| + uint32_t dwFontStyles,
|
| + uint16_t wCodePage) {
|
| if (pSrcFont->GetFontStyles() == dwFontStyles)
|
| - return pSrcFont->Retain();
|
| - void* buffer[3] = {pSrcFont, (void*)(uintptr_t)dwFontStyles,
|
| + return pSrcFont;
|
| +
|
| + void* buffer[3] = {pSrcFont.Get(), (void*)(uintptr_t)dwFontStyles,
|
| (void*)(uintptr_t)wCodePage};
|
| uint32_t dwHash = FX_HashCode_GetA(
|
| CFX_ByteStringC((uint8_t*)buffer, sizeof(buffer)), false);
|
| - CFGAS_GEFont* pFont = nullptr;
|
| - if (m_DeriveFonts.GetCount() > 0) {
|
| - m_DeriveFonts.Lookup((void*)(uintptr_t)dwHash, (void*&)pFont);
|
| - if (pFont)
|
| - return pFont->Retain();
|
| - }
|
| - pFont = pSrcFont->Derive(dwFontStyles, wCodePage);
|
| + auto it = m_DeriveFonts.find(dwHash);
|
| + if (it != m_DeriveFonts.end() && it->second)
|
| + return it->second;
|
| +
|
| + CFX_RetainPtr<CFGAS_GEFont> pFont = pSrcFont->Derive(dwFontStyles, wCodePage);
|
| if (!pFont)
|
| return nullptr;
|
|
|
| - m_DeriveFonts.SetAt((void*)(uintptr_t)dwHash, (void*)pFont);
|
| - int32_t index = m_Fonts.Find(pFont);
|
| - if (index < 0) {
|
| - m_Fonts.Add(pFont);
|
| - pFont->Retain();
|
| - }
|
| + m_DeriveFonts[dwHash] = pFont;
|
| + auto iter = std::find(m_Fonts.begin(), m_Fonts.end(), pFont);
|
| + if (iter == m_Fonts.end())
|
| + m_Fonts.push_back(pFont);
|
| return pFont;
|
| }
|
|
|
| -void CFGAS_FontMgr::RemoveFont(CFX_MapPtrToPtr& fontMap, CFGAS_GEFont* pFont) {
|
| - FX_POSITION pos = fontMap.GetStartPosition();
|
| - void* pKey;
|
| - void* pFind;
|
| - while (pos) {
|
| - pFind = nullptr;
|
| - fontMap.GetNextAssoc(pos, pKey, pFind);
|
| - if (pFind != (void*)pFont)
|
| - continue;
|
| - fontMap.RemoveKey(pKey);
|
| - break;
|
| +void CFGAS_FontMgr::RemoveFont(
|
| + std::map<uint32_t, CFX_RetainPtr<CFGAS_GEFont>>* pFontMap,
|
| + const CFX_RetainPtr<CFGAS_GEFont>& pFont) {
|
| + auto iter = pFontMap->begin();
|
| + while (iter != pFontMap->end()) {
|
| + auto old_iter = iter++;
|
| + if (old_iter->second == pFont)
|
| + pFontMap->erase(old_iter);
|
| }
|
| }
|
|
|
| -void CFGAS_FontMgr::RemoveFont(CFGAS_GEFont* pFont) {
|
| - RemoveFont(m_CPFonts, pFont);
|
| - RemoveFont(m_FamilyFonts, pFont);
|
| - RemoveFont(m_UnicodeFonts, pFont);
|
| - RemoveFont(m_BufferFonts, pFont);
|
| - RemoveFont(m_StreamFonts, pFont);
|
| - RemoveFont(m_DeriveFonts, pFont);
|
| - int32_t iFind = m_Fonts.Find(pFont);
|
| - if (iFind > -1)
|
| - m_Fonts.RemoveAt(iFind, 1);
|
| +void CFGAS_FontMgr::RemoveFont(const CFX_RetainPtr<CFGAS_GEFont>& pFont) {
|
| + RemoveFont(&m_CPFonts, pFont);
|
| + RemoveFont(&m_FamilyFonts, pFont);
|
| + RemoveFont(&m_UnicodeFonts, pFont);
|
| + RemoveFont(&m_BufferFonts, pFont);
|
| + RemoveFont(&m_StreamFonts, pFont);
|
| + RemoveFont(&m_DeriveFonts, pFont);
|
| + auto it = std::find(m_Fonts.begin(), m_Fonts.end(), pFont);
|
| + if (it != m_Fonts.end())
|
| + m_Fonts.erase(it);
|
| }
|
|
|
| FX_FONTDESCRIPTOR const* CFGAS_FontMgr::FindFont(const FX_WCHAR* pszFontFamily,
|
| @@ -594,16 +582,7 @@ CFGAS_FontMgr::~CFGAS_FontMgr() {
|
| m_Hash2CandidateList.GetNextAssoc(pos, dwHash, pDescs);
|
| delete pDescs;
|
| }
|
| - pos = m_Hash2Fonts.GetStartPosition();
|
| - while (pos) {
|
| - uint32_t dwHash;
|
| - CFX_ArrayTemplate<CFGAS_GEFont*>* pFonts;
|
| - m_Hash2Fonts.GetNextAssoc(pos, dwHash, pFonts);
|
| - for (int32_t i = 0; i < pFonts->GetSize(); i++)
|
| - delete pFonts->GetAt(i);
|
| - delete pFonts;
|
| - }
|
| - m_Hash2Fonts.RemoveAll();
|
| + m_Hash2Fonts.clear();
|
| }
|
|
|
| bool CFGAS_FontMgr::EnumFontsFromFontMapper() {
|
| @@ -644,31 +623,28 @@ bool CFGAS_FontMgr::EnumFontsFromFiles() {
|
| }
|
|
|
| bool CFGAS_FontMgr::EnumFonts() {
|
| - if (EnumFontsFromFontMapper())
|
| - return true;
|
| - return EnumFontsFromFiles();
|
| + return EnumFontsFromFontMapper() || EnumFontsFromFiles();
|
| }
|
|
|
| -CFGAS_GEFont* CFGAS_FontMgr::GetFontByCodePage(uint16_t wCodePage,
|
| - uint32_t dwFontStyles,
|
| - const FX_WCHAR* pszFontFamily) {
|
| +CFX_RetainPtr<CFGAS_GEFont> CFGAS_FontMgr::LoadFont(
|
| + const FX_WCHAR* pszFontFamily,
|
| + uint32_t dwFontStyles,
|
| + uint16_t wCodePage) {
|
| + return GetFontByCodePage(wCodePage, dwFontStyles, pszFontFamily);
|
| +}
|
| +
|
| +CFX_RetainPtr<CFGAS_GEFont> CFGAS_FontMgr::GetFontByCodePage(
|
| + uint16_t wCodePage,
|
| + uint32_t dwFontStyles,
|
| + const FX_WCHAR* pszFontFamily) {
|
| CFX_ByteString bsHash;
|
| bsHash.Format("%d, %d", wCodePage, dwFontStyles);
|
| bsHash += CFX_WideString(pszFontFamily).UTF8Encode();
|
| uint32_t dwHash = FX_HashCode_GetA(bsHash.AsStringC(), false);
|
| - CFX_ArrayTemplate<CFGAS_GEFont*>* pFonts = nullptr;
|
| - if (m_Hash2Fonts.Lookup(dwHash, pFonts)) {
|
| - if (!pFonts)
|
| - return nullptr;
|
| -
|
| - if (pFonts->GetSize() != 0)
|
| - return pFonts->GetAt(0)->Retain();
|
| - }
|
| + std::vector<CFX_RetainPtr<CFGAS_GEFont>>* pFontArray = &m_Hash2Fonts[dwHash];
|
| + if (!pFontArray->empty())
|
| + return (*pFontArray)[0];
|
|
|
| - if (!pFonts)
|
| - pFonts = new CFX_ArrayTemplate<CFGAS_GEFont*>;
|
| -
|
| - m_Hash2Fonts.SetAt(dwHash, pFonts);
|
| CFX_FontDescriptorInfos* sortedFonts = nullptr;
|
| if (!m_Hash2CandidateList.Lookup(dwHash, sortedFonts)) {
|
| sortedFonts = new CFX_FontDescriptorInfos;
|
| @@ -680,21 +656,23 @@ CFGAS_GEFont* CFGAS_FontMgr::GetFontByCodePage(uint16_t wCodePage,
|
| return nullptr;
|
|
|
| CFX_FontDescriptor* pDesc = sortedFonts->GetAt(0).pFont;
|
| - CFGAS_GEFont* pFont =
|
| + CFX_RetainPtr<CFGAS_GEFont> pFont =
|
| LoadFont(pDesc->m_wsFaceName, pDesc->m_nFaceIndex, nullptr);
|
| - if (pFont)
|
| - pFont->SetLogicalFontStyle(dwFontStyles);
|
| + if (!pFont)
|
| + return nullptr;
|
|
|
| - pFonts->Add(pFont);
|
| + pFont->SetLogicalFontStyle(dwFontStyles);
|
| + pFontArray->push_back(pFont);
|
| return pFont;
|
| }
|
|
|
| -CFGAS_GEFont* CFGAS_FontMgr::GetFontByUnicode(FX_WCHAR wUnicode,
|
| - uint32_t dwFontStyles,
|
| - const FX_WCHAR* pszFontFamily) {
|
| - CFGAS_GEFont* pFont = nullptr;
|
| - if (m_FailedUnicodes2Nullptr.Lookup(wUnicode, pFont))
|
| +CFX_RetainPtr<CFGAS_GEFont> CFGAS_FontMgr::GetFontByUnicode(
|
| + FX_WCHAR wUnicode,
|
| + uint32_t dwFontStyles,
|
| + const FX_WCHAR* pszFontFamily) {
|
| + if (pdfium::ContainsKey(m_FailedUnicodesSet, wUnicode))
|
| return nullptr;
|
| +
|
| const FGAS_FONTUSB* x = FGAS_GetUnicodeBitField(wUnicode);
|
| uint16_t wCodePage = x ? x->wCodePage : 0xFFFF;
|
| uint16_t wBitField = x ? x->wBitField : 0x03E7;
|
| @@ -705,19 +683,11 @@ CFGAS_GEFont* CFGAS_FontMgr::GetFontByUnicode(FX_WCHAR wUnicode,
|
| bsHash.Format("%d, %d", wCodePage, dwFontStyles);
|
| bsHash += CFX_WideString(pszFontFamily).UTF8Encode();
|
| uint32_t dwHash = FX_HashCode_GetA(bsHash.AsStringC(), false);
|
| - CFX_ArrayTemplate<CFGAS_GEFont*>* pFonts = nullptr;
|
| - if (m_Hash2Fonts.Lookup(dwHash, pFonts)) {
|
| - if (!pFonts)
|
| - return nullptr;
|
| -
|
| - for (int32_t i = 0; i < pFonts->GetSize(); ++i) {
|
| - if (VerifyUnicode(pFonts->GetAt(i), wUnicode))
|
| - return pFonts->GetAt(i)->Retain();
|
| - }
|
| + std::vector<CFX_RetainPtr<CFGAS_GEFont>>* pFonts = &m_Hash2Fonts[dwHash];
|
| + for (size_t i = 0; i < pFonts->size(); ++i) {
|
| + if (VerifyUnicode((*pFonts)[i], wUnicode))
|
| + return (*pFonts)[i];
|
| }
|
| - if (!pFonts)
|
| - pFonts = new CFX_ArrayTemplate<CFGAS_GEFont*>;
|
| - m_Hash2Fonts.SetAt(dwHash, pFonts);
|
| CFX_FontDescriptorInfos* sortedFonts = nullptr;
|
| if (!m_Hash2CandidateList.Lookup(dwHash, sortedFonts)) {
|
| sortedFonts = new CFX_FontDescriptorInfos;
|
| @@ -729,15 +699,16 @@ CFGAS_GEFont* CFGAS_FontMgr::GetFontByUnicode(FX_WCHAR wUnicode,
|
| CFX_FontDescriptor* pDesc = sortedFonts->GetAt(i).pFont;
|
| if (!VerifyUnicode(pDesc, wUnicode))
|
| continue;
|
| - pFont = LoadFont(pDesc->m_wsFaceName, pDesc->m_nFaceIndex, nullptr);
|
| + CFX_RetainPtr<CFGAS_GEFont> pFont =
|
| + LoadFont(pDesc->m_wsFaceName, pDesc->m_nFaceIndex, nullptr);
|
| if (!pFont)
|
| continue;
|
| pFont->SetLogicalFontStyle(dwFontStyles);
|
| - pFonts->Add(pFont);
|
| + pFonts->push_back(pFont);
|
| return pFont;
|
| }
|
| if (!pszFontFamily)
|
| - m_FailedUnicodes2Nullptr.SetAt(wUnicode, nullptr);
|
| + m_FailedUnicodesSet.insert(wUnicode);
|
| return nullptr;
|
| }
|
|
|
| @@ -761,7 +732,8 @@ bool CFGAS_FontMgr::VerifyUnicode(CFX_FontDescriptor* pDesc,
|
| return !retCharmap && retIndex;
|
| }
|
|
|
| -bool CFGAS_FontMgr::VerifyUnicode(CFGAS_GEFont* pFont, FX_WCHAR wcUnicode) {
|
| +bool CFGAS_FontMgr::VerifyUnicode(const CFX_RetainPtr<CFGAS_GEFont>& pFont,
|
| + FX_WCHAR wcUnicode) {
|
| if (!pFont)
|
| return false;
|
|
|
| @@ -777,9 +749,10 @@ bool CFGAS_FontMgr::VerifyUnicode(CFGAS_GEFont* pFont, FX_WCHAR wcUnicode) {
|
| return true;
|
| }
|
|
|
| -CFGAS_GEFont* CFGAS_FontMgr::LoadFont(const CFX_WideString& wsFaceName,
|
| - int32_t iFaceIndex,
|
| - int32_t* pFaceCount) {
|
| +CFX_RetainPtr<CFGAS_GEFont> CFGAS_FontMgr::LoadFont(
|
| + const CFX_WideString& wsFaceName,
|
| + int32_t iFaceIndex,
|
| + int32_t* pFaceCount) {
|
| CFX_FontMgr* pFontMgr = CFX_GEModule::Get()->GetFontMgr();
|
| CFX_FontMapper* pFontMapper = pFontMgr->GetBuiltinMapper();
|
| if (!pFontMapper)
|
| @@ -798,14 +771,14 @@ CFGAS_GEFont* CFGAS_FontMgr::LoadFont(const CFX_WideString& wsFaceName,
|
| if (!pInternalFont->LoadFile(pFontStream, iFaceIndex))
|
| return nullptr;
|
|
|
| - CFGAS_GEFont* pFont = CFGAS_GEFont::LoadFont(std::move(pInternalFont), this);
|
| + CFX_RetainPtr<CFGAS_GEFont> pFont =
|
| + CFGAS_GEFont::LoadFont(std::move(pInternalFont), this);
|
| if (!pFont)
|
| return nullptr;
|
|
|
| m_IFXFont2FileRead[pFont] = pFontStream;
|
| if (pFaceCount)
|
| *pFaceCount = pFont->GetDevFont()->GetFace()->num_faces;
|
| -
|
| return pFont;
|
| }
|
|
|
| @@ -1010,26 +983,24 @@ int32_t CFGAS_FontMgr::CalcPenalty(CFX_FontDescriptor* pInstalled,
|
| return nPenalty;
|
| }
|
|
|
| -void CFGAS_FontMgr::RemoveFont(CFGAS_GEFont* pEFont) {
|
| +void CFGAS_FontMgr::RemoveFont(const CFX_RetainPtr<CFGAS_GEFont>& pEFont) {
|
| if (!pEFont)
|
| return;
|
|
|
| m_IFXFont2FileRead.erase(pEFont);
|
|
|
| - FX_POSITION pos;
|
| - pos = m_Hash2Fonts.GetStartPosition();
|
| - while (pos) {
|
| - uint32_t dwHash;
|
| - CFX_ArrayTemplate<CFGAS_GEFont*>* pFonts;
|
| - m_Hash2Fonts.GetNextAssoc(pos, dwHash, pFonts);
|
| - if (pFonts) {
|
| - for (int32_t i = 0; i < pFonts->GetSize(); i++) {
|
| - if (pFonts->GetAt(i) == pEFont)
|
| - pFonts->SetAt(i, nullptr);
|
| - }
|
| - } else {
|
| - m_Hash2Fonts.RemoveKey(dwHash);
|
| + auto iter = m_Hash2Fonts.begin();
|
| + while (iter != m_Hash2Fonts.end()) {
|
| + auto old_iter = iter++;
|
| + bool all_empty = true;
|
| + for (size_t i = 0; i < old_iter->second.size(); i++) {
|
| + if (old_iter->second[i] == pEFont)
|
| + old_iter->second[i].Reset();
|
| + else if (old_iter->second[i])
|
| + all_empty = false;
|
| }
|
| + if (all_empty)
|
| + m_Hash2Fonts.erase(old_iter);
|
| }
|
| }
|
|
|
|
|