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
31d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  m_pDocument = pPage->m_pDocument.Get();
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;
41d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  m_sDefaultFontName.clear();
424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CBA_FontMap::Initialize() {
45d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  int32_t nCharset = FX_CHARSET_Default;
464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!m_pDefaultFont) {
48d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip 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")
57d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          nCharset = FX_CHARSET_Symbol;
584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        else
59d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          nCharset = FX_CHARSET_ANSI;
604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
61d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      AddFontData(m_pDefaultFont.Get(), m_sDefaultFontName, nCharset);
62d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      AddFontToAnnotDict(m_pDefaultFont.Get(), m_sDefaultFontName);
634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
66d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (nCharset != FX_CHARSET_ANSI)
674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CPWL_FontMap::Initialize();
684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CBA_FontMap::SetDefaultFont(CPDF_Font* pFont,
71d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                 const 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
80d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  int32_t nCharset = FX_CHARSET_Default;
814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (const CFX_SubstFont* pSubstFont = m_pDefaultFont->GetSubstFont())
824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    nCharset = pSubstFont->m_Charset;
83d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  AddFontData(m_pDefaultFont.Get(), m_sDefaultFontName, nCharset);
844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
86d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCPDF_Font* CBA_FontMap::FindFontSameCharset(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();
92d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  const 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() {
108d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return m_pDocument.Get();
1094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
1104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDF_Font* CBA_FontMap::FindResFontSameCharset(CPDF_Dictionary* pResDict,
112d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                               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) {
124d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    const 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) {
141d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip 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
148d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CBA_FontMap::AddedFont(CPDF_Font* pFont, const ByteString& sFontAlias) {
1494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  AddFontToAnnotDict(pFont, sFontAlias);
1504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
1514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CBA_FontMap::AddFontToAnnotDict(CPDF_Font* pFont,
153d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                     const ByteString& sAlias) {
1544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pFont)
1554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
1564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_Dictionary* pAPDict = m_pAnnotDict->GetDictFor("AP");
1584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pAPDict)
1594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    pAPDict = m_pAnnotDict->SetNewFor<CPDF_Dictionary>("AP");
1604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  // to avoid checkbox and radiobutton
1624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_Object* pObject = pAPDict->GetObjectFor(m_sAPType);
1634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (ToDictionary(pObject))
1644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
1654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_Stream* pStream = pAPDict->GetStreamFor(m_sAPType);
1674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pStream) {
1684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    pStream = m_pDocument->NewIndirect<CPDF_Stream>();
169d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pAPDict->SetNewFor<CPDF_Reference>(m_sAPType, m_pDocument.Get(),
1704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                       pStream->GetObjNum());
1714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_Dictionary* pStreamDict = pStream->GetDict();
1744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pStreamDict) {
1754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    auto pOwnedDict =
1764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        pdfium::MakeUnique<CPDF_Dictionary>(m_pDocument->GetByteStringPool());
1774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    pStreamDict = pOwnedDict.get();
1784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    pStream->InitStream(nullptr, 0, std::move(pOwnedDict));
1794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_Dictionary* pStreamResList = pStreamDict->GetDictFor("Resources");
1824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pStreamResList)
1834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    pStreamResList = pStreamDict->SetNewFor<CPDF_Dictionary>("Resources");
1844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_Dictionary* pStreamResFontList = pStreamResList->GetDictFor("Font");
1854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pStreamResFontList) {
1864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    pStreamResFontList = m_pDocument->NewIndirect<CPDF_Dictionary>();
187d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pStreamResList->SetNewFor<CPDF_Reference>("Font", m_pDocument.Get(),
1884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                              pStreamResFontList->GetObjNum());
1894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pStreamResFontList->KeyExist(sAlias)) {
1914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    pStreamResFontList->SetNewFor<CPDF_Reference>(
192d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        sAlias, m_pDocument.Get(), pFont->GetFontDict()->GetObjNum());
1934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
1954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
196d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCPDF_Font* CBA_FontMap::GetAnnotDefaultFont(ByteString* sAlias) {
1974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_Dictionary* pAcroFormDict = nullptr;
1984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  const bool bWidget = (m_pAnnotDict->GetStringFor("Subtype") == "Widget");
1994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (bWidget) {
200d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    const CPDF_Dictionary* pRootDict = m_pDocument->GetRoot();
201d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (pRootDict)
2024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      pAcroFormDict = pRootDict->GetDictFor("AcroForm");
2034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
2044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
205d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  ByteString sDA;
206d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CPDF_Object* pObj = FPDF_GetFieldAttr(m_pAnnotDict.Get(), "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");
213d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      sDA = pObj ? pObj->GetString() : ByteString();
2144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
2154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
2164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (sDA.IsEmpty())
2174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return nullptr;
2184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
219d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CPDF_SimpleParser syntax(sDA.AsStringView());
2204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  syntax.FindTagParamFromStart("Tf", 2);
2214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
222d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  ByteString sFontName(syntax.GetWord());
223d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  ByteString sDecodedFontName = PDF_NameDecode(sFontName);
224d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  *sAlias = sDecodedFontName.Right(sDecodedFontName.GetLength() - 1);
225d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
226d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CPDF_Dictionary* pFontDict = nullptr;
2274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (CPDF_Dictionary* pAPDict = m_pAnnotDict->GetDictFor("AP")) {
2284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (CPDF_Dictionary* pNormalDict = pAPDict->GetDictFor("N")) {
2294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (CPDF_Dictionary* pNormalResDict =
2304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann              pNormalDict->GetDictFor("Resources")) {
2314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (CPDF_Dictionary* pResFontDict = pNormalResDict->GetDictFor("Font"))
232d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          pFontDict = pResFontDict->GetDictFor(*sAlias);
2334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
2344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
2354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
2364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (bWidget && !pFontDict && pAcroFormDict) {
2374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (CPDF_Dictionary* pDRDict = pAcroFormDict->GetDictFor("DR")) {
2384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (CPDF_Dictionary* pDRFontDict = pDRDict->GetDictFor("Font"))
239d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        pFontDict = pDRFontDict->GetDictFor(*sAlias);
2404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
2414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
2424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return pFontDict ? m_pDocument->LoadFont(pFontDict) : nullptr;
2434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
2444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
245d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CBA_FontMap::SetAPType(const ByteString& sAPType) {
2464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_sAPType = sAPType;
2474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  Reset();
2494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  Initialize();
2504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
251