| 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 <utility> | 10 #include <utility> |
| 11 | 11 |
| 12 #include "core/fpdfapi/fpdf_font/include/cpdf_font.h" | 12 #include "core/fpdfapi/fpdf_font/include/cpdf_font.h" |
| 13 #include "core/fpdfapi/fpdf_parser/include/cpdf_dictionary.h" | 13 #include "core/fpdfapi/fpdf_parser/include/cpdf_dictionary.h" |
| 14 #include "core/fpdfapi/fpdf_parser/include/cpdf_document.h" | 14 #include "core/fpdfapi/fpdf_parser/include/cpdf_document.h" |
| 15 #include "xfa/fgas/font/fgas_gefont.h" |
| 15 #include "xfa/fxfa/include/xfa_ffapp.h" | 16 #include "xfa/fxfa/include/xfa_ffapp.h" |
| 16 #include "xfa/fxfa/include/xfa_ffdoc.h" | 17 #include "xfa/fxfa/include/xfa_ffdoc.h" |
| 17 | 18 |
| 18 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ | 19 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ |
| 19 static const XFA_FONTINFO g_XFAFontsMap[] = { | 20 static const XFA_FONTINFO g_XFAFontsMap[] = { |
| 20 {0x01d5d33e, L"SimSun", L"Arial", 0, 936}, | 21 {0x01d5d33e, L"SimSun", L"Arial", 0, 936}, |
| 21 {0x01e4f102, L"YouYuan", L"Arial", 1, 936}, | 22 {0x01e4f102, L"YouYuan", L"Arial", 1, 936}, |
| 22 {0x030549dc, L"LiSu", L"Arial", 1, 936}, | 23 {0x030549dc, L"LiSu", L"Arial", 1, 936}, |
| 23 {0x032edd44, L"Simhei", L"Arial", 1, 936}, | 24 {0x032edd44, L"Simhei", L"Arial", 1, 936}, |
| 24 {0x03eac6fc, L"PoorRichard-Regular", L"Arial", 2, 1252}, | 25 {0x03eac6fc, L"PoorRichard-Regular", L"Arial", 2, 1252}, |
| (...skipping 1710 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1735 } | 1736 } |
| 1736 } while (iEnd >= iStart); | 1737 } while (iEnd >= iStart); |
| 1737 return pFontInfo; | 1738 return pFontInfo; |
| 1738 } | 1739 } |
| 1739 | 1740 |
| 1740 CXFA_DefFontMgr::~CXFA_DefFontMgr() { | 1741 CXFA_DefFontMgr::~CXFA_DefFontMgr() { |
| 1741 for (int32_t i = 0; i < m_CacheFonts.GetSize(); i++) | 1742 for (int32_t i = 0; i < m_CacheFonts.GetSize(); i++) |
| 1742 m_CacheFonts[i]->Release(); | 1743 m_CacheFonts[i]->Release(); |
| 1743 } | 1744 } |
| 1744 | 1745 |
| 1745 IFGAS_Font* CXFA_DefFontMgr::GetFont(CXFA_FFDoc* hDoc, | 1746 CFGAS_GEFont* CXFA_DefFontMgr::GetFont(CXFA_FFDoc* hDoc, |
| 1746 const CFX_WideStringC& wsFontFamily, | 1747 const CFX_WideStringC& wsFontFamily, |
| 1747 uint32_t dwFontStyles, | 1748 uint32_t dwFontStyles, |
| 1748 uint16_t wCodePage) { | 1749 uint16_t wCodePage) { |
| 1749 CFX_WideString wsFontName(wsFontFamily); | 1750 CFX_WideString wsFontName(wsFontFamily); |
| 1750 IFGAS_FontMgr* pFDEFontMgr = hDoc->GetApp()->GetFDEFontMgr(); | 1751 IFGAS_FontMgr* pFDEFontMgr = hDoc->GetApp()->GetFDEFontMgr(); |
| 1751 IFGAS_Font* pFont = | 1752 CFGAS_GEFont* pFont = |
| 1752 pFDEFontMgr->LoadFont(wsFontName.c_str(), dwFontStyles, wCodePage); | 1753 pFDEFontMgr->LoadFont(wsFontName.c_str(), dwFontStyles, wCodePage); |
| 1753 if (!pFont) { | 1754 if (!pFont) { |
| 1754 const XFA_FONTINFO* pCurFont = | 1755 const XFA_FONTINFO* pCurFont = |
| 1755 XFA_GetFontINFOByFontName(wsFontName.AsStringC()); | 1756 XFA_GetFontINFOByFontName(wsFontName.AsStringC()); |
| 1756 if (pCurFont && pCurFont->pReplaceFont) { | 1757 if (pCurFont && pCurFont->pReplaceFont) { |
| 1757 uint32_t dwStyle = 0; | 1758 uint32_t dwStyle = 0; |
| 1758 if (dwFontStyles & FX_FONTSTYLE_Bold) { | 1759 if (dwFontStyles & FX_FONTSTYLE_Bold) { |
| 1759 dwStyle |= FX_FONTSTYLE_Bold; | 1760 dwStyle |= FX_FONTSTYLE_Bold; |
| 1760 } | 1761 } |
| 1761 if (dwFontStyles & FX_FONTSTYLE_Italic) { | 1762 if (dwFontStyles & FX_FONTSTYLE_Italic) { |
| (...skipping 18 matching lines...) Expand all Loading... |
| 1780 pReplace = pNameText; | 1781 pReplace = pNameText; |
| 1781 } | 1782 } |
| 1782 } | 1783 } |
| 1783 } | 1784 } |
| 1784 if (pFont) { | 1785 if (pFont) { |
| 1785 m_CacheFonts.Add(pFont); | 1786 m_CacheFonts.Add(pFont); |
| 1786 } | 1787 } |
| 1787 return pFont; | 1788 return pFont; |
| 1788 } | 1789 } |
| 1789 | 1790 |
| 1790 IFGAS_Font* CXFA_DefFontMgr::GetDefaultFont(CXFA_FFDoc* hDoc, | 1791 CFGAS_GEFont* CXFA_DefFontMgr::GetDefaultFont( |
| 1791 const CFX_WideStringC& wsFontFamily, | 1792 CXFA_FFDoc* hDoc, |
| 1792 uint32_t dwFontStyles, | 1793 const CFX_WideStringC& wsFontFamily, |
| 1793 uint16_t wCodePage) { | 1794 uint32_t dwFontStyles, |
| 1795 uint16_t wCodePage) { |
| 1794 IFGAS_FontMgr* pFDEFontMgr = hDoc->GetApp()->GetFDEFontMgr(); | 1796 IFGAS_FontMgr* pFDEFontMgr = hDoc->GetApp()->GetFDEFontMgr(); |
| 1795 IFGAS_Font* pFont = | 1797 CFGAS_GEFont* pFont = |
| 1796 pFDEFontMgr->LoadFont(L"Arial Narrow", dwFontStyles, wCodePage); | 1798 pFDEFontMgr->LoadFont(L"Arial Narrow", dwFontStyles, wCodePage); |
| 1797 if (!pFont) | 1799 if (!pFont) |
| 1798 pFont = | 1800 pFont = |
| 1799 pFDEFontMgr->LoadFont((const FX_WCHAR*)NULL, dwFontStyles, wCodePage); | 1801 pFDEFontMgr->LoadFont((const FX_WCHAR*)NULL, dwFontStyles, wCodePage); |
| 1800 ASSERT(pFont); | 1802 ASSERT(pFont); |
| 1801 if (pFont) { | 1803 if (pFont) { |
| 1802 m_CacheFonts.Add(pFont); | 1804 m_CacheFonts.Add(pFont); |
| 1803 } | 1805 } |
| 1804 return pFont; | 1806 return pFont; |
| 1805 } | 1807 } |
| (...skipping 11 matching lines...) Expand all Loading... |
| 1817 }; | 1819 }; |
| 1818 CXFA_PDFFontMgr::CXFA_PDFFontMgr(CXFA_FFDoc* pDoc) { | 1820 CXFA_PDFFontMgr::CXFA_PDFFontMgr(CXFA_FFDoc* pDoc) { |
| 1819 m_pDoc = pDoc; | 1821 m_pDoc = pDoc; |
| 1820 } | 1822 } |
| 1821 CXFA_PDFFontMgr::~CXFA_PDFFontMgr() { | 1823 CXFA_PDFFontMgr::~CXFA_PDFFontMgr() { |
| 1822 for (const auto& pair : m_FontMap) { | 1824 for (const auto& pair : m_FontMap) { |
| 1823 if (pair.second) | 1825 if (pair.second) |
| 1824 pair.second->Release(); | 1826 pair.second->Release(); |
| 1825 } | 1827 } |
| 1826 } | 1828 } |
| 1827 IFGAS_Font* CXFA_PDFFontMgr::FindFont(CFX_ByteString strPsName, | 1829 CFGAS_GEFont* CXFA_PDFFontMgr::FindFont(CFX_ByteString strPsName, |
| 1828 FX_BOOL bBold, | 1830 FX_BOOL bBold, |
| 1829 FX_BOOL bItalic, | 1831 FX_BOOL bItalic, |
| 1830 CPDF_Font** pDstPDFFont, | 1832 CPDF_Font** pDstPDFFont, |
| 1831 FX_BOOL bStrictMatch) { | 1833 FX_BOOL bStrictMatch) { |
| 1832 CPDF_Document* pDoc = m_pDoc->GetPDFDoc(); | 1834 CPDF_Document* pDoc = m_pDoc->GetPDFDoc(); |
| 1833 if (pDoc == NULL) { | 1835 if (pDoc == NULL) { |
| 1834 return NULL; | 1836 return NULL; |
| 1835 } | 1837 } |
| 1836 CPDF_Dictionary* pFontSetDict = | 1838 CPDF_Dictionary* pFontSetDict = |
| 1837 pDoc->GetRoot()->GetDictBy("AcroForm")->GetDictBy("DR"); | 1839 pDoc->GetRoot()->GetDictBy("AcroForm")->GetDictBy("DR"); |
| 1838 if (!pFontSetDict) { | 1840 if (!pFontSetDict) { |
| 1839 return NULL; | 1841 return NULL; |
| 1840 } | 1842 } |
| 1841 pFontSetDict = (CPDF_Dictionary*)pFontSetDict->GetDictBy("Font"); | 1843 pFontSetDict = (CPDF_Dictionary*)pFontSetDict->GetDictBy("Font"); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 1860 return NULL; | 1862 return NULL; |
| 1861 } | 1863 } |
| 1862 CPDF_Font* pPDFFont = pDoc->LoadFont(pFontDict); | 1864 CPDF_Font* pPDFFont = pDoc->LoadFont(pFontDict); |
| 1863 if (!pPDFFont) { | 1865 if (!pPDFFont) { |
| 1864 return NULL; | 1866 return NULL; |
| 1865 } | 1867 } |
| 1866 if (!pPDFFont->IsEmbedded()) { | 1868 if (!pPDFFont->IsEmbedded()) { |
| 1867 *pDstPDFFont = pPDFFont; | 1869 *pDstPDFFont = pPDFFont; |
| 1868 return NULL; | 1870 return NULL; |
| 1869 } | 1871 } |
| 1870 return IFGAS_Font::LoadFont(&pPDFFont->m_Font, pFDEFontMgr); | 1872 return CFGAS_GEFont::LoadFont(&pPDFFont->m_Font, pFDEFontMgr, FALSE); |
| 1871 } | 1873 } |
| 1872 return NULL; | 1874 return NULL; |
| 1873 } | 1875 } |
| 1874 | 1876 |
| 1875 IFGAS_Font* CXFA_PDFFontMgr::GetFont(const CFX_WideStringC& wsFontFamily, | 1877 CFGAS_GEFont* CXFA_PDFFontMgr::GetFont(const CFX_WideStringC& wsFontFamily, |
| 1876 uint32_t dwFontStyles, | 1878 uint32_t dwFontStyles, |
| 1877 CPDF_Font** pPDFFont, | 1879 CPDF_Font** pPDFFont, |
| 1878 FX_BOOL bStrictMatch) { | 1880 FX_BOOL bStrictMatch) { |
| 1879 uint32_t dwHashCode = FX_HashCode_GetW(wsFontFamily, false); | 1881 uint32_t dwHashCode = FX_HashCode_GetW(wsFontFamily, false); |
| 1880 CFX_ByteString strKey; | 1882 CFX_ByteString strKey; |
| 1881 strKey.Format("%u%u", dwHashCode, dwFontStyles); | 1883 strKey.Format("%u%u", dwHashCode, dwFontStyles); |
| 1882 auto it = m_FontMap.find(strKey); | 1884 auto it = m_FontMap.find(strKey); |
| 1883 if (it != m_FontMap.end()) | 1885 if (it != m_FontMap.end()) |
| 1884 return it->second; | 1886 return it->second; |
| 1885 CFX_ByteString bsPsName = | 1887 CFX_ByteString bsPsName = |
| 1886 CFX_ByteString::FromUnicode(CFX_WideString(wsFontFamily)); | 1888 CFX_ByteString::FromUnicode(CFX_WideString(wsFontFamily)); |
| 1887 FX_BOOL bBold = (dwFontStyles & FX_FONTSTYLE_Bold) == FX_FONTSTYLE_Bold; | 1889 FX_BOOL bBold = (dwFontStyles & FX_FONTSTYLE_Bold) == FX_FONTSTYLE_Bold; |
| 1888 FX_BOOL bItalic = (dwFontStyles & FX_FONTSTYLE_Italic) == FX_FONTSTYLE_Italic; | 1890 FX_BOOL bItalic = (dwFontStyles & FX_FONTSTYLE_Italic) == FX_FONTSTYLE_Italic; |
| 1889 CFX_ByteString strFontName = PsNameToFontName(bsPsName, bBold, bItalic); | 1891 CFX_ByteString strFontName = PsNameToFontName(bsPsName, bBold, bItalic); |
| 1890 IFGAS_Font* pFont = | 1892 CFGAS_GEFont* pFont = |
| 1891 FindFont(strFontName, bBold, bItalic, pPDFFont, bStrictMatch); | 1893 FindFont(strFontName, bBold, bItalic, pPDFFont, bStrictMatch); |
| 1892 if (pFont) | 1894 if (pFont) |
| 1893 m_FontMap[strKey] = pFont; | 1895 m_FontMap[strKey] = pFont; |
| 1894 return pFont; | 1896 return pFont; |
| 1895 } | 1897 } |
| 1896 | 1898 |
| 1897 CFX_ByteString CXFA_PDFFontMgr::PsNameToFontName( | 1899 CFX_ByteString CXFA_PDFFontMgr::PsNameToFontName( |
| 1898 const CFX_ByteString& strPsName, | 1900 const CFX_ByteString& strPsName, |
| 1899 FX_BOOL bBold, | 1901 FX_BOOL bBold, |
| 1900 FX_BOOL bItalic) { | 1902 FX_BOOL bItalic) { |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1975 } | 1977 } |
| 1976 } break; | 1978 } break; |
| 1977 default: | 1979 default: |
| 1978 break; | 1980 break; |
| 1979 } | 1981 } |
| 1980 return bMatch; | 1982 return bMatch; |
| 1981 } | 1983 } |
| 1982 } | 1984 } |
| 1983 return TRUE; | 1985 return TRUE; |
| 1984 } | 1986 } |
| 1985 FX_BOOL CXFA_PDFFontMgr::GetCharWidth(IFGAS_Font* pFont, | 1987 FX_BOOL CXFA_PDFFontMgr::GetCharWidth(CFGAS_GEFont* pFont, |
| 1986 FX_WCHAR wUnicode, | 1988 FX_WCHAR wUnicode, |
| 1987 int32_t& iWidth, | 1989 int32_t& iWidth, |
| 1988 FX_BOOL bCharCode) { | 1990 FX_BOOL bCharCode) { |
| 1989 if (wUnicode != 0x20 || bCharCode) | 1991 if (wUnicode != 0x20 || bCharCode) |
| 1990 return FALSE; | 1992 return FALSE; |
| 1991 | 1993 |
| 1992 auto it = m_FDE2PDFFont.find(pFont); | 1994 auto it = m_FDE2PDFFont.find(pFont); |
| 1993 if (it == m_FDE2PDFFont.end()) | 1995 if (it == m_FDE2PDFFont.end()) |
| 1994 return FALSE; | 1996 return FALSE; |
| 1995 | 1997 |
| 1996 CPDF_Font* pPDFFont = it->second; | 1998 CPDF_Font* pPDFFont = it->second; |
| 1997 iWidth = pPDFFont->GetCharWidthF(pPDFFont->CharCodeFromUnicode(wUnicode)); | 1999 iWidth = pPDFFont->GetCharWidthF(pPDFFont->CharCodeFromUnicode(wUnicode)); |
| 1998 return TRUE; | 2000 return TRUE; |
| 1999 } | 2001 } |
| 2000 | 2002 |
| 2001 CXFA_FontMgr::CXFA_FontMgr() {} | 2003 CXFA_FontMgr::CXFA_FontMgr() {} |
| 2002 | 2004 |
| 2003 CXFA_FontMgr::~CXFA_FontMgr() {} | 2005 CXFA_FontMgr::~CXFA_FontMgr() {} |
| 2004 | 2006 |
| 2005 IFGAS_Font* CXFA_FontMgr::GetFont(CXFA_FFDoc* hDoc, | 2007 CFGAS_GEFont* CXFA_FontMgr::GetFont(CXFA_FFDoc* hDoc, |
| 2006 const CFX_WideStringC& wsFontFamily, | 2008 const CFX_WideStringC& wsFontFamily, |
| 2007 uint32_t dwFontStyles, | 2009 uint32_t dwFontStyles, |
| 2008 uint16_t wCodePage) { | 2010 uint16_t wCodePage) { |
| 2009 uint32_t dwHash = FX_HashCode_GetW(wsFontFamily, false); | 2011 uint32_t dwHash = FX_HashCode_GetW(wsFontFamily, false); |
| 2010 CFX_ByteString bsKey; | 2012 CFX_ByteString bsKey; |
| 2011 bsKey.Format("%u%u%u", dwHash, dwFontStyles, wCodePage); | 2013 bsKey.Format("%u%u%u", dwHash, dwFontStyles, wCodePage); |
| 2012 auto iter = m_FontMap.find(bsKey); | 2014 auto iter = m_FontMap.find(bsKey); |
| 2013 if (iter != m_FontMap.end()) | 2015 if (iter != m_FontMap.end()) |
| 2014 return iter->second; | 2016 return iter->second; |
| 2015 CFX_WideString wsEnglishName; | 2017 CFX_WideString wsEnglishName; |
| 2016 XFA_LocalFontNameToEnglishName(wsFontFamily, wsEnglishName); | 2018 XFA_LocalFontNameToEnglishName(wsFontFamily, wsEnglishName); |
| 2017 auto it = m_PDFFontMgrMap.find(hDoc); | 2019 auto it = m_PDFFontMgrMap.find(hDoc); |
| 2018 CXFA_PDFFontMgr* pMgr = | 2020 CXFA_PDFFontMgr* pMgr = |
| 2019 it != m_PDFFontMgrMap.end() ? it->second.get() : nullptr; | 2021 it != m_PDFFontMgrMap.end() ? it->second.get() : nullptr; |
| 2020 CPDF_Font* pPDFFont = nullptr; | 2022 CPDF_Font* pPDFFont = nullptr; |
| 2021 IFGAS_Font* pFont = nullptr; | 2023 CFGAS_GEFont* pFont = nullptr; |
| 2022 if (pMgr) { | 2024 if (pMgr) { |
| 2023 pFont = pMgr->GetFont(wsEnglishName.AsStringC(), dwFontStyles, &pPDFFont); | 2025 pFont = pMgr->GetFont(wsEnglishName.AsStringC(), dwFontStyles, &pPDFFont); |
| 2024 if (pFont) | 2026 if (pFont) |
| 2025 return pFont; | 2027 return pFont; |
| 2026 } | 2028 } |
| 2027 if (!pFont && m_pDefFontMgr) | 2029 if (!pFont && m_pDefFontMgr) |
| 2028 pFont = m_pDefFontMgr->GetFont(hDoc, wsFontFamily, dwFontStyles, wCodePage); | 2030 pFont = m_pDefFontMgr->GetFont(hDoc, wsFontFamily, dwFontStyles, wCodePage); |
| 2029 | 2031 |
| 2030 if (!pFont && pMgr) { | 2032 if (!pFont && pMgr) { |
| 2031 pPDFFont = nullptr; | 2033 pPDFFont = nullptr; |
| (...skipping 21 matching lines...) Expand all Loading... |
| 2053 m_PDFFontMgrMap[hDoc].reset(new CXFA_PDFFontMgr(hDoc)); | 2055 m_PDFFontMgrMap[hDoc].reset(new CXFA_PDFFontMgr(hDoc)); |
| 2054 } | 2056 } |
| 2055 | 2057 |
| 2056 void CXFA_FontMgr::ReleaseDocFonts(CXFA_FFDoc* hDoc) { | 2058 void CXFA_FontMgr::ReleaseDocFonts(CXFA_FFDoc* hDoc) { |
| 2057 m_PDFFontMgrMap.erase(hDoc); | 2059 m_PDFFontMgrMap.erase(hDoc); |
| 2058 } | 2060 } |
| 2059 | 2061 |
| 2060 void CXFA_FontMgr::SetDefFontMgr(std::unique_ptr<CXFA_DefFontMgr> pFontMgr) { | 2062 void CXFA_FontMgr::SetDefFontMgr(std::unique_ptr<CXFA_DefFontMgr> pFontMgr) { |
| 2061 m_pDefFontMgr = std::move(pFontMgr); | 2063 m_pDefFontMgr = std::move(pFontMgr); |
| 2062 } | 2064 } |
| OLD | NEW |