summaryrefslogtreecommitdiff
path: root/xfa/fgas
diff options
context:
space:
mode:
authorDan Sinclair <dsinclair@chromium.org>2017-09-21 09:46:03 -0400
committerChromium commit bot <commit-bot@chromium.org>2017-09-21 18:34:29 +0000
commitdb0312e6acd7cc15fef0f64e05bd463cb74c70e4 (patch)
tree6ffb772e0f29f65c414adaeececc0c8e3047805d /xfa/fgas
parent46fc3fa47dc5c863519c5c3d834319b80bf5ff4a (diff)
downloadpdfium-db0312e6acd7cc15fef0f64e05bd463cb74c70e4.tar.xz
Move CXFA_PDFFontMgr to CFGAS_PDFFontMgr
XFA bits passed into the PDFFontMgr are just used to get the CPDF_Document and the CFGAS_FontMgr. This CL changes the code to pass those two things into the constructor. Then, the fxfa/cxfa_pdffontmgr.* code has been moved to fgas/cfgas_pdffontmgr.* to show it doesn't depend on any of the XFA classes. Change-Id: I21d791869e2a32ffedfd7c87bb3bbd035232d991 Reviewed-on: https://pdfium-review.googlesource.com/14550 Commit-Queue: dsinclair <dsinclair@chromium.org> Reviewed-by: Henrique Nakashima <hnakashima@chromium.org> Reviewed-by: Tom Sepez <tsepez@chromium.org>
Diffstat (limited to 'xfa/fgas')
-rw-r--r--xfa/fgas/font/cfgas_fontmgr.h2
-rw-r--r--xfa/fgas/font/cfgas_gefont.cpp1
-rw-r--r--xfa/fgas/font/cfgas_gefont.h6
-rw-r--r--xfa/fgas/font/cfgas_pdffontmgr.cpp207
-rw-r--r--xfa/fgas/font/cfgas_pdffontmgr.h59
5 files changed, 270 insertions, 5 deletions
diff --git a/xfa/fgas/font/cfgas_fontmgr.h b/xfa/fgas/font/cfgas_fontmgr.h
index 8e970361b4..946486be2a 100644
--- a/xfa/fgas/font/cfgas_fontmgr.h
+++ b/xfa/fgas/font/cfgas_fontmgr.h
@@ -21,7 +21,7 @@
#include "core/fxge/cfx_fontmapper.h"
#include "core/fxge/fx_freetype.h"
#include "core/fxge/ifx_systemfontinfo.h"
-#include "xfa/fxfa/cxfa_pdffontmgr.h"
+#include "xfa/fgas/font/cfgas_pdffontmgr.h"
#define FX_FONTSTYLE_Normal 0x00
#define FX_FONTSTYLE_FixedPitch 0x01
diff --git a/xfa/fgas/font/cfgas_gefont.cpp b/xfa/fgas/font/cfgas_gefont.cpp
index c710ed96b0..404b23cf7b 100644
--- a/xfa/fgas/font/cfgas_gefont.cpp
+++ b/xfa/fgas/font/cfgas_gefont.cpp
@@ -15,7 +15,6 @@
#include "core/fxge/cfx_unicodeencodingex.h"
#include "third_party/base/ptr_util.h"
#include "xfa/fgas/font/fgas_fontutils.h"
-#include "xfa/fxfa/cxfa_fontmgr.h"
// static
CFX_RetainPtr<CFGAS_GEFont> CFGAS_GEFont::LoadFont(const wchar_t* pszFontFamily,
diff --git a/xfa/fgas/font/cfgas_gefont.h b/xfa/fgas/font/cfgas_gefont.h
index 13ac48f9cb..c83fc4319d 100644
--- a/xfa/fgas/font/cfgas_gefont.h
+++ b/xfa/fgas/font/cfgas_gefont.h
@@ -15,7 +15,7 @@
#include "core/fxcrt/cfx_unowned_ptr.h"
#include "core/fxcrt/fx_memory.h"
#include "xfa/fgas/font/cfgas_fontmgr.h"
-#include "xfa/fxfa/cxfa_pdffontmgr.h"
+#include "xfa/fgas/font/cfgas_pdffontmgr.h"
#define FXFONT_SUBST_ITALIC 0x02
@@ -50,7 +50,7 @@ class CFGAS_GEFont : public CFX_Retainable {
bool GetBBox(CFX_Rect* bbox);
CFX_RetainPtr<CFGAS_GEFont> GetSubstFont(int32_t iGlyphIndex);
CFX_Font* GetDevFont() const { return m_pFont; }
- void SetFontProvider(CXFA_PDFFontMgr* pProvider) {
+ void SetFontProvider(CFGAS_PDFFontMgr* pProvider) {
m_pProvider.Reset(pProvider);
}
#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
@@ -99,7 +99,7 @@ class CFGAS_GEFont : public CFX_Retainable {
bool m_bExternalFont;
CFX_RetainPtr<CFGAS_GEFont> m_pSrcFont; // Only set by ctor, so no cycles.
CFGAS_FontMgr::ObservedPtr m_pFontMgr;
- CXFA_PDFFontMgr::ObservedPtr m_pProvider;
+ CFGAS_PDFFontMgr::ObservedPtr m_pProvider;
CFX_RetainPtr<CFX_SeekableStreamProxy> m_pStream;
CFX_RetainPtr<IFX_SeekableReadStream> m_pFileRead;
std::unique_ptr<CFX_UnicodeEncoding> m_pFontEncoding;
diff --git a/xfa/fgas/font/cfgas_pdffontmgr.cpp b/xfa/fgas/font/cfgas_pdffontmgr.cpp
new file mode 100644
index 0000000000..2b8e30e5ee
--- /dev/null
+++ b/xfa/fgas/font/cfgas_pdffontmgr.cpp
@@ -0,0 +1,207 @@
+// Copyright 2017 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fgas/font/cfgas_pdffontmgr.h"
+
+#include <algorithm>
+
+#include "core/fpdfapi/font/cpdf_font.h"
+#include "core/fpdfapi/parser/cpdf_document.h"
+#include "xfa/fgas/font/cfgas_fontmgr.h"
+#include "xfa/fgas/font/cfgas_gefont.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"},
+};
+
+} // namespace
+
+CFGAS_PDFFontMgr::CFGAS_PDFFontMgr(CPDF_Document* pDoc, CFGAS_FontMgr* pFontMgr)
+ : m_pDoc(pDoc), m_pFontMgr(pFontMgr) {
+ ASSERT(pDoc);
+ ASSERT(pFontMgr);
+}
+
+CFGAS_PDFFontMgr::~CFGAS_PDFFontMgr() {}
+
+CFX_RetainPtr<CFGAS_GEFont> CFGAS_PDFFontMgr::FindFont(
+ const ByteString& strPsName,
+ bool bBold,
+ bool bItalic,
+ CPDF_Font** pDstPDFFont,
+ bool bStrictMatch) {
+ CPDF_Dictionary* pFontSetDict =
+ m_pDoc->GetRoot()->GetDictFor("AcroForm")->GetDictFor("DR");
+ if (!pFontSetDict)
+ return nullptr;
+
+ pFontSetDict = pFontSetDict->GetDictFor("Font");
+ if (!pFontSetDict)
+ return nullptr;
+
+ ByteString name = strPsName;
+ name.Remove(' ');
+ for (const auto& it : *pFontSetDict) {
+ const ByteString& key = it.first;
+ CPDF_Object* pObj = it.second.get();
+ if (!PsNameMatchDRFontName(name.AsStringView(), bBold, bItalic, key,
+ bStrictMatch)) {
+ continue;
+ }
+ CPDF_Dictionary* pFontDict = ToDictionary(pObj->GetDirect());
+ if (!pFontDict || pFontDict->GetStringFor("Type") != "Font")
+ return nullptr;
+
+ CPDF_Font* pPDFFont = m_pDoc->LoadFont(pFontDict);
+ if (!pPDFFont)
+ return nullptr;
+
+ if (!pPDFFont->IsEmbedded()) {
+ *pDstPDFFont = pPDFFont;
+ return nullptr;
+ }
+ return CFGAS_GEFont::LoadFont(pPDFFont->GetFont(), m_pFontMgr.Get());
+ }
+ return nullptr;
+}
+
+CFX_RetainPtr<CFGAS_GEFont> CFGAS_PDFFontMgr::GetFont(
+ const WideStringView& wsFontFamily,
+ uint32_t dwFontStyles,
+ CPDF_Font** pPDFFont,
+ bool bStrictMatch) {
+ uint32_t dwHashCode = FX_HashCode_GetW(wsFontFamily, false);
+ ByteString strKey;
+ strKey.Format("%u%u", dwHashCode, dwFontStyles);
+ auto it = m_FontMap.find(strKey);
+ if (it != m_FontMap.end())
+ return it->second;
+
+ ByteString bsPsName = ByteString::FromUnicode(WideString(wsFontFamily));
+ bool bBold = (dwFontStyles & FX_FONTSTYLE_Bold) == FX_FONTSTYLE_Bold;
+ bool bItalic = (dwFontStyles & FX_FONTSTYLE_Italic) == FX_FONTSTYLE_Italic;
+ ByteString strFontName = PsNameToFontName(bsPsName, bBold, bItalic);
+ CFX_RetainPtr<CFGAS_GEFont> pFont =
+ FindFont(strFontName, bBold, bItalic, pPDFFont, bStrictMatch);
+ if (pFont)
+ m_FontMap[strKey] = pFont;
+
+ return pFont;
+}
+
+ByteString CFGAS_PDFFontMgr::PsNameToFontName(const ByteString& strPsName,
+ 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;
+}
+
+bool CFGAS_PDFFontMgr::PsNameMatchDRFontName(const ByteStringView& bsPsName,
+ bool bBold,
+ bool bItalic,
+ const ByteString& bsDRFontName,
+ bool bStrictMatch) {
+ ByteString bsDRName = bsDRFontName;
+ bsDRName.Remove('-');
+ FX_STRSIZE iPsLen = bsPsName.GetLength();
+ auto nIndex = bsDRName.Find(bsPsName);
+ if (nIndex.has_value() && !bStrictMatch)
+ return true;
+
+ if (!nIndex.has_value() || nIndex.value() != 0)
+ return false;
+
+ FX_STRSIZE iDifferLength = bsDRName.GetLength() - iPsLen;
+ if (iDifferLength > 1 || (bBold || bItalic)) {
+ auto iBoldIndex = bsDRName.Find("Bold");
+ if (bBold != iBoldIndex.has_value())
+ return false;
+
+ if (iBoldIndex.has_value()) {
+ iDifferLength = std::min(iDifferLength - 4,
+ bsDRName.GetLength() - iBoldIndex.value() - 4);
+ }
+ bool bItalicFont = true;
+ if (bsDRName.Contains("Italic"))
+ iDifferLength -= 6;
+ else if (bsDRName.Contains("It"))
+ iDifferLength -= 2;
+ else if (bsDRName.Contains("Oblique"))
+ iDifferLength -= 7;
+ else
+ bItalicFont = false;
+
+ if (bItalic != bItalicFont)
+ return false;
+
+ if (iDifferLength > 1) {
+ ByteString bsDRTailer = bsDRName.Right(iDifferLength);
+ if (bsDRTailer == "MT" || bsDRTailer == "PSMT" ||
+ bsDRTailer == "Regular" || bsDRTailer == "Reg") {
+ return true;
+ }
+ if (iBoldIndex.has_value() || bItalicFont)
+ return false;
+
+ bool bMatch = false;
+ switch (bsPsName[iPsLen - 1]) {
+ case 'L':
+ if (bsDRName.Right(5) == "Light")
+ bMatch = true;
+
+ break;
+ case 'R':
+ if (bsDRName.Right(7) == "Regular" || bsDRName.Right(3) == "Reg")
+ bMatch = true;
+
+ break;
+ case 'M':
+ if (bsDRName.Right(5) == "Medium")
+ bMatch = true;
+ break;
+ default:
+ break;
+ }
+ return bMatch;
+ }
+ }
+ return true;
+}
+
+bool CFGAS_PDFFontMgr::GetCharWidth(const CFX_RetainPtr<CFGAS_GEFont>& pFont,
+ wchar_t wUnicode,
+ bool bCharCode,
+ int32_t* pWidth) {
+ if (wUnicode != 0x20 || bCharCode)
+ return false;
+
+ auto it = m_FDE2PDFFont.find(pFont);
+ if (it == m_FDE2PDFFont.end())
+ return false;
+
+ CPDF_Font* pPDFFont = it->second;
+ *pWidth = pPDFFont->GetCharWidthF(pPDFFont->CharCodeFromUnicode(wUnicode));
+ return true;
+}
+
+void CFGAS_PDFFontMgr::SetFont(const CFX_RetainPtr<CFGAS_GEFont>& pFont,
+ CPDF_Font* pPDFFont) {
+ m_FDE2PDFFont[pFont] = pPDFFont;
+}
diff --git a/xfa/fgas/font/cfgas_pdffontmgr.h b/xfa/fgas/font/cfgas_pdffontmgr.h
new file mode 100644
index 0000000000..8a09a95bd1
--- /dev/null
+++ b/xfa/fgas/font/cfgas_pdffontmgr.h
@@ -0,0 +1,59 @@
+// Copyright 2017 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FGAS_FONT_CFGAS_PDFFONTMGR_H_
+#define XFA_FGAS_FONT_CFGAS_PDFFONTMGR_H_
+
+#include <map>
+
+#include "core/fpdfapi/parser/cpdf_dictionary.h"
+#include "core/fpdfapi/parser/cpdf_document.h"
+#include "core/fxcrt/cfx_observable.h"
+#include "core/fxcrt/cfx_retain_ptr.h"
+#include "core/fxcrt/fx_string.h"
+
+class CFGAS_FontMgr;
+class CFGAS_GEFont;
+class CPDF_Document;
+class CPDF_Font;
+
+class CFGAS_PDFFontMgr : public CFX_Observable<CFGAS_PDFFontMgr> {
+ public:
+ explicit CFGAS_PDFFontMgr(CPDF_Document* pDoc, CFGAS_FontMgr* pFontMgr);
+ ~CFGAS_PDFFontMgr();
+
+ CFX_RetainPtr<CFGAS_GEFont> GetFont(const WideStringView& wsFontFamily,
+ uint32_t dwFontStyles,
+ CPDF_Font** pPDFFont,
+ bool bStrictMatch);
+ bool GetCharWidth(const CFX_RetainPtr<CFGAS_GEFont>& pFont,
+ wchar_t wUnicode,
+ bool bCharCode,
+ int32_t* pWidth);
+ void SetFont(const CFX_RetainPtr<CFGAS_GEFont>& pFont, CPDF_Font* pPDFFont);
+
+ private:
+ CFX_RetainPtr<CFGAS_GEFont> FindFont(const ByteString& strFamilyName,
+ bool bBold,
+ bool bItalic,
+ CPDF_Font** pPDFFont,
+ bool bStrictMatch);
+ ByteString PsNameToFontName(const ByteString& strPsName,
+ bool bBold,
+ bool bItalic);
+ bool PsNameMatchDRFontName(const ByteStringView& bsPsName,
+ bool bBold,
+ bool bItalic,
+ const ByteString& bsDRFontName,
+ bool bStrictMatch);
+
+ CFX_UnownedPtr<CPDF_Document> const m_pDoc;
+ CFX_UnownedPtr<CFGAS_FontMgr> const m_pFontMgr;
+ std::map<CFX_RetainPtr<CFGAS_GEFont>, CPDF_Font*> m_FDE2PDFFont;
+ std::map<ByteString, CFX_RetainPtr<CFGAS_GEFont>> m_FontMap;
+};
+
+#endif // XFA_FGAS_FONT_CFGAS_PDFFONTMGR_H_