1e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Copyright 2014 PDFium Authors. All rights reserved.
2e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Use of this source code is governed by a BSD-style license that can be
3e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// found in the LICENSE file.
4ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
5e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
7e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include "render_int.h"
8ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
9ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "core/include/fpdfapi/fpdf_pageobj.h"
10ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "core/include/fpdfapi/fpdf_render.h"
11ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "core/include/fxge/fx_ge.h"
12ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "core/src/fpdfapi/fpdf_page/pageint.h"
13ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
14e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovstruct CACHEINFO {
15ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_DWORD time;
16ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Stream* pStream;
17e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov};
18ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
19e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovextern "C" {
20ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic int compare(const void* data1, const void* data2) {
21ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return ((CACHEINFO*)data1)->time - ((CACHEINFO*)data2)->time;
22e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
23ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}  // extern "C"
24ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
25ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_PageRenderCache::~CPDF_PageRenderCache() {
26ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  for (const auto& it : m_ImageCache)
27ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    delete it.second;
28e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
29ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_PageRenderCache::CacheOptimization(int32_t dwLimitCacheSize) {
30ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_nCacheSize <= (FX_DWORD)dwLimitCacheSize)
31ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
32ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
33ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  size_t nCount = m_ImageCache.size();
34ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CACHEINFO* pCACHEINFO = FX_Alloc(CACHEINFO, nCount);
35ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  size_t i = 0;
36ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  for (const auto& it : m_ImageCache) {
37ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pCACHEINFO[i].time = it.second->GetTimeCount();
38ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pCACHEINFO[i++].pStream = it.second->GetStream();
39ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
40ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_qsort(pCACHEINFO, nCount, sizeof(CACHEINFO), compare);
41ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_DWORD nTimeCount = m_nTimeCount;
42ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
43ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  // Check if time value is about to roll over and reset all entries.
44ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  // The comparision is legal because FX_DWORD is an unsigned type.
45ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (nTimeCount + 1 < nTimeCount) {
46ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    for (i = 0; i < nCount; i++)
47ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_ImageCache[pCACHEINFO[i].pStream]->m_dwTimeCount = i;
48ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_nTimeCount = nCount;
49ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
50ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
51ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  i = 0;
52ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  while (i + 15 < nCount)
53ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    ClearImageCacheEntry(pCACHEINFO[i++].pStream);
54ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
55ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  while (i < nCount && m_nCacheSize > (FX_DWORD)dwLimitCacheSize)
56ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    ClearImageCacheEntry(pCACHEINFO[i++].pStream);
57ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
58ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_Free(pCACHEINFO);
59e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
60ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_PageRenderCache::ClearImageCacheEntry(CPDF_Stream* pStream) {
61ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  auto it = m_ImageCache.find(pStream);
62ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (it == m_ImageCache.end())
63ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
64ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
65ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_nCacheSize -= it->second->EstimateSize();
66ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  delete it->second;
67ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_ImageCache.erase(it);
68e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
69ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_DWORD CPDF_PageRenderCache::EstimateSize() {
70ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_DWORD dwSize = 0;
71ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  for (const auto& it : m_ImageCache)
72ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    dwSize += it.second->EstimateSize();
73ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
74ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_nCacheSize = dwSize;
75ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return dwSize;
76e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
77ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_PageRenderCache::GetCachedBitmap(CPDF_Stream* pStream,
78ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                           CFX_DIBSource*& pBitmap,
79ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                           CFX_DIBSource*& pMask,
80ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                           FX_DWORD& MatteColor,
81ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                           FX_BOOL bStdCS,
82ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                           FX_DWORD GroupFamily,
83ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                           FX_BOOL bLoadMask,
84ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                           CPDF_RenderStatus* pRenderStatus,
85ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                           int32_t downsampleWidth,
86ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                           int32_t downsampleHeight) {
87ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_ImageCacheEntry* pEntry;
88ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  const auto it = m_ImageCache.find(pStream);
89ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_BOOL bFound = it != m_ImageCache.end();
90ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (bFound)
91ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pEntry = it->second;
92ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  else
93ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pEntry = new CPDF_ImageCacheEntry(m_pPage->m_pDocument, pStream);
94ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
95ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_nTimeCount++;
96ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_BOOL bAlreadyCached = pEntry->GetCachedBitmap(
97ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      pBitmap, pMask, MatteColor, m_pPage->m_pPageResources, bStdCS,
98ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      GroupFamily, bLoadMask, pRenderStatus, downsampleWidth, downsampleHeight);
99ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
100ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!bFound)
101ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_ImageCache[pStream] = pEntry;
102ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
103ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!bAlreadyCached)
104ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_nCacheSize += pEntry->EstimateSize();
105e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
106ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_PageRenderCache::StartGetCachedBitmap(
107ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CPDF_Stream* pStream,
108ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FX_BOOL bStdCS,
109ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FX_DWORD GroupFamily,
110ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FX_BOOL bLoadMask,
111ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CPDF_RenderStatus* pRenderStatus,
112ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    int32_t downsampleWidth,
113ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    int32_t downsampleHeight) {
114ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  const auto it = m_ImageCache.find(pStream);
115ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_bCurFindCache = it != m_ImageCache.end();
116ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_bCurFindCache) {
117ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pCurImageCacheEntry = it->second;
118ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else {
119ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pCurImageCacheEntry =
120ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        new CPDF_ImageCacheEntry(m_pPage->m_pDocument, pStream);
121ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
122ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int ret = m_pCurImageCacheEntry->StartGetCachedBitmap(
123ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      pRenderStatus->m_pFormResource, m_pPage->m_pPageResources, bStdCS,
124ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      GroupFamily, bLoadMask, pRenderStatus, downsampleWidth, downsampleHeight);
125ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (ret == 2)
126ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return TRUE;
127ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
128ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_nTimeCount++;
129ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!m_bCurFindCache)
130ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_ImageCache[pStream] = m_pCurImageCacheEntry;
131ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
132ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!ret)
133ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_nCacheSize += m_pCurImageCacheEntry->EstimateSize();
134ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
135ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return FALSE;
136e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
137ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_PageRenderCache::Continue(IFX_Pause* pPause) {
138ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int ret = m_pCurImageCacheEntry->Continue(pPause);
139ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (ret == 2)
140ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return TRUE;
141ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_nTimeCount++;
142ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!m_bCurFindCache)
143ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_ImageCache[m_pCurImageCacheEntry->GetStream()] = m_pCurImageCacheEntry;
144ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!ret)
145ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_nCacheSize += m_pCurImageCacheEntry->EstimateSize();
146ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return FALSE;
147e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
148ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_PageRenderCache::ResetBitmap(CPDF_Stream* pStream,
149ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                       const CFX_DIBitmap* pBitmap) {
150ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_ImageCacheEntry* pEntry;
151ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  const auto it = m_ImageCache.find(pStream);
152ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (it == m_ImageCache.end()) {
153ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!pBitmap)
154ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return;
155ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pEntry = new CPDF_ImageCacheEntry(m_pPage->m_pDocument, pStream);
156ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_ImageCache[pStream] = pEntry;
157ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else {
158ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pEntry = it->second;
159ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
160ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_nCacheSize -= pEntry->EstimateSize();
161ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pEntry->Reset(pBitmap);
162ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_nCacheSize += pEntry->EstimateSize();
163e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
164ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_ImageCacheEntry::CPDF_ImageCacheEntry(CPDF_Document* pDoc,
165ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                           CPDF_Stream* pStream)
166ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    : m_dwTimeCount(0),
167ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pCurBitmap(NULL),
168ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pCurMask(NULL),
169ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_MatteColor(0),
170ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pRenderStatus(NULL),
171ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pDocument(pDoc),
172ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pStream(pStream),
173ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pCachedBitmap(NULL),
174ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pCachedMask(NULL),
175ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_dwCacheSize(0) {}
176ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_ImageCacheEntry::~CPDF_ImageCacheEntry() {
177ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  delete m_pCachedBitmap;
178ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  delete m_pCachedMask;
179e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
180ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_ImageCacheEntry::Reset(const CFX_DIBitmap* pBitmap) {
181ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  delete m_pCachedBitmap;
182ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pCachedBitmap = NULL;
183ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pBitmap) {
184ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pCachedBitmap = pBitmap->Clone();
185ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
186ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CalcSize();
187e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
188ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_PageRenderCache::ClearImageData() {
189ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  for (const auto& it : m_ImageCache)
190ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    it.second->ClearImageData();
191e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
192ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_ImageCacheEntry::ClearImageData() {
193ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_pCachedBitmap && !m_pCachedBitmap->GetBuffer()) {
194ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    ((CPDF_DIBSource*)m_pCachedBitmap)->ClearImageData();
195ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
196e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
197ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannstatic FX_DWORD FPDF_ImageCache_EstimateImageSize(const CFX_DIBSource* pDIB) {
198ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return pDIB && pDIB->GetBuffer()
199ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann             ? (FX_DWORD)pDIB->GetHeight() * pDIB->GetPitch() +
200ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                   (FX_DWORD)pDIB->GetPaletteSize() * 4
201ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann             : 0;
202e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
203ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_ImageCacheEntry::GetCachedBitmap(CFX_DIBSource*& pBitmap,
204ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                              CFX_DIBSource*& pMask,
205ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                              FX_DWORD& MatteColor,
206ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                              CPDF_Dictionary* pPageResources,
207ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                              FX_BOOL bStdCS,
208ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                              FX_DWORD GroupFamily,
209ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                              FX_BOOL bLoadMask,
210ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                              CPDF_RenderStatus* pRenderStatus,
211ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                              int32_t downsampleWidth,
212ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                              int32_t downsampleHeight) {
213ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_pCachedBitmap) {
214e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    pBitmap = m_pCachedBitmap;
215e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    pMask = m_pCachedMask;
216ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    MatteColor = m_MatteColor;
217ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return TRUE;
218ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
219ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pRenderStatus) {
220e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return FALSE;
221ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
222ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_RenderContext* pContext = pRenderStatus->GetContext();
223ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_PageRenderCache* pPageRenderCache = pContext->GetPageCache();
224ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_dwTimeCount = pPageRenderCache->GetTimeCount();
225ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_DIBSource* pSrc = new CPDF_DIBSource;
226ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_DIBSource* pMaskSrc = NULL;
227ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pSrc->Load(m_pDocument, m_pStream, &pMaskSrc, &MatteColor,
228ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                  pRenderStatus->m_pFormResource, pPageResources, bStdCS,
229ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                  GroupFamily, bLoadMask)) {
230ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    delete pSrc;
231ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pBitmap = NULL;
232ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return FALSE;
233ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
234ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_MatteColor = MatteColor;
235ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pSrc->GetPitch() * pSrc->GetHeight() < FPDF_HUGE_IMAGE_SIZE) {
236ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pCachedBitmap = pSrc->Clone();
237ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    delete pSrc;
238ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else {
239ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pCachedBitmap = pSrc;
240ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
241ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pMaskSrc) {
242ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pCachedMask = pMaskSrc->Clone();
243ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    delete pMaskSrc;
244ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
245ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
246ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pBitmap = m_pCachedBitmap;
247ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pMask = m_pCachedMask;
248ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CalcSize();
249ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return FALSE;
250e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
251ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_DIBSource* CPDF_ImageCacheEntry::DetachBitmap() {
252ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_DIBSource* pDIBSource = m_pCurBitmap;
253ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pCurBitmap = NULL;
254ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return pDIBSource;
255e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
256ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_DIBSource* CPDF_ImageCacheEntry::DetachMask() {
257ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_DIBSource* pDIBSource = m_pCurMask;
258ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pCurMask = NULL;
259ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return pDIBSource;
260e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
261ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint CPDF_ImageCacheEntry::StartGetCachedBitmap(CPDF_Dictionary* pFormResources,
262ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                               CPDF_Dictionary* pPageResources,
263ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                               FX_BOOL bStdCS,
264ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                               FX_DWORD GroupFamily,
265ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                               FX_BOOL bLoadMask,
266ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                               CPDF_RenderStatus* pRenderStatus,
267ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                               int32_t downsampleWidth,
268ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                               int32_t downsampleHeight) {
269ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_pCachedBitmap) {
270e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    m_pCurBitmap = m_pCachedBitmap;
271e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    m_pCurMask = m_pCachedMask;
272ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return 1;
273ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
274ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pRenderStatus) {
275ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return 0;
276ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
277ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pRenderStatus = pRenderStatus;
278ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pCurBitmap = new CPDF_DIBSource;
279ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int ret =
280ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      ((CPDF_DIBSource*)m_pCurBitmap)
281ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          ->StartLoadDIBSource(m_pDocument, m_pStream, TRUE, pFormResources,
282ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                               pPageResources, bStdCS, GroupFamily, bLoadMask);
283ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (ret == 2) {
284ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return ret;
285ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
286ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!ret) {
287ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    delete m_pCurBitmap;
288ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pCurBitmap = NULL;
289e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return 0;
290ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
291ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  ContinueGetCachedBitmap();
292ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return 0;
293e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
294ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_ImageCacheEntry::ContinueGetCachedBitmap() {
295ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_MatteColor = ((CPDF_DIBSource*)m_pCurBitmap)->m_MatteColor;
296ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pCurMask = ((CPDF_DIBSource*)m_pCurBitmap)->DetachMask();
297ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_RenderContext* pContext = m_pRenderStatus->GetContext();
298ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_PageRenderCache* pPageRenderCache = pContext->GetPageCache();
299ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_dwTimeCount = pPageRenderCache->GetTimeCount();
300ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_pCurBitmap->GetPitch() * m_pCurBitmap->GetHeight() <
301ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      FPDF_HUGE_IMAGE_SIZE) {
302ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pCachedBitmap = m_pCurBitmap->Clone();
303ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    delete m_pCurBitmap;
304ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pCurBitmap = NULL;
305ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else {
306ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pCachedBitmap = m_pCurBitmap;
307ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
308ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_pCurMask) {
309ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pCachedMask = m_pCurMask->Clone();
310ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    delete m_pCurMask;
311ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pCurMask = NULL;
312ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
313ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pCurBitmap = m_pCachedBitmap;
314ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pCurMask = m_pCachedMask;
315ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CalcSize();
316ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
317ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint CPDF_ImageCacheEntry::Continue(IFX_Pause* pPause) {
318ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int ret = ((CPDF_DIBSource*)m_pCurBitmap)->ContinueLoadDIBSource(pPause);
319ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (ret == 2) {
320ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return ret;
321ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
322ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!ret) {
323ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    delete m_pCurBitmap;
324ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pCurBitmap = NULL;
325e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return 0;
326ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
327ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  ContinueGetCachedBitmap();
328ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return 0;
329e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
330ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_ImageCacheEntry::CalcSize() {
331ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_dwCacheSize = FPDF_ImageCache_EstimateImageSize(m_pCachedBitmap) +
332ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                  FPDF_ImageCache_EstimateImageSize(m_pCachedMask);
333e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
334ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_Document::ClearRenderFont() {
335ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_pDocRender) {
336ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CFX_FontCache* pCache = m_pDocRender->GetFontCache();
337ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (pCache) {
338ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      pCache->FreeCache(FALSE);
339e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
340ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
341e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
342