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