1 // Copyright 2016 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6
7 #include "core/fpdfdoc/cpvt_fontmap.h"
8
9 #include "core/fpdfapi/font/cpdf_font.h"
10 #include "core/fpdfapi/parser/cpdf_dictionary.h"
11 #include "core/fpdfapi/parser/cpdf_document.h"
12 #include "core/fpdfapi/parser/cpdf_reference.h"
13 #include "core/fpdfapi/parser/fpdf_parser_utility.h"
14 #include "core/fpdfdoc/cpdf_interactiveform.h"
15 #include "core/fxcrt/fx_codepage.h"
16 #include "third_party/base/logging.h"
17
CPVT_FontMap(CPDF_Document * pDoc,CPDF_Dictionary * pResDict,const RetainPtr<CPDF_Font> & pDefFont,const ByteString & sDefFontAlias)18 CPVT_FontMap::CPVT_FontMap(CPDF_Document* pDoc,
19 CPDF_Dictionary* pResDict,
20 const RetainPtr<CPDF_Font>& pDefFont,
21 const ByteString& sDefFontAlias)
22 : m_pDocument(pDoc),
23 m_pResDict(pResDict),
24 m_pDefFont(pDefFont),
25 m_sDefFontAlias(sDefFontAlias) {}
26
~CPVT_FontMap()27 CPVT_FontMap::~CPVT_FontMap() {}
28
29 // static
GetAnnotSysPDFFont(CPDF_Document * pDoc,CPDF_Dictionary * pResDict,ByteString * sSysFontAlias)30 RetainPtr<CPDF_Font> CPVT_FontMap::GetAnnotSysPDFFont(
31 CPDF_Document* pDoc,
32 CPDF_Dictionary* pResDict,
33 ByteString* sSysFontAlias) {
34 if (!pDoc || !pResDict)
35 return nullptr;
36
37 CPDF_Dictionary* pFormDict = pDoc->GetRoot()->GetDictFor("AcroForm");
38 RetainPtr<CPDF_Font> pPDFFont =
39 AddNativeInteractiveFormFont(pFormDict, pDoc, sSysFontAlias);
40 if (!pPDFFont)
41 return nullptr;
42
43 CPDF_Dictionary* pFontList = pResDict->GetDictFor("Font");
44 if (ValidateFontResourceDict(pFontList) &&
45 !pFontList->KeyExist(*sSysFontAlias)) {
46 pFontList->SetNewFor<CPDF_Reference>(*sSysFontAlias, pDoc,
47 pPDFFont->GetFontDict()->GetObjNum());
48 }
49 return pPDFFont;
50 }
51
GetPDFFont(int32_t nFontIndex)52 RetainPtr<CPDF_Font> CPVT_FontMap::GetPDFFont(int32_t nFontIndex) {
53 switch (nFontIndex) {
54 case 0:
55 return m_pDefFont;
56 case 1:
57 if (!m_pSysFont) {
58 m_pSysFont = GetAnnotSysPDFFont(m_pDocument.Get(), m_pResDict.Get(),
59 &m_sSysFontAlias);
60 }
61 return m_pSysFont;
62 default:
63 return nullptr;
64 }
65 }
66
GetPDFFontAlias(int32_t nFontIndex)67 ByteString CPVT_FontMap::GetPDFFontAlias(int32_t nFontIndex) {
68 switch (nFontIndex) {
69 case 0:
70 return m_sDefFontAlias;
71 case 1:
72 if (!m_pSysFont) {
73 m_pSysFont = GetAnnotSysPDFFont(m_pDocument.Get(), m_pResDict.Get(),
74 &m_sSysFontAlias);
75 }
76 return m_sSysFontAlias;
77 default:
78 return ByteString();
79 }
80 }
81
GetWordFontIndex(uint16_t word,int32_t charset,int32_t nFontIndex)82 int32_t CPVT_FontMap::GetWordFontIndex(uint16_t word,
83 int32_t charset,
84 int32_t nFontIndex) {
85 NOTREACHED();
86 return 0;
87 }
88
CharCodeFromUnicode(int32_t nFontIndex,uint16_t word)89 int32_t CPVT_FontMap::CharCodeFromUnicode(int32_t nFontIndex, uint16_t word) {
90 NOTREACHED();
91 return 0;
92 }
93
CharSetFromUnicode(uint16_t word,int32_t nOldCharset)94 int32_t CPVT_FontMap::CharSetFromUnicode(uint16_t word, int32_t nOldCharset) {
95 NOTREACHED();
96 return FX_CHARSET_ANSI;
97 }
98