| 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 af0a9efdaadc71e0c0cfa3127adcc9eaec471cf9..f531e2ea0e48208d49a98183559ffa8ba6007f76 100644
|
| --- a/core/src/fxge/ge/fx_ge_fontmap.cpp
|
| +++ b/core/src/fxge/ge/fx_ge_fontmap.cpp
|
| @@ -58,10 +58,18 @@ CTTFontDesc::~CTTFontDesc() {
|
| }
|
| FX_Free(m_pFontData);
|
| }
|
| +#ifndef PDF_ENABLE_XFA
|
| FX_BOOL CTTFontDesc::ReleaseFace(FXFT_Face face) {
|
| +#else
|
| +int32_t CTTFontDesc::ReleaseFace(FXFT_Face face) {
|
| +#endif
|
| if (m_Type == 1) {
|
| if (m_SingleFace.m_pFace != face) {
|
| +#ifndef PDF_ENABLE_XFA
|
| return FALSE;
|
| +#else
|
| + return -1;
|
| +#endif
|
| }
|
| } else if (m_Type == 2) {
|
| int i;
|
| @@ -70,15 +78,27 @@ FX_BOOL CTTFontDesc::ReleaseFace(FXFT_Face face) {
|
| break;
|
| }
|
| if (i == 16) {
|
| +#ifndef PDF_ENABLE_XFA
|
| return FALSE;
|
| +#else
|
| + return -1;
|
| +#endif
|
| }
|
| }
|
| m_RefCount--;
|
| if (m_RefCount) {
|
| +#ifndef PDF_ENABLE_XFA
|
| return FALSE;
|
| +#else
|
| + return m_RefCount;
|
| +#endif
|
| }
|
| delete this;
|
| +#ifndef PDF_ENABLE_XFA
|
| return TRUE;
|
| +#else
|
| + return 0;
|
| +#endif
|
| }
|
|
|
| CFX_FontMgr::CFX_FontMgr() : m_FTLibrary(nullptr) {
|
| @@ -357,13 +377,31 @@ void CFX_FontMgr::ReleaseFace(FXFT_Face face) {
|
| if (!face) {
|
| return;
|
| }
|
| +#ifdef PDF_ENABLE_XFA
|
| + FX_BOOL bNeedFaceDone = TRUE;
|
| +#endif
|
| auto it = m_FaceMap.begin();
|
| while (it != m_FaceMap.end()) {
|
| auto temp = it++;
|
| +#ifndef PDF_ENABLE_XFA
|
| if (temp->second->ReleaseFace(face)) {
|
| +#else
|
| + int nRet = temp->second->ReleaseFace(face);
|
| + if (nRet == 0) {
|
| +#endif
|
| m_FaceMap.erase(temp);
|
| +#ifdef PDF_ENABLE_XFA
|
| + bNeedFaceDone = FALSE;
|
| + } else if (nRet > 0) {
|
| + bNeedFaceDone = FALSE;
|
| +#endif
|
| }
|
| }
|
| +#ifdef PDF_ENABLE_XFA
|
| + if (bNeedFaceDone && !m_pBuiltinMapper->IsBuiltinFace(face)) {
|
| + FXFT_Done_Face(face);
|
| + }
|
| +#endif
|
| }
|
| const FoxitFonts g_FoxitFonts[14] = {
|
| {g_FoxitFixedFontData, 17597},
|
| @@ -413,10 +451,19 @@ CFX_FontMapper::CFX_FontMapper(CFX_FontMgr* mgr)
|
| FXSYS_memset(m_FoxitFaces, 0, sizeof(m_FoxitFaces));
|
| }
|
| CFX_FontMapper::~CFX_FontMapper() {
|
| +#ifndef PDF_ENABLE_XFA
|
| for (size_t i = 0; i < FX_ArraySize(m_FoxitFaces); ++i) {
|
| if (m_FoxitFaces[i])
|
| +#else
|
| + for (int i = 0; i < 14; i++)
|
| + if (m_FoxitFaces[i]) {
|
| +#endif
|
| FXFT_Done_Face(m_FoxitFaces[i]);
|
| +#ifndef PDF_ENABLE_XFA
|
| }
|
| +#else
|
| + }
|
| +#endif
|
| if (m_MMFaces[0]) {
|
| FXFT_Done_Face(m_MMFaces[0]);
|
| }
|
| @@ -1055,6 +1102,11 @@ FXFT_Face CFX_FontMapper::FindSubstFont(const CFX_ByteString& name,
|
| pSubstFont->m_SubstFlags |= FXFONT_SUBST_EXACT;
|
| }
|
| if (hFont == NULL) {
|
| +#ifdef PDF_ENABLE_XFA
|
| + if (flags & FXFONT_EXACTMATCH) {
|
| + return NULL;
|
| + }
|
| +#endif
|
| if (bCJK) {
|
| if (italic_angle != 0) {
|
| bItalic = TRUE;
|
| @@ -1180,6 +1232,90 @@ FXFT_Face CFX_FontMapper::FindSubstFont(const CFX_ByteString& name,
|
| m_pFontInfo->DeleteFont(hFont);
|
| return face;
|
| }
|
| +#ifdef PDF_ENABLE_XFA
|
| +FXFT_Face CFX_FontMapper::FindSubstFontByUnicode(FX_DWORD dwUnicode,
|
| + FX_DWORD flags,
|
| + int weight,
|
| + int italic_angle) {
|
| + if (m_pFontInfo == NULL) {
|
| + return NULL;
|
| + }
|
| + FX_BOOL bItalic = (flags & FXFONT_ITALIC) != 0;
|
| + int PitchFamily = 0;
|
| + if (flags & FXFONT_SERIF) {
|
| + PitchFamily |= FXFONT_FF_ROMAN;
|
| + }
|
| + if (flags & FXFONT_SCRIPT) {
|
| + PitchFamily |= FXFONT_FF_SCRIPT;
|
| + }
|
| + if (flags & FXFONT_FIXED_PITCH) {
|
| + PitchFamily |= FXFONT_FF_FIXEDPITCH;
|
| + }
|
| + void* hFont =
|
| + m_pFontInfo->MapFontByUnicode(dwUnicode, weight, bItalic, PitchFamily);
|
| + if (hFont == NULL) {
|
| + return NULL;
|
| + }
|
| + FX_DWORD ttc_size = m_pFontInfo->GetFontData(hFont, 0x74746366, NULL, 0);
|
| + FX_DWORD font_size = m_pFontInfo->GetFontData(hFont, 0, NULL, 0);
|
| + if (font_size == 0 && ttc_size == 0) {
|
| + m_pFontInfo->DeleteFont(hFont);
|
| + return NULL;
|
| + }
|
| + FXFT_Face face = NULL;
|
| + if (ttc_size) {
|
| + uint8_t temp[1024];
|
| + m_pFontInfo->GetFontData(hFont, 0x74746366, temp, 1024);
|
| + FX_DWORD checksum = 0;
|
| + for (int i = 0; i < 256; i++) {
|
| + checksum += ((FX_DWORD*)temp)[i];
|
| + }
|
| + uint8_t* pFontData;
|
| + face = m_pFontMgr->GetCachedTTCFace(ttc_size, checksum,
|
| + ttc_size - font_size, pFontData);
|
| + if (face == NULL) {
|
| + pFontData = FX_Alloc(uint8_t, ttc_size);
|
| + if (pFontData) {
|
| + m_pFontInfo->GetFontData(hFont, 0x74746366, pFontData, ttc_size);
|
| + face = m_pFontMgr->AddCachedTTCFace(ttc_size, checksum, pFontData,
|
| + ttc_size, ttc_size - font_size);
|
| + }
|
| + }
|
| + } else {
|
| + CFX_ByteString SubstName;
|
| + m_pFontInfo->GetFaceName(hFont, SubstName);
|
| + uint8_t* pFontData;
|
| + face = m_pFontMgr->GetCachedFace(SubstName, weight, bItalic, pFontData);
|
| + if (face == NULL) {
|
| + pFontData = FX_Alloc(uint8_t, font_size);
|
| + if (!pFontData) {
|
| + m_pFontInfo->DeleteFont(hFont);
|
| + return NULL;
|
| + }
|
| + m_pFontInfo->GetFontData(hFont, 0, pFontData, font_size);
|
| + face = m_pFontMgr->AddCachedFace(SubstName, weight, bItalic, pFontData,
|
| + font_size,
|
| + m_pFontInfo->GetFaceIndex(hFont));
|
| + }
|
| + }
|
| + m_pFontInfo->DeleteFont(hFont);
|
| + return face;
|
| +}
|
| +
|
| +FX_BOOL CFX_FontMapper::IsBuiltinFace(const FXFT_Face face) const {
|
| + for (int i = 0; i < MM_FACE_COUNT; ++i) {
|
| + if (m_MMFaces[i] == face) {
|
| + return TRUE;
|
| + }
|
| + }
|
| + for (int i = 0; i < FOXIT_FACE_COUNT; ++i) {
|
| + if (m_FoxitFaces[i] == face) {
|
| + return TRUE;
|
| + }
|
| + }
|
| + return FALSE;
|
| +}
|
| +#endif
|
| extern "C" {
|
| unsigned long _FTStreamRead(FXFT_Stream stream,
|
| unsigned long offset,
|
| @@ -1474,6 +1610,14 @@ void* CFX_FolderFontInfo::MapFont(int weight,
|
| int& iExact) {
|
| return NULL;
|
| }
|
| +#ifdef PDF_ENABLE_XFA
|
| +void* CFX_FolderFontInfo::MapFontByUnicode(FX_DWORD dwUnicode,
|
| + int weight,
|
| + FX_BOOL bItalic,
|
| + int pitch_family) {
|
| + return NULL;
|
| +}
|
| +#endif
|
| void* CFX_FolderFontInfo::GetFont(const FX_CHAR* face) {
|
| auto it = m_FontList.find(face);
|
| return it != m_FontList.end() ? it->second : nullptr;
|
|
|