| Index: xfa/fxfa/app/xfa_fontmgr.cpp
|
| diff --git a/xfa/fxfa/app/xfa_fontmgr.cpp b/xfa/fxfa/app/xfa_fontmgr.cpp
|
| index 3a478038f648a2121e0d29a13870077811a12f4b..be5081d857b5d0283eff3cf960d9481189f97f39 100644
|
| --- a/xfa/fxfa/app/xfa_fontmgr.cpp
|
| +++ b/xfa/fxfa/app/xfa_fontmgr.cpp
|
| @@ -7,6 +7,7 @@
|
| #include "xfa/fxfa/include/xfa_fontmgr.h"
|
|
|
| #include <algorithm>
|
| +#include <memory>
|
| #include <utility>
|
|
|
| #include "core/fpdfapi/fpdf_font/include/cpdf_font.h"
|
| @@ -16,8 +17,17 @@
|
| #include "xfa/fxfa/include/xfa_ffapp.h"
|
| #include "xfa/fxfa/include/xfa_ffdoc.h"
|
|
|
| +namespace {
|
| +
|
| +// The 5 names per entry are: PsName, Normal, Bold, Italic, BoldItalic.
|
| +const char* const g_XFAPDFFontName[][5] = {
|
| + {"Adobe PI Std", "AdobePIStd", "AdobePIStd", "AdobePIStd", "AdobePIStd"},
|
| + {"Myriad Pro Light", "MyriadPro-Light", "MyriadPro-Semibold",
|
| + "MyriadPro-LightIt", "MyriadPro-SemiboldIt"},
|
| +};
|
| +
|
| #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
|
| -static const XFA_FONTINFO g_XFAFontsMap[] = {
|
| +const XFA_FONTINFO g_XFAFontsMap[] = {
|
| {0x01d5d33e, L"SimSun", L"Arial", 0, 936},
|
| {0x01e4f102, L"YouYuan", L"Arial", 1, 936},
|
| {0x030549dc, L"LiSu", L"Arial", 1, 936},
|
| @@ -265,7 +275,7 @@ static const XFA_FONTINFO g_XFAFontsMap[] = {
|
| {0xfef135f8, L"AdobeHeitiStd-Regular", L"Batang,Century,Dotum", 0, 936},
|
| };
|
| #elif _FXM_PLATFORM_ == _FXM_PLATFORM_LINUX_
|
| -static const XFA_FONTINFO g_XFAFontsMap[] = {
|
| +const XFA_FONTINFO g_XFAFontsMap[] = {
|
| {0x01d5d33e, L"SimSun",
|
| L"WenQuanYi Zen Hei Mono,AR PL UMing CN,AR PL UMing HK,AR PL UMing TW,AR "
|
| L"PL UMing TW MBE",
|
| @@ -854,7 +864,7 @@ static const XFA_FONTINFO g_XFAFontsMap[] = {
|
| 0, 936},
|
| };
|
| #elif _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
|
| -static const XFA_FONTINFO g_XFAFontsMap[] = {
|
| +const XFA_FONTINFO g_XFAFontsMap[] = {
|
| {0x01d5d33e, L"SimSun", L"STHeiti,Heiti TC,STFangsong", 0, 936},
|
| {0x01e4f102, L"YouYuan", L"STHeiti,Heiti TC,STFangsong", 1, 936},
|
| {0x030549dc, L"LiSu", L"STHeiti,Heiti TC,STFangsong", 1, 936},
|
| @@ -1255,7 +1265,7 @@ static const XFA_FONTINFO g_XFAFontsMap[] = {
|
| {0xfef135f8, L"AdobeHeitiStd-Regular", L"Heiti TC,STHeiti", 0, 936},
|
| };
|
| #elif _FXM_PLATFORM_ == _FXM_PLATFORM_ANDROID_
|
| -static const XFA_FONTINFO g_XFAFontsMap[] = {
|
| +const XFA_FONTINFO g_XFAFontsMap[] = {
|
| {0x01d5d33e, L"SimSun", L"Droid Sans Fallback", 0, 936},
|
| {0x01e4f102, L"YouYuan", L"Droid Sans Fallback", 1, 936},
|
| {0x030549dc, L"LiSu", L"Droid Sans Fallback", 1, 936},
|
| @@ -1693,51 +1703,40 @@ static const XFA_FONTINFO g_XFAFontsMap[] = {
|
| {0xfef135f8, L"AdobeHeitiStd-Regular", L"Droid Sans Fallback", 0, 936},
|
| };
|
| #endif
|
| -void XFA_LocalFontNameToEnglishName(const CFX_WideStringC& wsLocalName,
|
| - CFX_WideString& wsEnglishName) {
|
| - wsEnglishName = wsLocalName;
|
| +
|
| +CFX_WideString XFA_LocalFontNameToEnglishName(
|
| + const CFX_WideStringC& wsLocalName) {
|
| uint32_t dwLocalNameHash = FX_HashCode_GetW(wsLocalName, true);
|
| - int32_t iStart = 0;
|
| - int32_t iEnd = sizeof(g_XFAFontsMap) / sizeof(XFA_FONTINFO) - 1;
|
| - int32_t iMid = 0;
|
| - do {
|
| - iMid = (iStart + iEnd) / 2;
|
| - uint32_t dwFontNameHash = g_XFAFontsMap[iMid].dwFontNameHash;
|
| - if (dwFontNameHash == dwLocalNameHash) {
|
| - wsEnglishName = g_XFAFontsMap[iMid].pPsName;
|
| - break;
|
| - } else if (dwFontNameHash < dwLocalNameHash) {
|
| - iStart = iMid + 1;
|
| - } else {
|
| - iEnd = iMid - 1;
|
| - }
|
| - } while (iEnd >= iStart);
|
| + const XFA_FONTINFO* pEnd = g_XFAFontsMap + FX_ArraySize(g_XFAFontsMap);
|
| + const XFA_FONTINFO* pFontInfo =
|
| + std::lower_bound(g_XFAFontsMap, pEnd, dwLocalNameHash,
|
| + [](const XFA_FONTINFO& entry, uint32_t hash) {
|
| + return entry.dwFontNameHash < hash;
|
| + });
|
| + if (pFontInfo < pEnd && pFontInfo->dwFontNameHash == dwLocalNameHash)
|
| + return pFontInfo->pPsName;
|
| + return CFX_WideString(wsLocalName);
|
| }
|
| +
|
| const XFA_FONTINFO* XFA_GetFontINFOByFontName(
|
| const CFX_WideStringC& wsFontName) {
|
| CFX_WideString wsFontNameTemp(wsFontName);
|
| wsFontNameTemp.Remove(L' ');
|
| uint32_t dwCurFontNameHash =
|
| FX_HashCode_GetW(wsFontNameTemp.AsStringC(), true);
|
| - int32_t iStart = 0;
|
| - int32_t iEnd = sizeof(g_XFAFontsMap) / sizeof(XFA_FONTINFO) - 1;
|
| - int32_t iMid = 0;
|
| - const XFA_FONTINFO* pFontInfo = nullptr;
|
| - do {
|
| - iMid = (iStart + iEnd) / 2;
|
| - uint32_t dwFontNameHash = g_XFAFontsMap[iMid].dwFontNameHash;
|
| - if (dwFontNameHash == dwCurFontNameHash) {
|
| - pFontInfo = &g_XFAFontsMap[iMid];
|
| - break;
|
| - } else if (dwFontNameHash < dwCurFontNameHash) {
|
| - iStart = iMid + 1;
|
| - } else {
|
| - iEnd = iMid - 1;
|
| - }
|
| - } while (iEnd >= iStart);
|
| - return pFontInfo;
|
| + const XFA_FONTINFO* pEnd = g_XFAFontsMap + FX_ArraySize(g_XFAFontsMap);
|
| + const XFA_FONTINFO* pFontInfo =
|
| + std::lower_bound(g_XFAFontsMap, pEnd, dwCurFontNameHash,
|
| + [](const XFA_FONTINFO& entry, uint32_t hash) {
|
| + return entry.dwFontNameHash < hash;
|
| + });
|
| + if (pFontInfo < pEnd && pFontInfo->dwFontNameHash == dwCurFontNameHash)
|
| + return pFontInfo;
|
| + return nullptr;
|
| }
|
|
|
| +} // namespace
|
| +
|
| CXFA_DefFontMgr::CXFA_DefFontMgr() {}
|
|
|
| CXFA_DefFontMgr::~CXFA_DefFontMgr() {
|
| @@ -1798,8 +1797,8 @@ CFGAS_GEFont* CXFA_DefFontMgr::GetDefaultFont(
|
| CFGAS_GEFont* pFont =
|
| pFDEFontMgr->LoadFont(L"Arial Narrow", dwFontStyles, wCodePage);
|
| if (!pFont) {
|
| - pFont = pFDEFontMgr->LoadFont((const FX_WCHAR*)nullptr, dwFontStyles,
|
| - wCodePage);
|
| + pFont = pFDEFontMgr->LoadFont(static_cast<const FX_WCHAR*>(nullptr),
|
| + dwFontStyles, wCodePage);
|
| }
|
|
|
| ASSERT(pFont);
|
| @@ -1807,32 +1806,21 @@ CFGAS_GEFont* CXFA_DefFontMgr::GetDefaultFont(
|
| m_CacheFonts.Add(pFont);
|
| return pFont;
|
| }
|
| -struct XFA_PDFFONTNAME {
|
| - const FX_CHAR* lpPsName;
|
| - const FX_CHAR* lpNormal;
|
| - const FX_CHAR* lpBold;
|
| - const FX_CHAR* lpItalic;
|
| - const FX_CHAR* lpBoldItalic;
|
| -};
|
| -const XFA_PDFFONTNAME g_XFAPDFFontName[] = {
|
| - {"Adobe PI Std", "AdobePIStd", "AdobePIStd", "AdobePIStd", "AdobePIStd"},
|
| - {"Myriad Pro Light", "MyriadPro-Light", "MyriadPro-Semibold",
|
| - "MyriadPro-LightIt", "MyriadPro-SemiboldIt"},
|
| -};
|
| -CXFA_PDFFontMgr::CXFA_PDFFontMgr(CXFA_FFDoc* pDoc) {
|
| - m_pDoc = pDoc;
|
| -}
|
| +
|
| +CXFA_PDFFontMgr::CXFA_PDFFontMgr(CXFA_FFDoc* pDoc) : m_pDoc(pDoc) {}
|
| +
|
| CXFA_PDFFontMgr::~CXFA_PDFFontMgr() {
|
| for (const auto& pair : m_FontMap) {
|
| if (pair.second)
|
| pair.second->Release();
|
| }
|
| }
|
| -CFGAS_GEFont* CXFA_PDFFontMgr::FindFont(CFX_ByteString strPsName,
|
| - FX_BOOL bBold,
|
| - FX_BOOL bItalic,
|
| +
|
| +CFGAS_GEFont* CXFA_PDFFontMgr::FindFont(const CFX_ByteString& strPsName,
|
| + bool bBold,
|
| + bool bItalic,
|
| CPDF_Font** pDstPDFFont,
|
| - FX_BOOL bStrictMatch) {
|
| + bool bStrictMatch) {
|
| CPDF_Document* pDoc = m_pDoc->GetPDFDoc();
|
| if (!pDoc) {
|
| return nullptr;
|
| @@ -1846,12 +1834,13 @@ CFGAS_GEFont* CXFA_PDFFontMgr::FindFont(CFX_ByteString strPsName,
|
| if (!pFontSetDict) {
|
| return nullptr;
|
| }
|
| - strPsName.Remove(' ');
|
| + CFX_ByteString name = strPsName;
|
| + name.Remove(' ');
|
| IFGAS_FontMgr* pFDEFontMgr = m_pDoc->GetApp()->GetFDEFontMgr();
|
| for (const auto& it : *pFontSetDict) {
|
| const CFX_ByteString& key = it.first;
|
| CPDF_Object* pObj = it.second;
|
| - if (!PsNameMatchDRFontName(strPsName.AsStringC(), bBold, bItalic, key,
|
| + if (!PsNameMatchDRFontName(name.AsStringC(), bBold, bItalic, key,
|
| bStrictMatch)) {
|
| continue;
|
| }
|
| @@ -1875,7 +1864,7 @@ CFGAS_GEFont* CXFA_PDFFontMgr::FindFont(CFX_ByteString strPsName,
|
| CFGAS_GEFont* CXFA_PDFFontMgr::GetFont(const CFX_WideStringC& wsFontFamily,
|
| uint32_t dwFontStyles,
|
| CPDF_Font** pPDFFont,
|
| - FX_BOOL bStrictMatch) {
|
| + bool bStrictMatch) {
|
| uint32_t dwHashCode = FX_HashCode_GetW(wsFontFamily, false);
|
| CFX_ByteString strKey;
|
| strKey.Format("%u%u", dwHashCode, dwFontStyles);
|
| @@ -1884,8 +1873,8 @@ CFGAS_GEFont* CXFA_PDFFontMgr::GetFont(const CFX_WideStringC& wsFontFamily,
|
| return it->second;
|
| CFX_ByteString bsPsName =
|
| CFX_ByteString::FromUnicode(CFX_WideString(wsFontFamily));
|
| - FX_BOOL bBold = (dwFontStyles & FX_FONTSTYLE_Bold) == FX_FONTSTYLE_Bold;
|
| - FX_BOOL bItalic = (dwFontStyles & FX_FONTSTYLE_Italic) == FX_FONTSTYLE_Italic;
|
| + bool bBold = (dwFontStyles & FX_FONTSTYLE_Bold) == FX_FONTSTYLE_Bold;
|
| + bool bItalic = (dwFontStyles & FX_FONTSTYLE_Italic) == FX_FONTSTYLE_Italic;
|
| CFX_ByteString strFontName = PsNameToFontName(bsPsName, bBold, bItalic);
|
| CFGAS_GEFont* pFont =
|
| FindFont(strFontName, bBold, bItalic, pPDFFont, bStrictMatch);
|
| @@ -1896,46 +1885,48 @@ CFGAS_GEFont* CXFA_PDFFontMgr::GetFont(const CFX_WideStringC& wsFontFamily,
|
|
|
| CFX_ByteString CXFA_PDFFontMgr::PsNameToFontName(
|
| const CFX_ByteString& strPsName,
|
| - FX_BOOL bBold,
|
| - FX_BOOL bItalic) {
|
| - int32_t nCount = sizeof(g_XFAPDFFontName) / sizeof(XFA_PDFFONTNAME);
|
| - for (int32_t i = 0; i < nCount; i++) {
|
| - if (strPsName == g_XFAPDFFontName[i].lpPsName) {
|
| - int32_t index = 1 + ((bItalic << 1) | bBold);
|
| - return *(&g_XFAPDFFontName[i].lpPsName + index);
|
| + bool bBold,
|
| + bool bItalic) {
|
| + for (size_t i = 0; i < FX_ArraySize(g_XFAPDFFontName); ++i) {
|
| + if (strPsName == g_XFAPDFFontName[i][0]) {
|
| + size_t index = 1;
|
| + if (bBold)
|
| + ++index;
|
| + if (bItalic)
|
| + index += 2;
|
| + return g_XFAPDFFontName[i][index];
|
| }
|
| }
|
| return strPsName;
|
| }
|
|
|
| -FX_BOOL CXFA_PDFFontMgr::PsNameMatchDRFontName(
|
| - const CFX_ByteStringC& bsPsName,
|
| - FX_BOOL bBold,
|
| - FX_BOOL bItalic,
|
| - const CFX_ByteString& bsDRFontName,
|
| - FX_BOOL bStrictMatch) {
|
| +bool CXFA_PDFFontMgr::PsNameMatchDRFontName(const CFX_ByteStringC& bsPsName,
|
| + bool bBold,
|
| + bool bItalic,
|
| + const CFX_ByteString& bsDRFontName,
|
| + bool bStrictMatch) {
|
| CFX_ByteString bsDRName = bsDRFontName;
|
| bsDRName.Remove('-');
|
| int32_t iPsLen = bsPsName.GetLength();
|
| int32_t nIndex = bsDRName.Find(bsPsName);
|
| - if (nIndex != -1 && !bStrictMatch) {
|
| - return TRUE;
|
| - }
|
| - if (nIndex != 0) {
|
| - return FALSE;
|
| - }
|
| + if (nIndex != -1 && !bStrictMatch)
|
| + return true;
|
| +
|
| + if (nIndex != 0)
|
| + return false;
|
| +
|
| int32_t iDifferLength = bsDRName.GetLength() - iPsLen;
|
| if (iDifferLength > 1 || (bBold || bItalic)) {
|
| int32_t iBoldIndex = bsDRName.Find("Bold");
|
| - FX_BOOL bBoldFont = iBoldIndex > 0;
|
| - if (bBold ^ bBoldFont) {
|
| - return FALSE;
|
| - }
|
| + bool bBoldFont = iBoldIndex > 0;
|
| + if (bBold != bBoldFont)
|
| + return false;
|
| +
|
| if (bBoldFont) {
|
| iDifferLength =
|
| std::min(iDifferLength - 4, bsDRName.GetLength() - iBoldIndex - 4);
|
| }
|
| - FX_BOOL bItalicFont = TRUE;
|
| + bool bItalicFont = true;
|
| if (bsDRName.Find("Italic") > 0) {
|
| iDifferLength -= 6;
|
| } else if (bsDRName.Find("It") > 0) {
|
| @@ -1943,35 +1934,35 @@ FX_BOOL CXFA_PDFFontMgr::PsNameMatchDRFontName(
|
| } else if (bsDRName.Find("Oblique") > 0) {
|
| iDifferLength -= 7;
|
| } else {
|
| - bItalicFont = FALSE;
|
| - }
|
| - if (bItalic ^ bItalicFont) {
|
| - return FALSE;
|
| + bItalicFont = false;
|
| }
|
| + if (bItalic != bItalicFont)
|
| + return false;
|
| +
|
| if (iDifferLength > 1) {
|
| CFX_ByteString bsDRTailer = bsDRName.Right(iDifferLength);
|
| if (bsDRTailer == "MT" || bsDRTailer == "PSMT" ||
|
| bsDRTailer == "Regular" || bsDRTailer == "Reg") {
|
| - return TRUE;
|
| + return true;
|
| }
|
| - if (bBoldFont || bItalicFont) {
|
| - return FALSE;
|
| - }
|
| - FX_BOOL bMatch = FALSE;
|
| + if (bBoldFont || bItalicFont)
|
| + return false;
|
| +
|
| + bool bMatch = false;
|
| switch (bsPsName.GetAt(iPsLen - 1)) {
|
| case 'L': {
|
| if (bsDRName.Right(5) == "Light") {
|
| - bMatch = TRUE;
|
| + bMatch = true;
|
| }
|
| } break;
|
| case 'R': {
|
| if (bsDRName.Right(7) == "Regular" || bsDRName.Right(3) == "Reg") {
|
| - bMatch = TRUE;
|
| + bMatch = true;
|
| }
|
| } break;
|
| case 'M': {
|
| if (bsDRName.Right(5) == "Medium") {
|
| - bMatch = TRUE;
|
| + bMatch = true;
|
| }
|
| } break;
|
| default:
|
| @@ -1980,22 +1971,27 @@ FX_BOOL CXFA_PDFFontMgr::PsNameMatchDRFontName(
|
| return bMatch;
|
| }
|
| }
|
| - return TRUE;
|
| + return true;
|
| }
|
| -FX_BOOL CXFA_PDFFontMgr::GetCharWidth(CFGAS_GEFont* pFont,
|
| - FX_WCHAR wUnicode,
|
| - int32_t& iWidth,
|
| - FX_BOOL bCharCode) {
|
| +
|
| +bool CXFA_PDFFontMgr::GetCharWidth(const CFGAS_GEFont* pFont,
|
| + FX_WCHAR wUnicode,
|
| + bool bCharCode,
|
| + int32_t* pWidth) {
|
| if (wUnicode != 0x20 || bCharCode)
|
| - return FALSE;
|
| + return false;
|
|
|
| auto it = m_FDE2PDFFont.find(pFont);
|
| if (it == m_FDE2PDFFont.end())
|
| - return FALSE;
|
| + return false;
|
|
|
| CPDF_Font* pPDFFont = it->second;
|
| - iWidth = pPDFFont->GetCharWidthF(pPDFFont->CharCodeFromUnicode(wUnicode));
|
| - return TRUE;
|
| + *pWidth = pPDFFont->GetCharWidthF(pPDFFont->CharCodeFromUnicode(wUnicode));
|
| + return true;
|
| +}
|
| +
|
| +void CXFA_PDFFontMgr::SetFont(const CFGAS_GEFont* pFont, CPDF_Font* pPDFFont) {
|
| + m_FDE2PDFFont[pFont] = pPDFFont;
|
| }
|
|
|
| CXFA_FontMgr::CXFA_FontMgr() {}
|
| @@ -2012,15 +2008,16 @@ CFGAS_GEFont* CXFA_FontMgr::GetFont(CXFA_FFDoc* hDoc,
|
| auto iter = m_FontMap.find(bsKey);
|
| if (iter != m_FontMap.end())
|
| return iter->second;
|
| - CFX_WideString wsEnglishName;
|
| - XFA_LocalFontNameToEnglishName(wsFontFamily, wsEnglishName);
|
| +
|
| + CFX_WideString wsEnglishName = XFA_LocalFontNameToEnglishName(wsFontFamily);
|
| auto it = m_PDFFontMgrMap.find(hDoc);
|
| CXFA_PDFFontMgr* pMgr =
|
| it != m_PDFFontMgrMap.end() ? it->second.get() : nullptr;
|
| CPDF_Font* pPDFFont = nullptr;
|
| CFGAS_GEFont* pFont = nullptr;
|
| if (pMgr) {
|
| - pFont = pMgr->GetFont(wsEnglishName.AsStringC(), dwFontStyles, &pPDFFont);
|
| + pFont =
|
| + pMgr->GetFont(wsEnglishName.AsStringC(), dwFontStyles, &pPDFFont, TRUE);
|
| if (pFont)
|
| return pFont;
|
| }
|
| @@ -2040,7 +2037,7 @@ CFGAS_GEFont* CXFA_FontMgr::GetFont(CXFA_FFDoc* hDoc,
|
| }
|
| if (pFont) {
|
| if (pPDFFont) {
|
| - pMgr->m_FDE2PDFFont[pFont] = pPDFFont;
|
| + pMgr->SetFont(pFont, pPDFFont);
|
| pFont->SetFontProvider(pMgr);
|
| }
|
| m_FontMap[bsKey] = pFont;
|
|
|