Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4)

Side by Side Diff: xfa/fxfa/app/xfa_fontmgr.cpp

Issue 2609423003: Properly ref-count CFGAS_GEFont with CFX_RetainPtr. (Closed)
Patch Set: comments Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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/xfa_fontmgr.h" 7 #include "xfa/fxfa/xfa_fontmgr.h"
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <memory> 10 #include <memory>
(...skipping 1722 matching lines...) Expand 10 before | Expand all | Expand 10 after
1733 }); 1733 });
1734 if (pFontInfo < pEnd && pFontInfo->dwFontNameHash == dwCurFontNameHash) 1734 if (pFontInfo < pEnd && pFontInfo->dwFontNameHash == dwCurFontNameHash)
1735 return pFontInfo; 1735 return pFontInfo;
1736 return nullptr; 1736 return nullptr;
1737 } 1737 }
1738 1738
1739 } // namespace 1739 } // namespace
1740 1740
1741 CXFA_DefFontMgr::CXFA_DefFontMgr() {} 1741 CXFA_DefFontMgr::CXFA_DefFontMgr() {}
1742 1742
1743 CXFA_DefFontMgr::~CXFA_DefFontMgr() { 1743 CXFA_DefFontMgr::~CXFA_DefFontMgr() {}
1744 for (int32_t i = 0; i < m_CacheFonts.GetSize(); i++)
1745 m_CacheFonts[i]->Release();
1746 }
1747 1744
1748 CFGAS_GEFont* CXFA_DefFontMgr::GetFont(CXFA_FFDoc* hDoc, 1745 CFX_RetainPtr<CFGAS_GEFont> CXFA_DefFontMgr::GetFont(
1749 const CFX_WideStringC& wsFontFamily, 1746 CXFA_FFDoc* hDoc,
1750 uint32_t dwFontStyles, 1747 const CFX_WideStringC& wsFontFamily,
1751 uint16_t wCodePage) { 1748 uint32_t dwFontStyles,
1749 uint16_t wCodePage) {
1752 CFX_WideString wsFontName(wsFontFamily); 1750 CFX_WideString wsFontName(wsFontFamily);
1753 CFGAS_FontMgr* pFDEFontMgr = hDoc->GetApp()->GetFDEFontMgr(); 1751 CFGAS_FontMgr* pFDEFontMgr = hDoc->GetApp()->GetFDEFontMgr();
1754 CFGAS_GEFont* pFont = 1752 CFX_RetainPtr<CFGAS_GEFont> pFont =
1755 pFDEFontMgr->LoadFont(wsFontName.c_str(), dwFontStyles, wCodePage); 1753 pFDEFontMgr->LoadFont(wsFontName.c_str(), dwFontStyles, wCodePage);
1756 if (!pFont) { 1754 if (!pFont) {
1757 const XFA_FONTINFO* pCurFont = 1755 const XFA_FONTINFO* pCurFont =
1758 XFA_GetFontINFOByFontName(wsFontName.AsStringC()); 1756 XFA_GetFontINFOByFontName(wsFontName.AsStringC());
1759 if (pCurFont && pCurFont->pReplaceFont) { 1757 if (pCurFont && pCurFont->pReplaceFont) {
1760 uint32_t dwStyle = 0; 1758 uint32_t dwStyle = 0;
1761 if (dwFontStyles & FX_FONTSTYLE_Bold) { 1759 if (dwFontStyles & FX_FONTSTYLE_Bold) {
1762 dwStyle |= FX_FONTSTYLE_Bold; 1760 dwStyle |= FX_FONTSTYLE_Bold;
1763 } 1761 }
1764 if (dwFontStyles & FX_FONTSTYLE_Italic) { 1762 if (dwFontStyles & FX_FONTSTYLE_Italic) {
(...skipping 13 matching lines...) Expand all
1778 if (pFont) 1776 if (pFont)
1779 break; 1777 break;
1780 1778
1781 iLength--; 1779 iLength--;
1782 pNameText++; 1780 pNameText++;
1783 pReplace = pNameText; 1781 pReplace = pNameText;
1784 } 1782 }
1785 } 1783 }
1786 } 1784 }
1787 if (pFont) 1785 if (pFont)
1788 m_CacheFonts.Add(pFont); 1786 m_CacheFonts.push_back(pFont);
1789 return pFont; 1787 return pFont;
1790 } 1788 }
1791 1789
1792 CFGAS_GEFont* CXFA_DefFontMgr::GetDefaultFont( 1790 CFX_RetainPtr<CFGAS_GEFont> CXFA_DefFontMgr::GetDefaultFont(
1793 CXFA_FFDoc* hDoc, 1791 CXFA_FFDoc* hDoc,
1794 const CFX_WideStringC& wsFontFamily, 1792 const CFX_WideStringC& wsFontFamily,
1795 uint32_t dwFontStyles, 1793 uint32_t dwFontStyles,
1796 uint16_t wCodePage) { 1794 uint16_t wCodePage) {
1797 CFGAS_FontMgr* pFDEFontMgr = hDoc->GetApp()->GetFDEFontMgr(); 1795 CFGAS_FontMgr* pFDEFontMgr = hDoc->GetApp()->GetFDEFontMgr();
1798 CFGAS_GEFont* pFont = 1796 CFX_RetainPtr<CFGAS_GEFont> pFont =
1799 pFDEFontMgr->LoadFont(L"Arial Narrow", dwFontStyles, wCodePage); 1797 pFDEFontMgr->LoadFont(L"Arial Narrow", dwFontStyles, wCodePage);
1800 if (!pFont) { 1798 if (!pFont) {
1801 pFont = pFDEFontMgr->LoadFont(static_cast<const FX_WCHAR*>(nullptr), 1799 pFont = pFDEFontMgr->LoadFont(static_cast<const FX_WCHAR*>(nullptr),
1802 dwFontStyles, wCodePage); 1800 dwFontStyles, wCodePage);
1803 } 1801 }
1804
1805 ASSERT(pFont);
1806 if (pFont) 1802 if (pFont)
1807 m_CacheFonts.Add(pFont); 1803 m_CacheFonts.push_back(pFont);
1808 return pFont; 1804 return pFont;
1809 } 1805 }
1810 1806
1811 CXFA_PDFFontMgr::CXFA_PDFFontMgr(CXFA_FFDoc* pDoc) : m_pDoc(pDoc) {} 1807 CXFA_PDFFontMgr::CXFA_PDFFontMgr(CXFA_FFDoc* pDoc) : m_pDoc(pDoc) {}
1812 1808
1813 CXFA_PDFFontMgr::~CXFA_PDFFontMgr() { 1809 CXFA_PDFFontMgr::~CXFA_PDFFontMgr() {}
1814 for (const auto& pair : m_FontMap) {
1815 if (pair.second)
1816 pair.second->Release();
1817 }
1818 }
1819 1810
1820 CFGAS_GEFont* CXFA_PDFFontMgr::FindFont(const CFX_ByteString& strPsName, 1811 CFX_RetainPtr<CFGAS_GEFont> CXFA_PDFFontMgr::FindFont(
1821 bool bBold, 1812 const CFX_ByteString& strPsName,
1822 bool bItalic, 1813 bool bBold,
1823 CPDF_Font** pDstPDFFont, 1814 bool bItalic,
1824 bool bStrictMatch) { 1815 CPDF_Font** pDstPDFFont,
1816 bool bStrictMatch) {
1825 CPDF_Document* pDoc = m_pDoc->GetPDFDoc(); 1817 CPDF_Document* pDoc = m_pDoc->GetPDFDoc();
1826 if (!pDoc) { 1818 if (!pDoc)
1827 return nullptr; 1819 return nullptr;
1828 } 1820
1829 CPDF_Dictionary* pFontSetDict = 1821 CPDF_Dictionary* pFontSetDict =
1830 pDoc->GetRoot()->GetDictFor("AcroForm")->GetDictFor("DR"); 1822 pDoc->GetRoot()->GetDictFor("AcroForm")->GetDictFor("DR");
1831 if (!pFontSetDict) { 1823 if (!pFontSetDict)
1832 return nullptr; 1824 return nullptr;
1833 } 1825
1834 pFontSetDict = pFontSetDict->GetDictFor("Font"); 1826 pFontSetDict = pFontSetDict->GetDictFor("Font");
1835 if (!pFontSetDict) { 1827 if (!pFontSetDict)
1836 return nullptr; 1828 return nullptr;
1837 } 1829
1838 CFX_ByteString name = strPsName; 1830 CFX_ByteString name = strPsName;
1839 name.Remove(' '); 1831 name.Remove(' ');
1840 CFGAS_FontMgr* pFDEFontMgr = m_pDoc->GetApp()->GetFDEFontMgr(); 1832 CFGAS_FontMgr* pFDEFontMgr = m_pDoc->GetApp()->GetFDEFontMgr();
1841 for (const auto& it : *pFontSetDict) { 1833 for (const auto& it : *pFontSetDict) {
1842 const CFX_ByteString& key = it.first; 1834 const CFX_ByteString& key = it.first;
1843 CPDF_Object* pObj = it.second.get(); 1835 CPDF_Object* pObj = it.second.get();
1844 if (!PsNameMatchDRFontName(name.AsStringC(), bBold, bItalic, key, 1836 if (!PsNameMatchDRFontName(name.AsStringC(), bBold, bItalic, key,
1845 bStrictMatch)) { 1837 bStrictMatch)) {
1846 continue; 1838 continue;
1847 } 1839 }
1848 CPDF_Dictionary* pFontDict = ToDictionary(pObj->GetDirect()); 1840 CPDF_Dictionary* pFontDict = ToDictionary(pObj->GetDirect());
1849 if (!pFontDict || pFontDict->GetStringFor("Type") != "Font") { 1841 if (!pFontDict || pFontDict->GetStringFor("Type") != "Font") {
1850 return nullptr; 1842 return nullptr;
1851 } 1843 }
1852 CPDF_Font* pPDFFont = pDoc->LoadFont(pFontDict); 1844 CPDF_Font* pPDFFont = pDoc->LoadFont(pFontDict);
1853 if (!pPDFFont) { 1845 if (!pPDFFont) {
1854 return nullptr; 1846 return nullptr;
1855 } 1847 }
1856 if (!pPDFFont->IsEmbedded()) { 1848 if (!pPDFFont->IsEmbedded()) {
1857 *pDstPDFFont = pPDFFont; 1849 *pDstPDFFont = pPDFFont;
1858 return nullptr; 1850 return nullptr;
1859 } 1851 }
1860 return CFGAS_GEFont::LoadFont(&pPDFFont->m_Font, pFDEFontMgr); 1852 return CFGAS_GEFont::LoadFont(&pPDFFont->m_Font, pFDEFontMgr);
1861 } 1853 }
1862 return nullptr; 1854 return nullptr;
1863 } 1855 }
1864 1856
1865 CFGAS_GEFont* CXFA_PDFFontMgr::GetFont(const CFX_WideStringC& wsFontFamily, 1857 CFX_RetainPtr<CFGAS_GEFont> CXFA_PDFFontMgr::GetFont(
1866 uint32_t dwFontStyles, 1858 const CFX_WideStringC& wsFontFamily,
1867 CPDF_Font** pPDFFont, 1859 uint32_t dwFontStyles,
1868 bool bStrictMatch) { 1860 CPDF_Font** pPDFFont,
1861 bool bStrictMatch) {
1869 uint32_t dwHashCode = FX_HashCode_GetW(wsFontFamily, false); 1862 uint32_t dwHashCode = FX_HashCode_GetW(wsFontFamily, false);
1870 CFX_ByteString strKey; 1863 CFX_ByteString strKey;
1871 strKey.Format("%u%u", dwHashCode, dwFontStyles); 1864 strKey.Format("%u%u", dwHashCode, dwFontStyles);
1872 auto it = m_FontMap.find(strKey); 1865 auto it = m_FontMap.find(strKey);
1873 if (it != m_FontMap.end()) 1866 if (it != m_FontMap.end())
1874 return it->second; 1867 return it->second;
1875 CFX_ByteString bsPsName = 1868 CFX_ByteString bsPsName =
1876 CFX_ByteString::FromUnicode(CFX_WideString(wsFontFamily)); 1869 CFX_ByteString::FromUnicode(CFX_WideString(wsFontFamily));
1877 bool bBold = (dwFontStyles & FX_FONTSTYLE_Bold) == FX_FONTSTYLE_Bold; 1870 bool bBold = (dwFontStyles & FX_FONTSTYLE_Bold) == FX_FONTSTYLE_Bold;
1878 bool bItalic = (dwFontStyles & FX_FONTSTYLE_Italic) == FX_FONTSTYLE_Italic; 1871 bool bItalic = (dwFontStyles & FX_FONTSTYLE_Italic) == FX_FONTSTYLE_Italic;
1879 CFX_ByteString strFontName = PsNameToFontName(bsPsName, bBold, bItalic); 1872 CFX_ByteString strFontName = PsNameToFontName(bsPsName, bBold, bItalic);
1880 CFGAS_GEFont* pFont = 1873 CFX_RetainPtr<CFGAS_GEFont> pFont =
1881 FindFont(strFontName, bBold, bItalic, pPDFFont, bStrictMatch); 1874 FindFont(strFontName, bBold, bItalic, pPDFFont, bStrictMatch);
1882 if (pFont) 1875 if (pFont)
1883 m_FontMap[strKey] = pFont; 1876 m_FontMap[strKey] = pFont;
1884 return pFont; 1877 return pFont;
1885 } 1878 }
1886 1879
1887 CFX_ByteString CXFA_PDFFontMgr::PsNameToFontName( 1880 CFX_ByteString CXFA_PDFFontMgr::PsNameToFontName(
1888 const CFX_ByteString& strPsName, 1881 const CFX_ByteString& strPsName,
1889 bool bBold, 1882 bool bBold,
1890 bool bItalic) { 1883 bool bItalic) {
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
1968 } break; 1961 } break;
1969 default: 1962 default:
1970 break; 1963 break;
1971 } 1964 }
1972 return bMatch; 1965 return bMatch;
1973 } 1966 }
1974 } 1967 }
1975 return true; 1968 return true;
1976 } 1969 }
1977 1970
1978 bool CXFA_PDFFontMgr::GetCharWidth(const CFGAS_GEFont* pFont, 1971 bool CXFA_PDFFontMgr::GetCharWidth(const CFX_RetainPtr<CFGAS_GEFont>& pFont,
1979 FX_WCHAR wUnicode, 1972 FX_WCHAR wUnicode,
1980 bool bCharCode, 1973 bool bCharCode,
1981 int32_t* pWidth) { 1974 int32_t* pWidth) {
1982 if (wUnicode != 0x20 || bCharCode) 1975 if (wUnicode != 0x20 || bCharCode)
1983 return false; 1976 return false;
1984 1977
1985 auto it = m_FDE2PDFFont.find(pFont); 1978 auto it = m_FDE2PDFFont.find(pFont);
1986 if (it == m_FDE2PDFFont.end()) 1979 if (it == m_FDE2PDFFont.end())
1987 return false; 1980 return false;
1988 1981
1989 CPDF_Font* pPDFFont = it->second; 1982 CPDF_Font* pPDFFont = it->second;
1990 *pWidth = pPDFFont->GetCharWidthF(pPDFFont->CharCodeFromUnicode(wUnicode)); 1983 *pWidth = pPDFFont->GetCharWidthF(pPDFFont->CharCodeFromUnicode(wUnicode));
1991 return true; 1984 return true;
1992 } 1985 }
1993 1986
1994 void CXFA_PDFFontMgr::SetFont(const CFGAS_GEFont* pFont, CPDF_Font* pPDFFont) { 1987 void CXFA_PDFFontMgr::SetFont(const CFX_RetainPtr<CFGAS_GEFont>& pFont,
1988 CPDF_Font* pPDFFont) {
1995 m_FDE2PDFFont[pFont] = pPDFFont; 1989 m_FDE2PDFFont[pFont] = pPDFFont;
1996 } 1990 }
1997 1991
1998 CXFA_FontMgr::CXFA_FontMgr() {} 1992 CXFA_FontMgr::CXFA_FontMgr() {}
1999 1993
2000 CXFA_FontMgr::~CXFA_FontMgr() {} 1994 CXFA_FontMgr::~CXFA_FontMgr() {}
2001 1995
2002 CFGAS_GEFont* CXFA_FontMgr::GetFont(CXFA_FFDoc* hDoc, 1996 CFX_RetainPtr<CFGAS_GEFont> CXFA_FontMgr::GetFont(
2003 const CFX_WideStringC& wsFontFamily, 1997 CXFA_FFDoc* hDoc,
2004 uint32_t dwFontStyles, 1998 const CFX_WideStringC& wsFontFamily,
2005 uint16_t wCodePage) { 1999 uint32_t dwFontStyles,
2000 uint16_t wCodePage) {
2006 uint32_t dwHash = FX_HashCode_GetW(wsFontFamily, false); 2001 uint32_t dwHash = FX_HashCode_GetW(wsFontFamily, false);
2007 CFX_ByteString bsKey; 2002 CFX_ByteString bsKey;
2008 bsKey.Format("%u%u%u", dwHash, dwFontStyles, wCodePage); 2003 bsKey.Format("%u%u%u", dwHash, dwFontStyles, wCodePage);
2009 auto iter = m_FontMap.find(bsKey); 2004 auto iter = m_FontMap.find(bsKey);
2010 if (iter != m_FontMap.end()) 2005 if (iter != m_FontMap.end())
2011 return iter->second; 2006 return iter->second;
2012 2007
2013 CFX_WideString wsEnglishName = XFA_LocalFontNameToEnglishName(wsFontFamily); 2008 CFX_WideString wsEnglishName = XFA_LocalFontNameToEnglishName(wsFontFamily);
2014 auto it = m_PDFFontMgrMap.find(hDoc); 2009 auto it = m_PDFFontMgrMap.find(hDoc);
2015 CXFA_PDFFontMgr* pMgr = 2010 CXFA_PDFFontMgr* pMgr =
2016 it != m_PDFFontMgrMap.end() ? it->second.get() : nullptr; 2011 it != m_PDFFontMgrMap.end() ? it->second.get() : nullptr;
2017 CPDF_Font* pPDFFont = nullptr; 2012 CPDF_Font* pPDFFont = nullptr;
2018 CFGAS_GEFont* pFont = nullptr; 2013 CFX_RetainPtr<CFGAS_GEFont> pFont;
2019 if (pMgr) { 2014 if (pMgr) {
2020 pFont = 2015 pFont =
2021 pMgr->GetFont(wsEnglishName.AsStringC(), dwFontStyles, &pPDFFont, true); 2016 pMgr->GetFont(wsEnglishName.AsStringC(), dwFontStyles, &pPDFFont, true);
2022 if (pFont) 2017 if (pFont)
2023 return pFont; 2018 return pFont;
2024 } 2019 }
2025 if (!pFont && m_pDefFontMgr) 2020 if (!pFont && m_pDefFontMgr)
2026 pFont = m_pDefFontMgr->GetFont(hDoc, wsFontFamily, dwFontStyles, wCodePage); 2021 pFont = m_pDefFontMgr->GetFont(hDoc, wsFontFamily, dwFontStyles, wCodePage);
2027 2022
2028 if (!pFont && pMgr) { 2023 if (!pFont && pMgr) {
(...skipping 22 matching lines...) Expand all
2051 m_PDFFontMgrMap[hDoc] = pdfium::MakeUnique<CXFA_PDFFontMgr>(hDoc); 2046 m_PDFFontMgrMap[hDoc] = pdfium::MakeUnique<CXFA_PDFFontMgr>(hDoc);
2052 } 2047 }
2053 2048
2054 void CXFA_FontMgr::ReleaseDocFonts(CXFA_FFDoc* hDoc) { 2049 void CXFA_FontMgr::ReleaseDocFonts(CXFA_FFDoc* hDoc) {
2055 m_PDFFontMgrMap.erase(hDoc); 2050 m_PDFFontMgrMap.erase(hDoc);
2056 } 2051 }
2057 2052
2058 void CXFA_FontMgr::SetDefFontMgr(std::unique_ptr<CXFA_DefFontMgr> pFontMgr) { 2053 void CXFA_FontMgr::SetDefFontMgr(std::unique_ptr<CXFA_DefFontMgr> pFontMgr) {
2059 m_pDefFontMgr = std::move(pFontMgr); 2054 m_pDefFontMgr = std::move(pFontMgr);
2060 } 2055 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698