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