14d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Copyright 2014 PDFium Authors. All rights reserved. 24d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Use of this source code is governed by a BSD-style license that can be 34d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// found in the LICENSE file. 44d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 54d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 64d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 74d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "fpdfsdk/formfiller/cba_fontmap.h" 84d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 94d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <utility> 104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/font/cpdf_font.h" 124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/page/cpdf_page.h" 134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/cpdf_document.h" 144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/cpdf_reference.h" 154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/cpdf_simple_parser.h" 164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/cpdf_stream.h" 174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/fpdf_parser_decode.h" 184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfdoc/cpdf_formfield.h" 194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxge/cfx_substfont.h" 204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "fpdfsdk/cpdfsdk_annot.h" 214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCBA_FontMap::CBA_FontMap(CPDFSDK_Annot* pAnnot, 234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_SystemHandler* pSystemHandler) 244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann : CPWL_FontMap(pSystemHandler), 254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pDocument(nullptr), 264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pAnnotDict(nullptr), 274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pDefaultFont(nullptr), 284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_sAPType("N") { 294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Page* pPage = pAnnot->GetPDFPage(); 304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pDocument = pPage->m_pDocument; 324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pAnnotDict = pAnnot->GetPDFAnnot()->GetAnnotDict(); 334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann Initialize(); 344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCBA_FontMap::~CBA_FontMap() {} 374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CBA_FontMap::Reset() { 394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann Empty(); 404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pDefaultFont = nullptr; 414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_sDefaultFontName = ""; 424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CBA_FontMap::Initialize() { 454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t nCharset = FXFONT_DEFAULT_CHARSET; 464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!m_pDefaultFont) { 484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pDefaultFont = GetAnnotDefaultFont(m_sDefaultFontName); 494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_pDefaultFont) { 504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (const CFX_SubstFont* pSubstFont = m_pDefaultFont->GetSubstFont()) { 514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nCharset = pSubstFont->m_Charset; 524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_sDefaultFontName == "Wingdings" || 544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_sDefaultFontName == "Wingdings2" || 554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_sDefaultFontName == "Wingdings3" || 564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_sDefaultFontName == "Webdings") 574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nCharset = FXFONT_SYMBOL_CHARSET; 584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else 594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nCharset = FXFONT_ANSI_CHARSET; 604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann AddFontData(m_pDefaultFont, m_sDefaultFontName, nCharset); 624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann AddFontToAnnotDict(m_pDefaultFont, m_sDefaultFontName); 634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (nCharset != FXFONT_ANSI_CHARSET) 674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPWL_FontMap::Initialize(); 684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CBA_FontMap::SetDefaultFont(CPDF_Font* pFont, 714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const CFX_ByteString& sFontName) { 724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT(pFont); 734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_pDefaultFont) 754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pDefaultFont = pFont; 784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_sDefaultFontName = sFontName; 794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t nCharset = FXFONT_DEFAULT_CHARSET; 814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (const CFX_SubstFont* pSubstFont = m_pDefaultFont->GetSubstFont()) 824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nCharset = pSubstFont->m_Charset; 834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann AddFontData(m_pDefaultFont, m_sDefaultFontName, nCharset); 844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDF_Font* CBA_FontMap::FindFontSameCharset(CFX_ByteString& sFontAlias, 874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t nCharset) { 884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_pAnnotDict->GetStringFor("Subtype") != "Widget") 894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return nullptr; 904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Document* pDocument = GetDocument(); 924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Dictionary* pRootDict = pDocument->GetRoot(); 934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pRootDict) 944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return nullptr; 954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Dictionary* pAcroFormDict = pRootDict->GetDictFor("AcroForm"); 974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pAcroFormDict) 984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return nullptr; 994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Dictionary* pDRDict = pAcroFormDict->GetDictFor("DR"); 1014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pDRDict) 1024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return nullptr; 1034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return FindResFontSameCharset(pDRDict, sFontAlias, nCharset); 1054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 1064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDF_Document* CBA_FontMap::GetDocument() { 1084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return m_pDocument; 1094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 1104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDF_Font* CBA_FontMap::FindResFontSameCharset(CPDF_Dictionary* pResDict, 1124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_ByteString& sFontAlias, 1134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t nCharset) { 1144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pResDict) 1154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return nullptr; 1164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Dictionary* pFonts = pResDict->GetDictFor("Font"); 1184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pFonts) 1194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return nullptr; 1204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Document* pDocument = GetDocument(); 1224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Font* pFind = nullptr; 1234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (const auto& it : *pFonts) { 1244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const CFX_ByteString& csKey = it.first; 1254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!it.second) 1264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann continue; 1274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Dictionary* pElement = ToDictionary(it.second->GetDirect()); 1294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pElement) 1304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann continue; 1314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pElement->GetStringFor("Type") != "Font") 1324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann continue; 1334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Font* pFont = pDocument->LoadFont(pElement); 1354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pFont) 1364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann continue; 1374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const CFX_SubstFont* pSubst = pFont->GetSubstFont(); 1384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pSubst) 1394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann continue; 1404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pSubst->m_Charset == nCharset) { 1414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann sFontAlias = csKey; 1424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pFind = pFont; 1434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return pFind; 1464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 1474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CBA_FontMap::AddedFont(CPDF_Font* pFont, 1494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const CFX_ByteString& sFontAlias) { 1504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann AddFontToAnnotDict(pFont, sFontAlias); 1514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 1524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CBA_FontMap::AddFontToAnnotDict(CPDF_Font* pFont, 1544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const CFX_ByteString& sAlias) { 1554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pFont) 1564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 1574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Dictionary* pAPDict = m_pAnnotDict->GetDictFor("AP"); 1594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pAPDict) 1604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pAPDict = m_pAnnotDict->SetNewFor<CPDF_Dictionary>("AP"); 1614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // to avoid checkbox and radiobutton 1634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Object* pObject = pAPDict->GetObjectFor(m_sAPType); 1644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ToDictionary(pObject)) 1654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 1664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Stream* pStream = pAPDict->GetStreamFor(m_sAPType); 1684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pStream) { 1694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pStream = m_pDocument->NewIndirect<CPDF_Stream>(); 1704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pAPDict->SetNewFor<CPDF_Reference>(m_sAPType, m_pDocument, 1714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pStream->GetObjNum()); 1724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Dictionary* pStreamDict = pStream->GetDict(); 1754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pStreamDict) { 1764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto pOwnedDict = 1774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pdfium::MakeUnique<CPDF_Dictionary>(m_pDocument->GetByteStringPool()); 1784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pStreamDict = pOwnedDict.get(); 1794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pStream->InitStream(nullptr, 0, std::move(pOwnedDict)); 1804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Dictionary* pStreamResList = pStreamDict->GetDictFor("Resources"); 1834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pStreamResList) 1844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pStreamResList = pStreamDict->SetNewFor<CPDF_Dictionary>("Resources"); 1854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Dictionary* pStreamResFontList = pStreamResList->GetDictFor("Font"); 1864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pStreamResFontList) { 1874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pStreamResFontList = m_pDocument->NewIndirect<CPDF_Dictionary>(); 1884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pStreamResList->SetNewFor<CPDF_Reference>("Font", m_pDocument, 1894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pStreamResFontList->GetObjNum()); 1904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pStreamResFontList->KeyExist(sAlias)) { 1924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pStreamResFontList->SetNewFor<CPDF_Reference>( 1934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann sAlias, m_pDocument, pFont->GetFontDict()->GetObjNum()); 1944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 1964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDF_Font* CBA_FontMap::GetAnnotDefaultFont(CFX_ByteString& sAlias) { 1984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Dictionary* pAcroFormDict = nullptr; 1994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const bool bWidget = (m_pAnnotDict->GetStringFor("Subtype") == "Widget"); 2004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (bWidget) { 2014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (CPDF_Dictionary* pRootDict = m_pDocument->GetRoot()) 2024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pAcroFormDict = pRootDict->GetDictFor("AcroForm"); 2034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_ByteString sDA; 2064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Object* pObj = FPDF_GetFieldAttr(m_pAnnotDict, "DA"); 2074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pObj) 2084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann sDA = pObj->GetString(); 2094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (bWidget) { 2114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (sDA.IsEmpty()) { 2124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pObj = FPDF_GetFieldAttr(pAcroFormDict, "DA"); 2134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann sDA = pObj ? pObj->GetString() : CFX_ByteString(); 2144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (sDA.IsEmpty()) 2174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return nullptr; 2184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_SimpleParser syntax(sDA.AsStringC()); 2204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann syntax.FindTagParamFromStart("Tf", 2); 2214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_ByteString sFontName(syntax.GetWord()); 2224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann sAlias = PDF_NameDecode(sFontName).Mid(1); 2234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Dictionary* pFontDict = nullptr; 2244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (CPDF_Dictionary* pAPDict = m_pAnnotDict->GetDictFor("AP")) { 2264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (CPDF_Dictionary* pNormalDict = pAPDict->GetDictFor("N")) { 2274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (CPDF_Dictionary* pNormalResDict = 2284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pNormalDict->GetDictFor("Resources")) { 2294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (CPDF_Dictionary* pResFontDict = pNormalResDict->GetDictFor("Font")) 2304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pFontDict = pResFontDict->GetDictFor(sAlias); 2314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (bWidget && !pFontDict && pAcroFormDict) { 2364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (CPDF_Dictionary* pDRDict = pAcroFormDict->GetDictFor("DR")) { 2374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (CPDF_Dictionary* pDRFontDict = pDRDict->GetDictFor("Font")) 2384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pFontDict = pDRFontDict->GetDictFor(sAlias); 2394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return pFontDict ? m_pDocument->LoadFont(pFontDict) : nullptr; 2434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 2444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CBA_FontMap::SetAPType(const CFX_ByteString& sAPType) { 2464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_sAPType = sAPType; 2474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann Reset(); 2494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann Initialize(); 2504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 251