OLD | NEW |
1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
6 | 6 |
7 #include "xfa/fxfa/include/xfa_fontmgr.h" | 7 #include "xfa/fxfa/include/xfa_fontmgr.h" |
8 | 8 |
9 #include <algorithm> | 9 #include <algorithm> |
| 10 #include <memory> |
10 #include <utility> | 11 #include <utility> |
11 | 12 |
12 #include "core/fpdfapi/fpdf_font/include/cpdf_font.h" | 13 #include "core/fpdfapi/fpdf_font/include/cpdf_font.h" |
13 #include "core/fpdfapi/fpdf_parser/include/cpdf_dictionary.h" | 14 #include "core/fpdfapi/fpdf_parser/include/cpdf_dictionary.h" |
14 #include "core/fpdfapi/fpdf_parser/include/cpdf_document.h" | 15 #include "core/fpdfapi/fpdf_parser/include/cpdf_document.h" |
15 #include "xfa/fgas/font/fgas_gefont.h" | 16 #include "xfa/fgas/font/fgas_gefont.h" |
16 #include "xfa/fxfa/include/xfa_ffapp.h" | 17 #include "xfa/fxfa/include/xfa_ffapp.h" |
17 #include "xfa/fxfa/include/xfa_ffdoc.h" | 18 #include "xfa/fxfa/include/xfa_ffdoc.h" |
18 | 19 |
| 20 namespace { |
| 21 |
| 22 // The 5 names per entry are: PsName, Normal, Bold, Italic, BoldItalic. |
| 23 const char* const g_XFAPDFFontName[][5] = { |
| 24 {"Adobe PI Std", "AdobePIStd", "AdobePIStd", "AdobePIStd", "AdobePIStd"}, |
| 25 {"Myriad Pro Light", "MyriadPro-Light", "MyriadPro-Semibold", |
| 26 "MyriadPro-LightIt", "MyriadPro-SemiboldIt"}, |
| 27 }; |
| 28 |
19 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ | 29 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ |
20 static const XFA_FONTINFO g_XFAFontsMap[] = { | 30 const XFA_FONTINFO g_XFAFontsMap[] = { |
21 {0x01d5d33e, L"SimSun", L"Arial", 0, 936}, | 31 {0x01d5d33e, L"SimSun", L"Arial", 0, 936}, |
22 {0x01e4f102, L"YouYuan", L"Arial", 1, 936}, | 32 {0x01e4f102, L"YouYuan", L"Arial", 1, 936}, |
23 {0x030549dc, L"LiSu", L"Arial", 1, 936}, | 33 {0x030549dc, L"LiSu", L"Arial", 1, 936}, |
24 {0x032edd44, L"Simhei", L"Arial", 1, 936}, | 34 {0x032edd44, L"Simhei", L"Arial", 1, 936}, |
25 {0x03eac6fc, L"PoorRichard-Regular", L"Arial", 2, 1252}, | 35 {0x03eac6fc, L"PoorRichard-Regular", L"Arial", 2, 1252}, |
26 {0x03ed90e6, L"Nina", L"Arial", 0, 1252}, | 36 {0x03ed90e6, L"Nina", L"Arial", 0, 1252}, |
27 {0x077b56b3, L"KingsoftPhoneticPlain", L"Arial", 0, 1252}, | 37 {0x077b56b3, L"KingsoftPhoneticPlain", L"Arial", 0, 1252}, |
28 {0x078ed524, L"MicrosoftSansSerif", L"Arial", 0, 1252}, | 38 {0x078ed524, L"MicrosoftSansSerif", L"Arial", 0, 1252}, |
29 {0x089b18a9, L"Arial", L"Arial", 0, 1252}, | 39 {0x089b18a9, L"Arial", L"Arial", 0, 1252}, |
30 {0x0b2cad72, L"MonotypeCorsiva", L"Arial", 8, 1252}, | 40 {0x0b2cad72, L"MonotypeCorsiva", L"Arial", 8, 1252}, |
(...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
258 {0xf1da7eb9, L"ShowcardGothic", L"Arial", 0, 1252}, | 268 {0xf1da7eb9, L"ShowcardGothic", L"Arial", 0, 1252}, |
259 {0xf210f06a, L"ArialMT", L"Arial", 0, 1252}, | 269 {0xf210f06a, L"ArialMT", L"Arial", 0, 1252}, |
260 {0xf477f16a, L"Latha", L"Arial", 0, 1252}, | 270 {0xf477f16a, L"Latha", L"Arial", 0, 1252}, |
261 {0xf616f3dd, L"LiSu", L"Arial", 1, 936}, | 271 {0xf616f3dd, L"LiSu", L"Arial", 1, 936}, |
262 {0xfa479aa6, L"MicrosoftYaHei", L"Arial", 0, 936}, | 272 {0xfa479aa6, L"MicrosoftYaHei", L"Arial", 0, 936}, |
263 {0xfcd19697, L"BookmanOldStyle", L"Arial", 0, 1252}, | 273 {0xfcd19697, L"BookmanOldStyle", L"Arial", 0, 1252}, |
264 {0xfe209a82, L"LucidaCalligraphy", L"Arial", 0, 1252}, | 274 {0xfe209a82, L"LucidaCalligraphy", L"Arial", 0, 1252}, |
265 {0xfef135f8, L"AdobeHeitiStd-Regular", L"Batang,Century,Dotum", 0, 936}, | 275 {0xfef135f8, L"AdobeHeitiStd-Regular", L"Batang,Century,Dotum", 0, 936}, |
266 }; | 276 }; |
267 #elif _FXM_PLATFORM_ == _FXM_PLATFORM_LINUX_ | 277 #elif _FXM_PLATFORM_ == _FXM_PLATFORM_LINUX_ |
268 static const XFA_FONTINFO g_XFAFontsMap[] = { | 278 const XFA_FONTINFO g_XFAFontsMap[] = { |
269 {0x01d5d33e, L"SimSun", | 279 {0x01d5d33e, L"SimSun", |
270 L"WenQuanYi Zen Hei Mono,AR PL UMing CN,AR PL UMing HK,AR PL UMing TW,AR " | 280 L"WenQuanYi Zen Hei Mono,AR PL UMing CN,AR PL UMing HK,AR PL UMing TW,AR " |
271 L"PL UMing TW MBE", | 281 L"PL UMing TW MBE", |
272 0, 936}, | 282 0, 936}, |
273 {0x01e4f102, L"YouYuan", | 283 {0x01e4f102, L"YouYuan", |
274 L"WenQuanYi Zen Hei Mono,AR PL UMing CN,AR PL UMing HK,AR PL UMing TW,AR " | 284 L"WenQuanYi Zen Hei Mono,AR PL UMing CN,AR PL UMing HK,AR PL UMing TW,AR " |
275 L"PL UMing TW MBE", | 285 L"PL UMing TW MBE", |
276 1, 936}, | 286 1, 936}, |
277 {0x030549dc, L"LiSu", | 287 {0x030549dc, L"LiSu", |
278 L"WenQuanYi Zen Hei,WenQuanYi Zen Hei Sharp,WenQuanYi Zen Hei " | 288 L"WenQuanYi Zen Hei,WenQuanYi Zen Hei Sharp,WenQuanYi Zen Hei " |
(...skipping 568 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
847 {0xfe209a82, L"LucidaCalligraphy", | 857 {0xfe209a82, L"LucidaCalligraphy", |
848 L"KacstQurn,Droid Arabic Naskh,Droid Sans Ethiopic,mry_KacstQurn,Droid " | 858 L"KacstQurn,Droid Arabic Naskh,Droid Sans Ethiopic,mry_KacstQurn,Droid " |
849 L"Sans Japanese,DejaVu Serif,DejaVu Sans,FreeMono", | 859 L"Sans Japanese,DejaVu Serif,DejaVu Sans,FreeMono", |
850 0, 1252}, | 860 0, 1252}, |
851 {0xfef135f8, L"AdobeHeitiStd-Regular", | 861 {0xfef135f8, L"AdobeHeitiStd-Regular", |
852 L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei " | 862 L"WenQuanYi Zen Hei Mono,WenQuanYi Zen Hei,WenQuanYi Zen Hei " |
853 L"Sharp,WenQuanYi Micro Hei", | 863 L"Sharp,WenQuanYi Micro Hei", |
854 0, 936}, | 864 0, 936}, |
855 }; | 865 }; |
856 #elif _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ | 866 #elif _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ |
857 static const XFA_FONTINFO g_XFAFontsMap[] = { | 867 const XFA_FONTINFO g_XFAFontsMap[] = { |
858 {0x01d5d33e, L"SimSun", L"STHeiti,Heiti TC,STFangsong", 0, 936}, | 868 {0x01d5d33e, L"SimSun", L"STHeiti,Heiti TC,STFangsong", 0, 936}, |
859 {0x01e4f102, L"YouYuan", L"STHeiti,Heiti TC,STFangsong", 1, 936}, | 869 {0x01e4f102, L"YouYuan", L"STHeiti,Heiti TC,STFangsong", 1, 936}, |
860 {0x030549dc, L"LiSu", L"STHeiti,Heiti TC,STFangsong", 1, 936}, | 870 {0x030549dc, L"LiSu", L"STHeiti,Heiti TC,STFangsong", 1, 936}, |
861 {0x032edd44, L"Simhei", L"STHeiti,Heiti TC,STFangsong", 1, 936}, | 871 {0x032edd44, L"Simhei", L"STHeiti,Heiti TC,STFangsong", 1, 936}, |
862 {0x03eac6fc, L"PoorRichard-Regular", | 872 {0x03eac6fc, L"PoorRichard-Regular", |
863 L"Noteworthy,Avenir Next Condensed,Impact", 2, 1252}, | 873 L"Noteworthy,Avenir Next Condensed,Impact", 2, 1252}, |
864 {0x03ed90e6, L"Nina", L"Microsoft Sans Serif", 0, 1252}, | 874 {0x03ed90e6, L"Nina", L"Microsoft Sans Serif", 0, 1252}, |
865 {0x077b56b3, L"KingsoftPhoneticPlain", | 875 {0x077b56b3, L"KingsoftPhoneticPlain", |
866 L"LastResort,Apple " | 876 L"LastResort,Apple " |
867 L"Chancery,STIXVariants,STIXSizeOneSym,STIXSizeOneSym,Apple Braille", | 877 L"Chancery,STIXVariants,STIXSizeOneSym,STIXSizeOneSym,Apple Braille", |
(...skipping 380 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1248 L"Arial Narrow,Damascus,STIXNonUnicode,American Typewriter", 0, 1252}, | 1258 L"Arial Narrow,Damascus,STIXNonUnicode,American Typewriter", 0, 1252}, |
1249 {0xf616f3dd, L"LiSu", L"STHeiti,Heiti TC,STFangsong", 1, 936}, | 1259 {0xf616f3dd, L"LiSu", L"STHeiti,Heiti TC,STFangsong", 1, 936}, |
1250 {0xfa479aa6, L"MicrosoftYaHei", L"Arial Unicode MS", 0, 936}, | 1260 {0xfa479aa6, L"MicrosoftYaHei", L"Arial Unicode MS", 0, 936}, |
1251 {0xfcd19697, L"BookmanOldStyle", | 1261 {0xfcd19697, L"BookmanOldStyle", |
1252 L"Geeza Pro,Damascus,Andale Mono,Songti SC,Arial Unicode MS", 0, 1252}, | 1262 L"Geeza Pro,Damascus,Andale Mono,Songti SC,Arial Unicode MS", 0, 1252}, |
1253 {0xfe209a82, L"LucidaCalligraphy", | 1263 {0xfe209a82, L"LucidaCalligraphy", |
1254 L"Kokonor,Damascus,STIXNonUnicode,STHeiti,Arial Black", 0, 1252}, | 1264 L"Kokonor,Damascus,STIXNonUnicode,STHeiti,Arial Black", 0, 1252}, |
1255 {0xfef135f8, L"AdobeHeitiStd-Regular", L"Heiti TC,STHeiti", 0, 936}, | 1265 {0xfef135f8, L"AdobeHeitiStd-Regular", L"Heiti TC,STHeiti", 0, 936}, |
1256 }; | 1266 }; |
1257 #elif _FXM_PLATFORM_ == _FXM_PLATFORM_ANDROID_ | 1267 #elif _FXM_PLATFORM_ == _FXM_PLATFORM_ANDROID_ |
1258 static const XFA_FONTINFO g_XFAFontsMap[] = { | 1268 const XFA_FONTINFO g_XFAFontsMap[] = { |
1259 {0x01d5d33e, L"SimSun", L"Droid Sans Fallback", 0, 936}, | 1269 {0x01d5d33e, L"SimSun", L"Droid Sans Fallback", 0, 936}, |
1260 {0x01e4f102, L"YouYuan", L"Droid Sans Fallback", 1, 936}, | 1270 {0x01e4f102, L"YouYuan", L"Droid Sans Fallback", 1, 936}, |
1261 {0x030549dc, L"LiSu", L"Droid Sans Fallback", 1, 936}, | 1271 {0x030549dc, L"LiSu", L"Droid Sans Fallback", 1, 936}, |
1262 {0x032edd44, L"Simhei", L"Droid Sans Fallback", 1, 936}, | 1272 {0x032edd44, L"Simhei", L"Droid Sans Fallback", 1, 936}, |
1263 {0x03eac6fc, L"PoorRichard-Regular", | 1273 {0x03eac6fc, L"PoorRichard-Regular", |
1264 L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback,Droid Arabic " | 1274 L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback,Droid Arabic " |
1265 L"Naskh,Droid Sans Ethiopic", | 1275 L"Naskh,Droid Sans Ethiopic", |
1266 2, 1252}, | 1276 2, 1252}, |
1267 {0x03ed90e6, L"Nina", | 1277 {0x03ed90e6, L"Nina", |
1268 L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, | 1278 L"Roboto,Droid Serif,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, |
(...skipping 417 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1686 {0xfa479aa6, L"MicrosoftYaHei", L"Droid Sans Fallback", 0, 936}, | 1696 {0xfa479aa6, L"MicrosoftYaHei", L"Droid Sans Fallback", 0, 936}, |
1687 {0xfcd19697, L"BookmanOldStyle", | 1697 {0xfcd19697, L"BookmanOldStyle", |
1688 L"Droid Serif,Roboto,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, | 1698 L"Droid Serif,Roboto,Droid Sans Mono,Droid Sans Fallback", 0, 1252}, |
1689 {0xfe209a82, L"LucidaCalligraphy", | 1699 {0xfe209a82, L"LucidaCalligraphy", |
1690 L"Droid Arabic Naskh,Droid Sans Ethiopic,Droid Serif,Roboto,Droid Sans " | 1700 L"Droid Arabic Naskh,Droid Sans Ethiopic,Droid Serif,Roboto,Droid Sans " |
1691 L"Mono", | 1701 L"Mono", |
1692 0, 1252}, | 1702 0, 1252}, |
1693 {0xfef135f8, L"AdobeHeitiStd-Regular", L"Droid Sans Fallback", 0, 936}, | 1703 {0xfef135f8, L"AdobeHeitiStd-Regular", L"Droid Sans Fallback", 0, 936}, |
1694 }; | 1704 }; |
1695 #endif | 1705 #endif |
1696 void XFA_LocalFontNameToEnglishName(const CFX_WideStringC& wsLocalName, | 1706 |
1697 CFX_WideString& wsEnglishName) { | 1707 CFX_WideString XFA_LocalFontNameToEnglishName( |
1698 wsEnglishName = wsLocalName; | 1708 const CFX_WideStringC& wsLocalName) { |
1699 uint32_t dwLocalNameHash = FX_HashCode_GetW(wsLocalName, true); | 1709 uint32_t dwLocalNameHash = FX_HashCode_GetW(wsLocalName, true); |
1700 int32_t iStart = 0; | 1710 const XFA_FONTINFO* pEnd = g_XFAFontsMap + FX_ArraySize(g_XFAFontsMap); |
1701 int32_t iEnd = sizeof(g_XFAFontsMap) / sizeof(XFA_FONTINFO) - 1; | 1711 const XFA_FONTINFO* pFontInfo = |
1702 int32_t iMid = 0; | 1712 std::lower_bound(g_XFAFontsMap, pEnd, dwLocalNameHash, |
1703 do { | 1713 [](const XFA_FONTINFO& entry, uint32_t hash) { |
1704 iMid = (iStart + iEnd) / 2; | 1714 return entry.dwFontNameHash < hash; |
1705 uint32_t dwFontNameHash = g_XFAFontsMap[iMid].dwFontNameHash; | 1715 }); |
1706 if (dwFontNameHash == dwLocalNameHash) { | 1716 if (pFontInfo < pEnd && pFontInfo->dwFontNameHash == dwLocalNameHash) |
1707 wsEnglishName = g_XFAFontsMap[iMid].pPsName; | 1717 return pFontInfo->pPsName; |
1708 break; | 1718 return CFX_WideString(wsLocalName); |
1709 } else if (dwFontNameHash < dwLocalNameHash) { | |
1710 iStart = iMid + 1; | |
1711 } else { | |
1712 iEnd = iMid - 1; | |
1713 } | |
1714 } while (iEnd >= iStart); | |
1715 } | 1719 } |
| 1720 |
1716 const XFA_FONTINFO* XFA_GetFontINFOByFontName( | 1721 const XFA_FONTINFO* XFA_GetFontINFOByFontName( |
1717 const CFX_WideStringC& wsFontName) { | 1722 const CFX_WideStringC& wsFontName) { |
1718 CFX_WideString wsFontNameTemp(wsFontName); | 1723 CFX_WideString wsFontNameTemp(wsFontName); |
1719 wsFontNameTemp.Remove(L' '); | 1724 wsFontNameTemp.Remove(L' '); |
1720 uint32_t dwCurFontNameHash = | 1725 uint32_t dwCurFontNameHash = |
1721 FX_HashCode_GetW(wsFontNameTemp.AsStringC(), true); | 1726 FX_HashCode_GetW(wsFontNameTemp.AsStringC(), true); |
1722 int32_t iStart = 0; | 1727 const XFA_FONTINFO* pEnd = g_XFAFontsMap + FX_ArraySize(g_XFAFontsMap); |
1723 int32_t iEnd = sizeof(g_XFAFontsMap) / sizeof(XFA_FONTINFO) - 1; | 1728 const XFA_FONTINFO* pFontInfo = |
1724 int32_t iMid = 0; | 1729 std::lower_bound(g_XFAFontsMap, pEnd, dwCurFontNameHash, |
1725 const XFA_FONTINFO* pFontInfo = nullptr; | 1730 [](const XFA_FONTINFO& entry, uint32_t hash) { |
1726 do { | 1731 return entry.dwFontNameHash < hash; |
1727 iMid = (iStart + iEnd) / 2; | 1732 }); |
1728 uint32_t dwFontNameHash = g_XFAFontsMap[iMid].dwFontNameHash; | 1733 if (pFontInfo < pEnd && pFontInfo->dwFontNameHash == dwCurFontNameHash) |
1729 if (dwFontNameHash == dwCurFontNameHash) { | 1734 return pFontInfo; |
1730 pFontInfo = &g_XFAFontsMap[iMid]; | 1735 return nullptr; |
1731 break; | |
1732 } else if (dwFontNameHash < dwCurFontNameHash) { | |
1733 iStart = iMid + 1; | |
1734 } else { | |
1735 iEnd = iMid - 1; | |
1736 } | |
1737 } while (iEnd >= iStart); | |
1738 return pFontInfo; | |
1739 } | 1736 } |
1740 | 1737 |
| 1738 } // namespace |
| 1739 |
1741 CXFA_DefFontMgr::CXFA_DefFontMgr() {} | 1740 CXFA_DefFontMgr::CXFA_DefFontMgr() {} |
1742 | 1741 |
1743 CXFA_DefFontMgr::~CXFA_DefFontMgr() { | 1742 CXFA_DefFontMgr::~CXFA_DefFontMgr() { |
1744 for (int32_t i = 0; i < m_CacheFonts.GetSize(); i++) | 1743 for (int32_t i = 0; i < m_CacheFonts.GetSize(); i++) |
1745 m_CacheFonts[i]->Release(); | 1744 m_CacheFonts[i]->Release(); |
1746 } | 1745 } |
1747 | 1746 |
1748 CFGAS_GEFont* CXFA_DefFontMgr::GetFont(CXFA_FFDoc* hDoc, | 1747 CFGAS_GEFont* CXFA_DefFontMgr::GetFont(CXFA_FFDoc* hDoc, |
1749 const CFX_WideStringC& wsFontFamily, | 1748 const CFX_WideStringC& wsFontFamily, |
1750 uint32_t dwFontStyles, | 1749 uint32_t dwFontStyles, |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1791 | 1790 |
1792 CFGAS_GEFont* CXFA_DefFontMgr::GetDefaultFont( | 1791 CFGAS_GEFont* CXFA_DefFontMgr::GetDefaultFont( |
1793 CXFA_FFDoc* hDoc, | 1792 CXFA_FFDoc* hDoc, |
1794 const CFX_WideStringC& wsFontFamily, | 1793 const CFX_WideStringC& wsFontFamily, |
1795 uint32_t dwFontStyles, | 1794 uint32_t dwFontStyles, |
1796 uint16_t wCodePage) { | 1795 uint16_t wCodePage) { |
1797 IFGAS_FontMgr* pFDEFontMgr = hDoc->GetApp()->GetFDEFontMgr(); | 1796 IFGAS_FontMgr* pFDEFontMgr = hDoc->GetApp()->GetFDEFontMgr(); |
1798 CFGAS_GEFont* pFont = | 1797 CFGAS_GEFont* pFont = |
1799 pFDEFontMgr->LoadFont(L"Arial Narrow", dwFontStyles, wCodePage); | 1798 pFDEFontMgr->LoadFont(L"Arial Narrow", dwFontStyles, wCodePage); |
1800 if (!pFont) { | 1799 if (!pFont) { |
1801 pFont = pFDEFontMgr->LoadFont((const FX_WCHAR*)nullptr, dwFontStyles, | 1800 pFont = pFDEFontMgr->LoadFont(static_cast<const FX_WCHAR*>(nullptr), |
1802 wCodePage); | 1801 dwFontStyles, wCodePage); |
1803 } | 1802 } |
1804 | 1803 |
1805 ASSERT(pFont); | 1804 ASSERT(pFont); |
1806 if (pFont) | 1805 if (pFont) |
1807 m_CacheFonts.Add(pFont); | 1806 m_CacheFonts.Add(pFont); |
1808 return pFont; | 1807 return pFont; |
1809 } | 1808 } |
1810 struct XFA_PDFFONTNAME { | 1809 |
1811 const FX_CHAR* lpPsName; | 1810 CXFA_PDFFontMgr::CXFA_PDFFontMgr(CXFA_FFDoc* pDoc) : m_pDoc(pDoc) {} |
1812 const FX_CHAR* lpNormal; | 1811 |
1813 const FX_CHAR* lpBold; | |
1814 const FX_CHAR* lpItalic; | |
1815 const FX_CHAR* lpBoldItalic; | |
1816 }; | |
1817 const XFA_PDFFONTNAME g_XFAPDFFontName[] = { | |
1818 {"Adobe PI Std", "AdobePIStd", "AdobePIStd", "AdobePIStd", "AdobePIStd"}, | |
1819 {"Myriad Pro Light", "MyriadPro-Light", "MyriadPro-Semibold", | |
1820 "MyriadPro-LightIt", "MyriadPro-SemiboldIt"}, | |
1821 }; | |
1822 CXFA_PDFFontMgr::CXFA_PDFFontMgr(CXFA_FFDoc* pDoc) { | |
1823 m_pDoc = pDoc; | |
1824 } | |
1825 CXFA_PDFFontMgr::~CXFA_PDFFontMgr() { | 1812 CXFA_PDFFontMgr::~CXFA_PDFFontMgr() { |
1826 for (const auto& pair : m_FontMap) { | 1813 for (const auto& pair : m_FontMap) { |
1827 if (pair.second) | 1814 if (pair.second) |
1828 pair.second->Release(); | 1815 pair.second->Release(); |
1829 } | 1816 } |
1830 } | 1817 } |
1831 CFGAS_GEFont* CXFA_PDFFontMgr::FindFont(CFX_ByteString strPsName, | 1818 |
1832 FX_BOOL bBold, | 1819 CFGAS_GEFont* CXFA_PDFFontMgr::FindFont(const CFX_ByteString& strPsName, |
1833 FX_BOOL bItalic, | 1820 bool bBold, |
| 1821 bool bItalic, |
1834 CPDF_Font** pDstPDFFont, | 1822 CPDF_Font** pDstPDFFont, |
1835 FX_BOOL bStrictMatch) { | 1823 bool bStrictMatch) { |
1836 CPDF_Document* pDoc = m_pDoc->GetPDFDoc(); | 1824 CPDF_Document* pDoc = m_pDoc->GetPDFDoc(); |
1837 if (!pDoc) { | 1825 if (!pDoc) { |
1838 return nullptr; | 1826 return nullptr; |
1839 } | 1827 } |
1840 CPDF_Dictionary* pFontSetDict = | 1828 CPDF_Dictionary* pFontSetDict = |
1841 pDoc->GetRoot()->GetDictFor("AcroForm")->GetDictFor("DR"); | 1829 pDoc->GetRoot()->GetDictFor("AcroForm")->GetDictFor("DR"); |
1842 if (!pFontSetDict) { | 1830 if (!pFontSetDict) { |
1843 return nullptr; | 1831 return nullptr; |
1844 } | 1832 } |
1845 pFontSetDict = pFontSetDict->GetDictFor("Font"); | 1833 pFontSetDict = pFontSetDict->GetDictFor("Font"); |
1846 if (!pFontSetDict) { | 1834 if (!pFontSetDict) { |
1847 return nullptr; | 1835 return nullptr; |
1848 } | 1836 } |
1849 strPsName.Remove(' '); | 1837 CFX_ByteString name = strPsName; |
| 1838 name.Remove(' '); |
1850 IFGAS_FontMgr* pFDEFontMgr = m_pDoc->GetApp()->GetFDEFontMgr(); | 1839 IFGAS_FontMgr* pFDEFontMgr = m_pDoc->GetApp()->GetFDEFontMgr(); |
1851 for (const auto& it : *pFontSetDict) { | 1840 for (const auto& it : *pFontSetDict) { |
1852 const CFX_ByteString& key = it.first; | 1841 const CFX_ByteString& key = it.first; |
1853 CPDF_Object* pObj = it.second; | 1842 CPDF_Object* pObj = it.second; |
1854 if (!PsNameMatchDRFontName(strPsName.AsStringC(), bBold, bItalic, key, | 1843 if (!PsNameMatchDRFontName(name.AsStringC(), bBold, bItalic, key, |
1855 bStrictMatch)) { | 1844 bStrictMatch)) { |
1856 continue; | 1845 continue; |
1857 } | 1846 } |
1858 CPDF_Dictionary* pFontDict = ToDictionary(pObj->GetDirect()); | 1847 CPDF_Dictionary* pFontDict = ToDictionary(pObj->GetDirect()); |
1859 if (!pFontDict || pFontDict->GetStringFor("Type") != "Font") { | 1848 if (!pFontDict || pFontDict->GetStringFor("Type") != "Font") { |
1860 return nullptr; | 1849 return nullptr; |
1861 } | 1850 } |
1862 CPDF_Font* pPDFFont = pDoc->LoadFont(pFontDict); | 1851 CPDF_Font* pPDFFont = pDoc->LoadFont(pFontDict); |
1863 if (!pPDFFont) { | 1852 if (!pPDFFont) { |
1864 return nullptr; | 1853 return nullptr; |
1865 } | 1854 } |
1866 if (!pPDFFont->IsEmbedded()) { | 1855 if (!pPDFFont->IsEmbedded()) { |
1867 *pDstPDFFont = pPDFFont; | 1856 *pDstPDFFont = pPDFFont; |
1868 return nullptr; | 1857 return nullptr; |
1869 } | 1858 } |
1870 return CFGAS_GEFont::LoadFont(&pPDFFont->m_Font, pFDEFontMgr); | 1859 return CFGAS_GEFont::LoadFont(&pPDFFont->m_Font, pFDEFontMgr); |
1871 } | 1860 } |
1872 return nullptr; | 1861 return nullptr; |
1873 } | 1862 } |
1874 | 1863 |
1875 CFGAS_GEFont* CXFA_PDFFontMgr::GetFont(const CFX_WideStringC& wsFontFamily, | 1864 CFGAS_GEFont* CXFA_PDFFontMgr::GetFont(const CFX_WideStringC& wsFontFamily, |
1876 uint32_t dwFontStyles, | 1865 uint32_t dwFontStyles, |
1877 CPDF_Font** pPDFFont, | 1866 CPDF_Font** pPDFFont, |
1878 FX_BOOL bStrictMatch) { | 1867 bool bStrictMatch) { |
1879 uint32_t dwHashCode = FX_HashCode_GetW(wsFontFamily, false); | 1868 uint32_t dwHashCode = FX_HashCode_GetW(wsFontFamily, false); |
1880 CFX_ByteString strKey; | 1869 CFX_ByteString strKey; |
1881 strKey.Format("%u%u", dwHashCode, dwFontStyles); | 1870 strKey.Format("%u%u", dwHashCode, dwFontStyles); |
1882 auto it = m_FontMap.find(strKey); | 1871 auto it = m_FontMap.find(strKey); |
1883 if (it != m_FontMap.end()) | 1872 if (it != m_FontMap.end()) |
1884 return it->second; | 1873 return it->second; |
1885 CFX_ByteString bsPsName = | 1874 CFX_ByteString bsPsName = |
1886 CFX_ByteString::FromUnicode(CFX_WideString(wsFontFamily)); | 1875 CFX_ByteString::FromUnicode(CFX_WideString(wsFontFamily)); |
1887 FX_BOOL bBold = (dwFontStyles & FX_FONTSTYLE_Bold) == FX_FONTSTYLE_Bold; | 1876 bool bBold = (dwFontStyles & FX_FONTSTYLE_Bold) == FX_FONTSTYLE_Bold; |
1888 FX_BOOL bItalic = (dwFontStyles & FX_FONTSTYLE_Italic) == FX_FONTSTYLE_Italic; | 1877 bool bItalic = (dwFontStyles & FX_FONTSTYLE_Italic) == FX_FONTSTYLE_Italic; |
1889 CFX_ByteString strFontName = PsNameToFontName(bsPsName, bBold, bItalic); | 1878 CFX_ByteString strFontName = PsNameToFontName(bsPsName, bBold, bItalic); |
1890 CFGAS_GEFont* pFont = | 1879 CFGAS_GEFont* pFont = |
1891 FindFont(strFontName, bBold, bItalic, pPDFFont, bStrictMatch); | 1880 FindFont(strFontName, bBold, bItalic, pPDFFont, bStrictMatch); |
1892 if (pFont) | 1881 if (pFont) |
1893 m_FontMap[strKey] = pFont; | 1882 m_FontMap[strKey] = pFont; |
1894 return pFont; | 1883 return pFont; |
1895 } | 1884 } |
1896 | 1885 |
1897 CFX_ByteString CXFA_PDFFontMgr::PsNameToFontName( | 1886 CFX_ByteString CXFA_PDFFontMgr::PsNameToFontName( |
1898 const CFX_ByteString& strPsName, | 1887 const CFX_ByteString& strPsName, |
1899 FX_BOOL bBold, | 1888 bool bBold, |
1900 FX_BOOL bItalic) { | 1889 bool bItalic) { |
1901 int32_t nCount = sizeof(g_XFAPDFFontName) / sizeof(XFA_PDFFONTNAME); | 1890 for (size_t i = 0; i < FX_ArraySize(g_XFAPDFFontName); ++i) { |
1902 for (int32_t i = 0; i < nCount; i++) { | 1891 if (strPsName == g_XFAPDFFontName[i][0]) { |
1903 if (strPsName == g_XFAPDFFontName[i].lpPsName) { | 1892 size_t index = 1; |
1904 int32_t index = 1 + ((bItalic << 1) | bBold); | 1893 if (bBold) |
1905 return *(&g_XFAPDFFontName[i].lpPsName + index); | 1894 ++index; |
| 1895 if (bItalic) |
| 1896 index += 2; |
| 1897 return g_XFAPDFFontName[i][index]; |
1906 } | 1898 } |
1907 } | 1899 } |
1908 return strPsName; | 1900 return strPsName; |
1909 } | 1901 } |
1910 | 1902 |
1911 FX_BOOL CXFA_PDFFontMgr::PsNameMatchDRFontName( | 1903 bool CXFA_PDFFontMgr::PsNameMatchDRFontName(const CFX_ByteStringC& bsPsName, |
1912 const CFX_ByteStringC& bsPsName, | 1904 bool bBold, |
1913 FX_BOOL bBold, | 1905 bool bItalic, |
1914 FX_BOOL bItalic, | 1906 const CFX_ByteString& bsDRFontName, |
1915 const CFX_ByteString& bsDRFontName, | 1907 bool bStrictMatch) { |
1916 FX_BOOL bStrictMatch) { | |
1917 CFX_ByteString bsDRName = bsDRFontName; | 1908 CFX_ByteString bsDRName = bsDRFontName; |
1918 bsDRName.Remove('-'); | 1909 bsDRName.Remove('-'); |
1919 int32_t iPsLen = bsPsName.GetLength(); | 1910 int32_t iPsLen = bsPsName.GetLength(); |
1920 int32_t nIndex = bsDRName.Find(bsPsName); | 1911 int32_t nIndex = bsDRName.Find(bsPsName); |
1921 if (nIndex != -1 && !bStrictMatch) { | 1912 if (nIndex != -1 && !bStrictMatch) |
1922 return TRUE; | 1913 return true; |
1923 } | 1914 |
1924 if (nIndex != 0) { | 1915 if (nIndex != 0) |
1925 return FALSE; | 1916 return false; |
1926 } | 1917 |
1927 int32_t iDifferLength = bsDRName.GetLength() - iPsLen; | 1918 int32_t iDifferLength = bsDRName.GetLength() - iPsLen; |
1928 if (iDifferLength > 1 || (bBold || bItalic)) { | 1919 if (iDifferLength > 1 || (bBold || bItalic)) { |
1929 int32_t iBoldIndex = bsDRName.Find("Bold"); | 1920 int32_t iBoldIndex = bsDRName.Find("Bold"); |
1930 FX_BOOL bBoldFont = iBoldIndex > 0; | 1921 bool bBoldFont = iBoldIndex > 0; |
1931 if (bBold ^ bBoldFont) { | 1922 if (bBold != bBoldFont) |
1932 return FALSE; | 1923 return false; |
1933 } | 1924 |
1934 if (bBoldFont) { | 1925 if (bBoldFont) { |
1935 iDifferLength = | 1926 iDifferLength = |
1936 std::min(iDifferLength - 4, bsDRName.GetLength() - iBoldIndex - 4); | 1927 std::min(iDifferLength - 4, bsDRName.GetLength() - iBoldIndex - 4); |
1937 } | 1928 } |
1938 FX_BOOL bItalicFont = TRUE; | 1929 bool bItalicFont = true; |
1939 if (bsDRName.Find("Italic") > 0) { | 1930 if (bsDRName.Find("Italic") > 0) { |
1940 iDifferLength -= 6; | 1931 iDifferLength -= 6; |
1941 } else if (bsDRName.Find("It") > 0) { | 1932 } else if (bsDRName.Find("It") > 0) { |
1942 iDifferLength -= 2; | 1933 iDifferLength -= 2; |
1943 } else if (bsDRName.Find("Oblique") > 0) { | 1934 } else if (bsDRName.Find("Oblique") > 0) { |
1944 iDifferLength -= 7; | 1935 iDifferLength -= 7; |
1945 } else { | 1936 } else { |
1946 bItalicFont = FALSE; | 1937 bItalicFont = false; |
1947 } | 1938 } |
1948 if (bItalic ^ bItalicFont) { | 1939 if (bItalic != bItalicFont) |
1949 return FALSE; | 1940 return false; |
1950 } | 1941 |
1951 if (iDifferLength > 1) { | 1942 if (iDifferLength > 1) { |
1952 CFX_ByteString bsDRTailer = bsDRName.Right(iDifferLength); | 1943 CFX_ByteString bsDRTailer = bsDRName.Right(iDifferLength); |
1953 if (bsDRTailer == "MT" || bsDRTailer == "PSMT" || | 1944 if (bsDRTailer == "MT" || bsDRTailer == "PSMT" || |
1954 bsDRTailer == "Regular" || bsDRTailer == "Reg") { | 1945 bsDRTailer == "Regular" || bsDRTailer == "Reg") { |
1955 return TRUE; | 1946 return true; |
1956 } | 1947 } |
1957 if (bBoldFont || bItalicFont) { | 1948 if (bBoldFont || bItalicFont) |
1958 return FALSE; | 1949 return false; |
1959 } | 1950 |
1960 FX_BOOL bMatch = FALSE; | 1951 bool bMatch = false; |
1961 switch (bsPsName.GetAt(iPsLen - 1)) { | 1952 switch (bsPsName.GetAt(iPsLen - 1)) { |
1962 case 'L': { | 1953 case 'L': { |
1963 if (bsDRName.Right(5) == "Light") { | 1954 if (bsDRName.Right(5) == "Light") { |
1964 bMatch = TRUE; | 1955 bMatch = true; |
1965 } | 1956 } |
1966 } break; | 1957 } break; |
1967 case 'R': { | 1958 case 'R': { |
1968 if (bsDRName.Right(7) == "Regular" || bsDRName.Right(3) == "Reg") { | 1959 if (bsDRName.Right(7) == "Regular" || bsDRName.Right(3) == "Reg") { |
1969 bMatch = TRUE; | 1960 bMatch = true; |
1970 } | 1961 } |
1971 } break; | 1962 } break; |
1972 case 'M': { | 1963 case 'M': { |
1973 if (bsDRName.Right(5) == "Medium") { | 1964 if (bsDRName.Right(5) == "Medium") { |
1974 bMatch = TRUE; | 1965 bMatch = true; |
1975 } | 1966 } |
1976 } break; | 1967 } break; |
1977 default: | 1968 default: |
1978 break; | 1969 break; |
1979 } | 1970 } |
1980 return bMatch; | 1971 return bMatch; |
1981 } | 1972 } |
1982 } | 1973 } |
1983 return TRUE; | 1974 return true; |
1984 } | 1975 } |
1985 FX_BOOL CXFA_PDFFontMgr::GetCharWidth(CFGAS_GEFont* pFont, | 1976 |
1986 FX_WCHAR wUnicode, | 1977 bool CXFA_PDFFontMgr::GetCharWidth(const CFGAS_GEFont* pFont, |
1987 int32_t& iWidth, | 1978 FX_WCHAR wUnicode, |
1988 FX_BOOL bCharCode) { | 1979 bool bCharCode, |
| 1980 int32_t* pWidth) { |
1989 if (wUnicode != 0x20 || bCharCode) | 1981 if (wUnicode != 0x20 || bCharCode) |
1990 return FALSE; | 1982 return false; |
1991 | 1983 |
1992 auto it = m_FDE2PDFFont.find(pFont); | 1984 auto it = m_FDE2PDFFont.find(pFont); |
1993 if (it == m_FDE2PDFFont.end()) | 1985 if (it == m_FDE2PDFFont.end()) |
1994 return FALSE; | 1986 return false; |
1995 | 1987 |
1996 CPDF_Font* pPDFFont = it->second; | 1988 CPDF_Font* pPDFFont = it->second; |
1997 iWidth = pPDFFont->GetCharWidthF(pPDFFont->CharCodeFromUnicode(wUnicode)); | 1989 *pWidth = pPDFFont->GetCharWidthF(pPDFFont->CharCodeFromUnicode(wUnicode)); |
1998 return TRUE; | 1990 return true; |
| 1991 } |
| 1992 |
| 1993 void CXFA_PDFFontMgr::SetFont(const CFGAS_GEFont* pFont, CPDF_Font* pPDFFont) { |
| 1994 m_FDE2PDFFont[pFont] = pPDFFont; |
1999 } | 1995 } |
2000 | 1996 |
2001 CXFA_FontMgr::CXFA_FontMgr() {} | 1997 CXFA_FontMgr::CXFA_FontMgr() {} |
2002 | 1998 |
2003 CXFA_FontMgr::~CXFA_FontMgr() {} | 1999 CXFA_FontMgr::~CXFA_FontMgr() {} |
2004 | 2000 |
2005 CFGAS_GEFont* CXFA_FontMgr::GetFont(CXFA_FFDoc* hDoc, | 2001 CFGAS_GEFont* CXFA_FontMgr::GetFont(CXFA_FFDoc* hDoc, |
2006 const CFX_WideStringC& wsFontFamily, | 2002 const CFX_WideStringC& wsFontFamily, |
2007 uint32_t dwFontStyles, | 2003 uint32_t dwFontStyles, |
2008 uint16_t wCodePage) { | 2004 uint16_t wCodePage) { |
2009 uint32_t dwHash = FX_HashCode_GetW(wsFontFamily, false); | 2005 uint32_t dwHash = FX_HashCode_GetW(wsFontFamily, false); |
2010 CFX_ByteString bsKey; | 2006 CFX_ByteString bsKey; |
2011 bsKey.Format("%u%u%u", dwHash, dwFontStyles, wCodePage); | 2007 bsKey.Format("%u%u%u", dwHash, dwFontStyles, wCodePage); |
2012 auto iter = m_FontMap.find(bsKey); | 2008 auto iter = m_FontMap.find(bsKey); |
2013 if (iter != m_FontMap.end()) | 2009 if (iter != m_FontMap.end()) |
2014 return iter->second; | 2010 return iter->second; |
2015 CFX_WideString wsEnglishName; | 2011 |
2016 XFA_LocalFontNameToEnglishName(wsFontFamily, wsEnglishName); | 2012 CFX_WideString wsEnglishName = XFA_LocalFontNameToEnglishName(wsFontFamily); |
2017 auto it = m_PDFFontMgrMap.find(hDoc); | 2013 auto it = m_PDFFontMgrMap.find(hDoc); |
2018 CXFA_PDFFontMgr* pMgr = | 2014 CXFA_PDFFontMgr* pMgr = |
2019 it != m_PDFFontMgrMap.end() ? it->second.get() : nullptr; | 2015 it != m_PDFFontMgrMap.end() ? it->second.get() : nullptr; |
2020 CPDF_Font* pPDFFont = nullptr; | 2016 CPDF_Font* pPDFFont = nullptr; |
2021 CFGAS_GEFont* pFont = nullptr; | 2017 CFGAS_GEFont* pFont = nullptr; |
2022 if (pMgr) { | 2018 if (pMgr) { |
2023 pFont = pMgr->GetFont(wsEnglishName.AsStringC(), dwFontStyles, &pPDFFont); | 2019 pFont = |
| 2020 pMgr->GetFont(wsEnglishName.AsStringC(), dwFontStyles, &pPDFFont, TRUE); |
2024 if (pFont) | 2021 if (pFont) |
2025 return pFont; | 2022 return pFont; |
2026 } | 2023 } |
2027 if (!pFont && m_pDefFontMgr) | 2024 if (!pFont && m_pDefFontMgr) |
2028 pFont = m_pDefFontMgr->GetFont(hDoc, wsFontFamily, dwFontStyles, wCodePage); | 2025 pFont = m_pDefFontMgr->GetFont(hDoc, wsFontFamily, dwFontStyles, wCodePage); |
2029 | 2026 |
2030 if (!pFont && pMgr) { | 2027 if (!pFont && pMgr) { |
2031 pPDFFont = nullptr; | 2028 pPDFFont = nullptr; |
2032 pFont = pMgr->GetFont(wsEnglishName.AsStringC(), dwFontStyles, &pPDFFont, | 2029 pFont = pMgr->GetFont(wsEnglishName.AsStringC(), dwFontStyles, &pPDFFont, |
2033 FALSE); | 2030 FALSE); |
2034 if (pFont) | 2031 if (pFont) |
2035 return pFont; | 2032 return pFont; |
2036 } | 2033 } |
2037 if (!pFont && m_pDefFontMgr) { | 2034 if (!pFont && m_pDefFontMgr) { |
2038 pFont = m_pDefFontMgr->GetDefaultFont(hDoc, wsFontFamily, dwFontStyles, | 2035 pFont = m_pDefFontMgr->GetDefaultFont(hDoc, wsFontFamily, dwFontStyles, |
2039 wCodePage); | 2036 wCodePage); |
2040 } | 2037 } |
2041 if (pFont) { | 2038 if (pFont) { |
2042 if (pPDFFont) { | 2039 if (pPDFFont) { |
2043 pMgr->m_FDE2PDFFont[pFont] = pPDFFont; | 2040 pMgr->SetFont(pFont, pPDFFont); |
2044 pFont->SetFontProvider(pMgr); | 2041 pFont->SetFontProvider(pMgr); |
2045 } | 2042 } |
2046 m_FontMap[bsKey] = pFont; | 2043 m_FontMap[bsKey] = pFont; |
2047 } | 2044 } |
2048 return pFont; | 2045 return pFont; |
2049 } | 2046 } |
2050 | 2047 |
2051 void CXFA_FontMgr::LoadDocFonts(CXFA_FFDoc* hDoc) { | 2048 void CXFA_FontMgr::LoadDocFonts(CXFA_FFDoc* hDoc) { |
2052 if (!m_PDFFontMgrMap[hDoc]) | 2049 if (!m_PDFFontMgrMap[hDoc]) |
2053 m_PDFFontMgrMap[hDoc].reset(new CXFA_PDFFontMgr(hDoc)); | 2050 m_PDFFontMgrMap[hDoc].reset(new CXFA_PDFFontMgr(hDoc)); |
2054 } | 2051 } |
2055 | 2052 |
2056 void CXFA_FontMgr::ReleaseDocFonts(CXFA_FFDoc* hDoc) { | 2053 void CXFA_FontMgr::ReleaseDocFonts(CXFA_FFDoc* hDoc) { |
2057 m_PDFFontMgrMap.erase(hDoc); | 2054 m_PDFFontMgrMap.erase(hDoc); |
2058 } | 2055 } |
2059 | 2056 |
2060 void CXFA_FontMgr::SetDefFontMgr(std::unique_ptr<CXFA_DefFontMgr> pFontMgr) { | 2057 void CXFA_FontMgr::SetDefFontMgr(std::unique_ptr<CXFA_DefFontMgr> pFontMgr) { |
2061 m_pDefFontMgr = std::move(pFontMgr); | 2058 m_pDefFontMgr = std::move(pFontMgr); |
2062 } | 2059 } |
OLD | NEW |