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