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 "core/fpdfapi/page/cpdf_docpagedata.h"
84d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
94d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <algorithm>
104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <memory>
114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <set>
124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <utility>
134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fdrm/crypto/fx_crypt.h"
154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/cpdf_modulemgr.h"
164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/font/cpdf_type1font.h"
174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/font/font_int.h"
184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/page/cpdf_image.h"
194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/page/cpdf_pagemodule.h"
204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/page/cpdf_pattern.h"
214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/page/cpdf_shadingpattern.h"
224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/page/cpdf_tilingpattern.h"
234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/cpdf_array.h"
244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/cpdf_dictionary.h"
254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/cpdf_document.h"
264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/cpdf_name.h"
274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/cpdf_stream_acc.h"
284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "third_party/base/stl_util.h"
294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDF_DocPageData::CPDF_DocPageData(CPDF_Document* pPDFDoc)
314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    : m_pPDFDoc(pPDFDoc), m_bForceClear(false) {}
324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDF_DocPageData::~CPDF_DocPageData() {
344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  Clear(false);
354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  Clear(true);
364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  for (auto& it : m_PatternMap)
384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    delete it.second;
394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_PatternMap.clear();
404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  for (auto& it : m_FontMap)
424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    delete it.second;
434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_FontMap.clear();
444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  for (auto& it : m_ColorSpaceMap)
464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    delete it.second;
474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_ColorSpaceMap.clear();
484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_DocPageData::Clear(bool bForceRelease) {
514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_bForceClear = bForceRelease;
524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  for (auto& it : m_PatternMap) {
544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CPDF_CountedPattern* ptData = it.second;
554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (!ptData->get())
564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      continue;
574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (bForceRelease || ptData->use_count() < 2)
594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      ptData->clear();
604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  for (auto& it : m_FontMap) {
634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CPDF_CountedFont* fontData = it.second;
644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (!fontData->get())
654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      continue;
664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (bForceRelease || fontData->use_count() < 2) {
684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      fontData->clear();
694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  for (auto& it : m_ColorSpaceMap) {
734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CPDF_CountedColorSpace* csData = it.second;
744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (!csData->get())
754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      continue;
764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (bForceRelease || csData->use_count() < 2) {
784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      csData->get()->Release();
794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      csData->reset(nullptr);
804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  for (auto it = m_IccProfileMap.begin(); it != m_IccProfileMap.end();) {
844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    auto curr_it = it++;
854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CPDF_CountedIccProfile* ipData = curr_it->second;
864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (!ipData->get())
874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      continue;
884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (bForceRelease || ipData->use_count() < 2) {
904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      for (auto hash_it = m_HashProfileMap.begin();
914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann           hash_it != m_HashProfileMap.end(); ++hash_it) {
924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (curr_it->first == hash_it->second) {
934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          m_HashProfileMap.erase(hash_it);
944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          break;
954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        }
964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      delete ipData->get();
984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      delete ipData;
994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_IccProfileMap.erase(curr_it);
1004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
1014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  for (auto it = m_FontFileMap.begin(); it != m_FontFileMap.end();) {
1044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    auto curr_it = it++;
1054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CPDF_CountedStreamAcc* pCountedFont = curr_it->second;
1064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (!pCountedFont->get())
1074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      continue;
1084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (bForceRelease || pCountedFont->use_count() < 2) {
1104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      delete pCountedFont->get();
1114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      delete pCountedFont;
1124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_FontFileMap.erase(curr_it);
1134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
1144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  for (auto it = m_ImageMap.begin(); it != m_ImageMap.end();) {
1174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    auto curr_it = it++;
1184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CPDF_CountedImage* pCountedImage = curr_it->second;
1194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (!pCountedImage->get())
1204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      continue;
1214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (bForceRelease || pCountedImage->use_count() < 2) {
1234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      delete pCountedImage->get();
1244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      delete pCountedImage;
1254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_ImageMap.erase(curr_it);
1264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
1274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
1294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDF_Font* CPDF_DocPageData::GetFont(CPDF_Dictionary* pFontDict) {
1314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pFontDict)
1324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return nullptr;
1334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_CountedFont* pFontData = nullptr;
1354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  auto it = m_FontMap.find(pFontDict);
1364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (it != m_FontMap.end()) {
1374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    pFontData = it->second;
1384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (pFontData->get()) {
1394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return pFontData->AddRef();
1404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
1414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  std::unique_ptr<CPDF_Font> pFont = CPDF_Font::Create(m_pPDFDoc, pFontDict);
1434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pFont)
1444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return nullptr;
1454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (pFontData) {
1474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    pFontData->reset(std::move(pFont));
1484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  } else {
1494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    pFontData = new CPDF_CountedFont(std::move(pFont));
1504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_FontMap[pFontDict] = pFontData;
1514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return pFontData->AddRef();
1534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
1544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDF_Font* CPDF_DocPageData::GetStandardFont(const CFX_ByteString& fontName,
1564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                             CPDF_FontEncoding* pEncoding) {
1574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (fontName.IsEmpty())
1584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return nullptr;
1594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  for (auto& it : m_FontMap) {
1614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CPDF_CountedFont* fontData = it.second;
1624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CPDF_Font* pFont = fontData->get();
1634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (!pFont)
1644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      continue;
1654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (pFont->GetBaseFont() != fontName)
1664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      continue;
1674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (pFont->IsEmbedded())
1684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      continue;
1694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (!pFont->IsType1Font())
1704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      continue;
1714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (pFont->GetFontDict()->KeyExist("Widths"))
1724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      continue;
1734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CPDF_Type1Font* pT1Font = pFont->AsType1Font();
1754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (pEncoding && !pT1Font->GetEncoding()->IsIdentical(pEncoding))
1764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      continue;
1774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return fontData->AddRef();
1794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_Dictionary* pDict = m_pPDFDoc->NewIndirect<CPDF_Dictionary>();
1824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pDict->SetNewFor<CPDF_Name>("Type", "Font");
1834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pDict->SetNewFor<CPDF_Name>("Subtype", "Type1");
1844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pDict->SetNewFor<CPDF_Name>("BaseFont", fontName);
1854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (pEncoding) {
1864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    pDict->SetFor("Encoding",
1874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                  pEncoding->Realize(m_pPDFDoc->GetByteStringPool()));
1884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  std::unique_ptr<CPDF_Font> pFont = CPDF_Font::Create(m_pPDFDoc, pDict);
1914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pFont)
1924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return nullptr;
1934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_CountedFont* fontData = new CPDF_CountedFont(std::move(pFont));
1954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_FontMap[pDict] = fontData;
1964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return fontData->AddRef();
1974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
1984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_DocPageData::ReleaseFont(const CPDF_Dictionary* pFontDict) {
2004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pFontDict)
2014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
2024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  auto it = m_FontMap.find(pFontDict);
2044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (it == m_FontMap.end())
2054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
2064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_CountedFont* pFontData = it->second;
2084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pFontData->get())
2094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
2104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pFontData->RemoveRef();
2124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (pFontData->use_count() > 1)
2134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
2144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  // We have font data only in m_FontMap cache. Clean it.
2164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pFontData->clear();
2174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
2184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDF_ColorSpace* CPDF_DocPageData::GetColorSpace(
2204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CPDF_Object* pCSObj,
2214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    const CPDF_Dictionary* pResources) {
2224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  std::set<CPDF_Object*> visited;
2234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return GetColorSpaceImpl(pCSObj, pResources, &visited);
2244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
2254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDF_ColorSpace* CPDF_DocPageData::GetColorSpaceImpl(
2274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CPDF_Object* pCSObj,
2284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    const CPDF_Dictionary* pResources,
2294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    std::set<CPDF_Object*>* pVisited) {
2304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pCSObj)
2314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return nullptr;
2324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (pdfium::ContainsKey(*pVisited, pCSObj))
2344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return nullptr;
2354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (pCSObj->IsName()) {
2374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CFX_ByteString name = pCSObj->GetString();
2384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CPDF_ColorSpace* pCS = CPDF_ColorSpace::ColorspaceFromName(name);
2394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (!pCS && pResources) {
2404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      CPDF_Dictionary* pList = pResources->GetDictFor("ColorSpace");
2414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (pList) {
2424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        pdfium::ScopedSetInsertion<CPDF_Object*> insertion(pVisited, pCSObj);
2434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        return GetColorSpaceImpl(pList->GetDirectObjectFor(name), nullptr,
2444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                 pVisited);
2454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
2464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
2474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (!pCS || !pResources)
2484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return pCS;
2494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CPDF_Dictionary* pColorSpaces = pResources->GetDictFor("ColorSpace");
2514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (!pColorSpaces)
2524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return pCS;
2534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CPDF_Object* pDefaultCS = nullptr;
2554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    switch (pCS->GetFamily()) {
2564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      case PDFCS_DEVICERGB:
2574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        pDefaultCS = pColorSpaces->GetDirectObjectFor("DefaultRGB");
2584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        break;
2594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      case PDFCS_DEVICEGRAY:
2604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        pDefaultCS = pColorSpaces->GetDirectObjectFor("DefaultGray");
2614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        break;
2624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      case PDFCS_DEVICECMYK:
2634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        pDefaultCS = pColorSpaces->GetDirectObjectFor("DefaultCMYK");
2644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        break;
2654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
2664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (!pDefaultCS)
2674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return pCS;
2684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    pdfium::ScopedSetInsertion<CPDF_Object*> insertion(pVisited, pCSObj);
2704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return GetColorSpaceImpl(pDefaultCS, nullptr, pVisited);
2714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
2724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_Array* pArray = pCSObj->AsArray();
2744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pArray || pArray->IsEmpty())
2754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return nullptr;
2764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (pArray->GetCount() == 1) {
2784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    pdfium::ScopedSetInsertion<CPDF_Object*> insertion(pVisited, pCSObj);
2794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return GetColorSpaceImpl(pArray->GetDirectObjectAt(0), pResources,
2804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                             pVisited);
2814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
2824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_CountedColorSpace* csData = nullptr;
2844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  auto it = m_ColorSpaceMap.find(pCSObj);
2854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (it != m_ColorSpaceMap.end()) {
2864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    csData = it->second;
2874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (csData->get()) {
2884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return csData->AddRef();
2894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
2904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
2914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  std::unique_ptr<CPDF_ColorSpace> pCS =
2934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      CPDF_ColorSpace::Load(m_pPDFDoc, pArray);
2944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pCS)
2954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return nullptr;
2964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (csData) {
2984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    csData->reset(std::move(pCS));
2994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  } else {
3004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    csData = new CPDF_CountedColorSpace(std::move(pCS));
3014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_ColorSpaceMap[pCSObj] = csData;
3024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
3034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return csData->AddRef();
3044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
3054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDF_ColorSpace* CPDF_DocPageData::GetCopiedColorSpace(CPDF_Object* pCSObj) {
3074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pCSObj)
3084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return nullptr;
3094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  auto it = m_ColorSpaceMap.find(pCSObj);
3114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (it != m_ColorSpaceMap.end())
3124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return it->second->AddRef();
3134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return nullptr;
3154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
3164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_DocPageData::ReleaseColorSpace(const CPDF_Object* pColorSpace) {
3184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pColorSpace)
3194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
3204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  auto it = m_ColorSpaceMap.find(pColorSpace);
3224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (it == m_ColorSpaceMap.end())
3234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
3244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_CountedColorSpace* pCountedColorSpace = it->second;
3264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pCountedColorSpace->get())
3274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
3284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pCountedColorSpace->RemoveRef();
3304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (pCountedColorSpace->use_count() > 1)
3314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
3324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  // We have item only in m_ColorSpaceMap cache. Clean it.
3344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pCountedColorSpace->get()->Release();
3354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pCountedColorSpace->reset(nullptr);
3364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
3374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDF_Pattern* CPDF_DocPageData::GetPattern(CPDF_Object* pPatternObj,
3394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                           bool bShading,
3404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                           const CFX_Matrix& matrix) {
3414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pPatternObj)
3424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return nullptr;
3434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_CountedPattern* ptData = nullptr;
3454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  auto it = m_PatternMap.find(pPatternObj);
3464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (it != m_PatternMap.end()) {
3474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    ptData = it->second;
3484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (ptData->get()) {
3494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return ptData->AddRef();
3504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
3514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
3524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  std::unique_ptr<CPDF_Pattern> pPattern;
3534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (bShading) {
3544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    pPattern = pdfium::MakeUnique<CPDF_ShadingPattern>(m_pPDFDoc, pPatternObj,
3554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                                       true, matrix);
3564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  } else {
3574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CPDF_Dictionary* pDict = pPatternObj ? pPatternObj->GetDict() : nullptr;
3584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (pDict) {
3594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      int type = pDict->GetIntegerFor("PatternType");
3604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (type == CPDF_Pattern::TILING) {
3614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        pPattern = pdfium::MakeUnique<CPDF_TilingPattern>(m_pPDFDoc,
3624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                                          pPatternObj, matrix);
3634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      } else if (type == CPDF_Pattern::SHADING) {
3644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        pPattern = pdfium::MakeUnique<CPDF_ShadingPattern>(
3654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            m_pPDFDoc, pPatternObj, false, matrix);
3664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
3674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
3684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
3694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pPattern)
3704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return nullptr;
3714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (ptData) {
3734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    ptData->reset(std::move(pPattern));
3744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  } else {
3754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    ptData = new CPDF_CountedPattern(std::move(pPattern));
3764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_PatternMap[pPatternObj] = ptData;
3774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
3784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return ptData->AddRef();
3794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
3804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_DocPageData::ReleasePattern(const CPDF_Object* pPatternObj) {
3824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pPatternObj)
3834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
3844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  auto it = m_PatternMap.find(pPatternObj);
3864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (it == m_PatternMap.end())
3874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
3884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_CountedPattern* pPattern = it->second;
3904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pPattern->get())
3914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
3924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pPattern->RemoveRef();
3944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (pPattern->use_count() > 1)
3954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
3964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  // We have item only in m_PatternMap cache. Clean it.
3984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pPattern->clear();
3994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
4004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDF_Image* CPDF_DocPageData::GetImage(uint32_t dwStreamObjNum) {
4024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ASSERT(dwStreamObjNum);
4034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  auto it = m_ImageMap.find(dwStreamObjNum);
4044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (it != m_ImageMap.end())
4054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return it->second->AddRef();
4064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_CountedImage* pCountedImage = new CPDF_CountedImage(
4084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      pdfium::MakeUnique<CPDF_Image>(m_pPDFDoc, dwStreamObjNum));
4094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_ImageMap[dwStreamObjNum] = pCountedImage;
4104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return pCountedImage->AddRef();
4114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
4124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_DocPageData::ReleaseImage(uint32_t dwStreamObjNum) {
4144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ASSERT(dwStreamObjNum);
4154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  auto it = m_ImageMap.find(dwStreamObjNum);
4164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (it == m_ImageMap.end())
4174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
4184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_CountedImage* pCountedImage = it->second;
4204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pCountedImage)
4214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
4224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pCountedImage->RemoveRef();
4244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (pCountedImage->use_count() > 1)
4254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
4264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  // We have item only in m_ImageMap cache. Clean it.
4284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  delete pCountedImage->get();
4294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  delete pCountedImage;
4304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_ImageMap.erase(it);
4314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
4324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDF_IccProfile* CPDF_DocPageData::GetIccProfile(
4344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CPDF_Stream* pIccProfileStream) {
4354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pIccProfileStream)
4364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return nullptr;
4374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  auto it = m_IccProfileMap.find(pIccProfileStream);
4394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (it != m_IccProfileMap.end())
4404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return it->second->AddRef();
4414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_StreamAcc stream;
4434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  stream.LoadAllData(pIccProfileStream, false);
4444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  uint8_t digest[20];
4454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CRYPT_SHA1Generate(stream.GetData(), stream.GetSize(), digest);
4464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_ByteString bsDigest(digest, 20);
4474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  auto hash_it = m_HashProfileMap.find(bsDigest);
4484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (hash_it != m_HashProfileMap.end()) {
4494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    auto it_copied_stream = m_IccProfileMap.find(hash_it->second);
4504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (it_copied_stream != m_IccProfileMap.end())
4514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return it_copied_stream->second->AddRef();
4524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
4534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_CountedIccProfile* ipData = new CPDF_CountedIccProfile(
4544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      pdfium::MakeUnique<CPDF_IccProfile>(stream.GetData(), stream.GetSize()));
4554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_IccProfileMap[pIccProfileStream] = ipData;
4564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_HashProfileMap[bsDigest] = pIccProfileStream;
4574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return ipData->AddRef();
4584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
4594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_DocPageData::ReleaseIccProfile(const CPDF_IccProfile* pIccProfile) {
4614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ASSERT(pIccProfile);
4624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  for (auto it = m_IccProfileMap.begin(); it != m_IccProfileMap.end(); ++it) {
4644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CPDF_CountedIccProfile* profile = it->second;
4654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (profile->get() != pIccProfile)
4664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      continue;
4674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    profile->RemoveRef();
4694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (profile->use_count() > 1)
4704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      continue;
4714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    // We have item only in m_IccProfileMap cache. Clean it.
4724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    delete profile->get();
4734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    delete profile;
4744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_IccProfileMap.erase(it);
4754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
4764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
4774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
4784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDF_StreamAcc* CPDF_DocPageData::GetFontFileStreamAcc(
4804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CPDF_Stream* pFontStream) {
4814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ASSERT(pFontStream);
4824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  auto it = m_FontFileMap.find(pFontStream);
4844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (it != m_FontFileMap.end())
4854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return it->second->AddRef();
4864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_Dictionary* pFontDict = pFontStream->GetDict();
4884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int32_t org_size = pFontDict->GetIntegerFor("Length1") +
4894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                     pFontDict->GetIntegerFor("Length2") +
4904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                     pFontDict->GetIntegerFor("Length3");
4914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  org_size = std::max(org_size, 0);
4924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  auto pFontAcc = pdfium::MakeUnique<CPDF_StreamAcc>();
4944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pFontAcc->LoadAllData(pFontStream, false, org_size);
4954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_CountedStreamAcc* pCountedFont =
4974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      new CPDF_CountedStreamAcc(std::move(pFontAcc));
4984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_FontFileMap[pFontStream] = pCountedFont;
4994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return pCountedFont->AddRef();
5004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
5014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_DocPageData::ReleaseFontFileStreamAcc(
5034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    const CPDF_Stream* pFontStream) {
5044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pFontStream)
5054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
5064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  auto it = m_FontFileMap.find(pFontStream);
5084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (it == m_FontFileMap.end())
5094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
5104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPDF_CountedStreamAcc* pCountedStream = it->second;
5124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pCountedStream)
5134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
5144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pCountedStream->RemoveRef();
5164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (pCountedStream->use_count() > 1)
5174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
5184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  // We have item only in m_FontFileMap cache. Clean it.
5204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  delete pCountedStream->get();
5214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  delete pCountedStream;
5224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_FontFileMap.erase(it);
5234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
5244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDF_CountedColorSpace* CPDF_DocPageData::FindColorSpacePtr(
5264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CPDF_Object* pCSObj) const {
5274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pCSObj)
5284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return nullptr;
5294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  auto it = m_ColorSpaceMap.find(pCSObj);
5314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return it != m_ColorSpaceMap.end() ? it->second : nullptr;
5324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
5334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDF_CountedPattern* CPDF_DocPageData::FindPatternPtr(
5354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CPDF_Object* pPatternObj) const {
5364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pPatternObj)
5374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return nullptr;
5384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  auto it = m_PatternMap.find(pPatternObj);
5404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return it != m_PatternMap.end() ? it->second : nullptr;
5414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
542