| OLD | NEW |
| 1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
| 6 | 6 |
| 7 #include "core/fpdfapi/fpdf_render/cpdf_pagerendercache.h" | 7 #include "core/fpdfapi/fpdf_render/cpdf_pagerendercache.h" |
| 8 | 8 |
| 9 #include "core/fpdfapi/fpdf_page/cpdf_parseoptions.h" | 9 #include "core/fpdfapi/fpdf_page/cpdf_parseoptions.h" |
| 10 #include "core/fpdfapi/fpdf_page/include/cpdf_page.h" | 10 #include "core/fpdfapi/fpdf_page/include/cpdf_page.h" |
| 11 #include "core/fpdfapi/fpdf_page/pageint.h" | 11 #include "core/fpdfapi/fpdf_page/pageint.h" |
| 12 #include "core/fpdfapi/fpdf_parser/include/cpdf_document.h" | 12 #include "core/fpdfapi/fpdf_parser/include/cpdf_document.h" |
| 13 #include "core/fpdfapi/fpdf_render/include/cpdf_rendercontext.h" | 13 #include "core/fpdfapi/fpdf_render/include/cpdf_rendercontext.h" |
| 14 #include "core/fpdfapi/fpdf_render/render_int.h" | 14 #include "core/fpdfapi/fpdf_render/render_int.h" |
| 15 #include "core/include/fxge/fx_ge.h" | 15 #include "core/include/fxge/fx_ge.h" |
| 16 | 16 |
| 17 struct CACHEINFO { | 17 struct CACHEINFO { |
| 18 FX_DWORD time; | 18 uint32_t time; |
| 19 CPDF_Stream* pStream; | 19 CPDF_Stream* pStream; |
| 20 }; | 20 }; |
| 21 | 21 |
| 22 extern "C" { | 22 extern "C" { |
| 23 static int compare(const void* data1, const void* data2) { | 23 static int compare(const void* data1, const void* data2) { |
| 24 return ((CACHEINFO*)data1)->time - ((CACHEINFO*)data2)->time; | 24 return ((CACHEINFO*)data1)->time - ((CACHEINFO*)data2)->time; |
| 25 } | 25 } |
| 26 } // extern "C" | 26 } // extern "C" |
| 27 | 27 |
| 28 CPDF_PageRenderCache::~CPDF_PageRenderCache() { | 28 CPDF_PageRenderCache::~CPDF_PageRenderCache() { |
| 29 for (const auto& it : m_ImageCache) | 29 for (const auto& it : m_ImageCache) |
| 30 delete it.second; | 30 delete it.second; |
| 31 } | 31 } |
| 32 void CPDF_PageRenderCache::CacheOptimization(int32_t dwLimitCacheSize) { | 32 void CPDF_PageRenderCache::CacheOptimization(int32_t dwLimitCacheSize) { |
| 33 if (m_nCacheSize <= (FX_DWORD)dwLimitCacheSize) | 33 if (m_nCacheSize <= (uint32_t)dwLimitCacheSize) |
| 34 return; | 34 return; |
| 35 | 35 |
| 36 size_t nCount = m_ImageCache.size(); | 36 size_t nCount = m_ImageCache.size(); |
| 37 CACHEINFO* pCACHEINFO = FX_Alloc(CACHEINFO, nCount); | 37 CACHEINFO* pCACHEINFO = FX_Alloc(CACHEINFO, nCount); |
| 38 size_t i = 0; | 38 size_t i = 0; |
| 39 for (const auto& it : m_ImageCache) { | 39 for (const auto& it : m_ImageCache) { |
| 40 pCACHEINFO[i].time = it.second->GetTimeCount(); | 40 pCACHEINFO[i].time = it.second->GetTimeCount(); |
| 41 pCACHEINFO[i++].pStream = it.second->GetStream(); | 41 pCACHEINFO[i++].pStream = it.second->GetStream(); |
| 42 } | 42 } |
| 43 FXSYS_qsort(pCACHEINFO, nCount, sizeof(CACHEINFO), compare); | 43 FXSYS_qsort(pCACHEINFO, nCount, sizeof(CACHEINFO), compare); |
| 44 FX_DWORD nTimeCount = m_nTimeCount; | 44 uint32_t nTimeCount = m_nTimeCount; |
| 45 | 45 |
| 46 // Check if time value is about to roll over and reset all entries. | 46 // Check if time value is about to roll over and reset all entries. |
| 47 // The comparision is legal because FX_DWORD is an unsigned type. | 47 // The comparision is legal because uint32_t is an unsigned type. |
| 48 if (nTimeCount + 1 < nTimeCount) { | 48 if (nTimeCount + 1 < nTimeCount) { |
| 49 for (i = 0; i < nCount; i++) | 49 for (i = 0; i < nCount; i++) |
| 50 m_ImageCache[pCACHEINFO[i].pStream]->m_dwTimeCount = i; | 50 m_ImageCache[pCACHEINFO[i].pStream]->m_dwTimeCount = i; |
| 51 m_nTimeCount = nCount; | 51 m_nTimeCount = nCount; |
| 52 } | 52 } |
| 53 | 53 |
| 54 i = 0; | 54 i = 0; |
| 55 while (i + 15 < nCount) | 55 while (i + 15 < nCount) |
| 56 ClearImageCacheEntry(pCACHEINFO[i++].pStream); | 56 ClearImageCacheEntry(pCACHEINFO[i++].pStream); |
| 57 | 57 |
| 58 while (i < nCount && m_nCacheSize > (FX_DWORD)dwLimitCacheSize) | 58 while (i < nCount && m_nCacheSize > (uint32_t)dwLimitCacheSize) |
| 59 ClearImageCacheEntry(pCACHEINFO[i++].pStream); | 59 ClearImageCacheEntry(pCACHEINFO[i++].pStream); |
| 60 | 60 |
| 61 FX_Free(pCACHEINFO); | 61 FX_Free(pCACHEINFO); |
| 62 } | 62 } |
| 63 void CPDF_PageRenderCache::ClearImageCacheEntry(CPDF_Stream* pStream) { | 63 void CPDF_PageRenderCache::ClearImageCacheEntry(CPDF_Stream* pStream) { |
| 64 auto it = m_ImageCache.find(pStream); | 64 auto it = m_ImageCache.find(pStream); |
| 65 if (it == m_ImageCache.end()) | 65 if (it == m_ImageCache.end()) |
| 66 return; | 66 return; |
| 67 | 67 |
| 68 m_nCacheSize -= it->second->EstimateSize(); | 68 m_nCacheSize -= it->second->EstimateSize(); |
| 69 delete it->second; | 69 delete it->second; |
| 70 m_ImageCache.erase(it); | 70 m_ImageCache.erase(it); |
| 71 } | 71 } |
| 72 FX_DWORD CPDF_PageRenderCache::EstimateSize() { | 72 uint32_t CPDF_PageRenderCache::EstimateSize() { |
| 73 FX_DWORD dwSize = 0; | 73 uint32_t dwSize = 0; |
| 74 for (const auto& it : m_ImageCache) | 74 for (const auto& it : m_ImageCache) |
| 75 dwSize += it.second->EstimateSize(); | 75 dwSize += it.second->EstimateSize(); |
| 76 | 76 |
| 77 m_nCacheSize = dwSize; | 77 m_nCacheSize = dwSize; |
| 78 return dwSize; | 78 return dwSize; |
| 79 } | 79 } |
| 80 void CPDF_PageRenderCache::GetCachedBitmap(CPDF_Stream* pStream, | 80 void CPDF_PageRenderCache::GetCachedBitmap(CPDF_Stream* pStream, |
| 81 CFX_DIBSource*& pBitmap, | 81 CFX_DIBSource*& pBitmap, |
| 82 CFX_DIBSource*& pMask, | 82 CFX_DIBSource*& pMask, |
| 83 FX_DWORD& MatteColor, | 83 uint32_t& MatteColor, |
| 84 FX_BOOL bStdCS, | 84 FX_BOOL bStdCS, |
| 85 FX_DWORD GroupFamily, | 85 uint32_t GroupFamily, |
| 86 FX_BOOL bLoadMask, | 86 FX_BOOL bLoadMask, |
| 87 CPDF_RenderStatus* pRenderStatus, | 87 CPDF_RenderStatus* pRenderStatus, |
| 88 int32_t downsampleWidth, | 88 int32_t downsampleWidth, |
| 89 int32_t downsampleHeight) { | 89 int32_t downsampleHeight) { |
| 90 CPDF_ImageCacheEntry* pEntry; | 90 CPDF_ImageCacheEntry* pEntry; |
| 91 const auto it = m_ImageCache.find(pStream); | 91 const auto it = m_ImageCache.find(pStream); |
| 92 FX_BOOL bFound = it != m_ImageCache.end(); | 92 FX_BOOL bFound = it != m_ImageCache.end(); |
| 93 if (bFound) | 93 if (bFound) |
| 94 pEntry = it->second; | 94 pEntry = it->second; |
| 95 else | 95 else |
| 96 pEntry = new CPDF_ImageCacheEntry(m_pPage->m_pDocument, pStream); | 96 pEntry = new CPDF_ImageCacheEntry(m_pPage->m_pDocument, pStream); |
| 97 | 97 |
| 98 m_nTimeCount++; | 98 m_nTimeCount++; |
| 99 FX_BOOL bAlreadyCached = pEntry->GetCachedBitmap( | 99 FX_BOOL bAlreadyCached = pEntry->GetCachedBitmap( |
| 100 pBitmap, pMask, MatteColor, m_pPage->m_pPageResources, bStdCS, | 100 pBitmap, pMask, MatteColor, m_pPage->m_pPageResources, bStdCS, |
| 101 GroupFamily, bLoadMask, pRenderStatus, downsampleWidth, downsampleHeight); | 101 GroupFamily, bLoadMask, pRenderStatus, downsampleWidth, downsampleHeight); |
| 102 | 102 |
| 103 if (!bFound) | 103 if (!bFound) |
| 104 m_ImageCache[pStream] = pEntry; | 104 m_ImageCache[pStream] = pEntry; |
| 105 | 105 |
| 106 if (!bAlreadyCached) | 106 if (!bAlreadyCached) |
| 107 m_nCacheSize += pEntry->EstimateSize(); | 107 m_nCacheSize += pEntry->EstimateSize(); |
| 108 } | 108 } |
| 109 FX_BOOL CPDF_PageRenderCache::StartGetCachedBitmap( | 109 FX_BOOL CPDF_PageRenderCache::StartGetCachedBitmap( |
| 110 CPDF_Stream* pStream, | 110 CPDF_Stream* pStream, |
| 111 FX_BOOL bStdCS, | 111 FX_BOOL bStdCS, |
| 112 FX_DWORD GroupFamily, | 112 uint32_t GroupFamily, |
| 113 FX_BOOL bLoadMask, | 113 FX_BOOL bLoadMask, |
| 114 CPDF_RenderStatus* pRenderStatus, | 114 CPDF_RenderStatus* pRenderStatus, |
| 115 int32_t downsampleWidth, | 115 int32_t downsampleWidth, |
| 116 int32_t downsampleHeight) { | 116 int32_t downsampleHeight) { |
| 117 const auto it = m_ImageCache.find(pStream); | 117 const auto it = m_ImageCache.find(pStream); |
| 118 m_bCurFindCache = it != m_ImageCache.end(); | 118 m_bCurFindCache = it != m_ImageCache.end(); |
| 119 if (m_bCurFindCache) { | 119 if (m_bCurFindCache) { |
| 120 m_pCurImageCacheEntry = it->second; | 120 m_pCurImageCacheEntry = it->second; |
| 121 } else { | 121 } else { |
| 122 m_pCurImageCacheEntry = | 122 m_pCurImageCacheEntry = |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 190 } | 190 } |
| 191 void CPDF_PageRenderCache::ClearImageData() { | 191 void CPDF_PageRenderCache::ClearImageData() { |
| 192 for (const auto& it : m_ImageCache) | 192 for (const auto& it : m_ImageCache) |
| 193 it.second->ClearImageData(); | 193 it.second->ClearImageData(); |
| 194 } | 194 } |
| 195 void CPDF_ImageCacheEntry::ClearImageData() { | 195 void CPDF_ImageCacheEntry::ClearImageData() { |
| 196 if (m_pCachedBitmap && !m_pCachedBitmap->GetBuffer()) { | 196 if (m_pCachedBitmap && !m_pCachedBitmap->GetBuffer()) { |
| 197 ((CPDF_DIBSource*)m_pCachedBitmap)->ClearImageData(); | 197 ((CPDF_DIBSource*)m_pCachedBitmap)->ClearImageData(); |
| 198 } | 198 } |
| 199 } | 199 } |
| 200 static FX_DWORD FPDF_ImageCache_EstimateImageSize(const CFX_DIBSource* pDIB) { | 200 static uint32_t FPDF_ImageCache_EstimateImageSize(const CFX_DIBSource* pDIB) { |
| 201 return pDIB && pDIB->GetBuffer() | 201 return pDIB && pDIB->GetBuffer() |
| 202 ? (FX_DWORD)pDIB->GetHeight() * pDIB->GetPitch() + | 202 ? (uint32_t)pDIB->GetHeight() * pDIB->GetPitch() + |
| 203 (FX_DWORD)pDIB->GetPaletteSize() * 4 | 203 (uint32_t)pDIB->GetPaletteSize() * 4 |
| 204 : 0; | 204 : 0; |
| 205 } | 205 } |
| 206 FX_BOOL CPDF_ImageCacheEntry::GetCachedBitmap(CFX_DIBSource*& pBitmap, | 206 FX_BOOL CPDF_ImageCacheEntry::GetCachedBitmap(CFX_DIBSource*& pBitmap, |
| 207 CFX_DIBSource*& pMask, | 207 CFX_DIBSource*& pMask, |
| 208 FX_DWORD& MatteColor, | 208 uint32_t& MatteColor, |
| 209 CPDF_Dictionary* pPageResources, | 209 CPDF_Dictionary* pPageResources, |
| 210 FX_BOOL bStdCS, | 210 FX_BOOL bStdCS, |
| 211 FX_DWORD GroupFamily, | 211 uint32_t GroupFamily, |
| 212 FX_BOOL bLoadMask, | 212 FX_BOOL bLoadMask, |
| 213 CPDF_RenderStatus* pRenderStatus, | 213 CPDF_RenderStatus* pRenderStatus, |
| 214 int32_t downsampleWidth, | 214 int32_t downsampleWidth, |
| 215 int32_t downsampleHeight) { | 215 int32_t downsampleHeight) { |
| 216 if (m_pCachedBitmap) { | 216 if (m_pCachedBitmap) { |
| 217 pBitmap = m_pCachedBitmap; | 217 pBitmap = m_pCachedBitmap; |
| 218 pMask = m_pCachedMask; | 218 pMask = m_pCachedMask; |
| 219 MatteColor = m_MatteColor; | 219 MatteColor = m_MatteColor; |
| 220 return TRUE; | 220 return TRUE; |
| 221 } | 221 } |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 257 return pDIBSource; | 257 return pDIBSource; |
| 258 } | 258 } |
| 259 CFX_DIBSource* CPDF_ImageCacheEntry::DetachMask() { | 259 CFX_DIBSource* CPDF_ImageCacheEntry::DetachMask() { |
| 260 CFX_DIBSource* pDIBSource = m_pCurMask; | 260 CFX_DIBSource* pDIBSource = m_pCurMask; |
| 261 m_pCurMask = NULL; | 261 m_pCurMask = NULL; |
| 262 return pDIBSource; | 262 return pDIBSource; |
| 263 } | 263 } |
| 264 int CPDF_ImageCacheEntry::StartGetCachedBitmap(CPDF_Dictionary* pFormResources, | 264 int CPDF_ImageCacheEntry::StartGetCachedBitmap(CPDF_Dictionary* pFormResources, |
| 265 CPDF_Dictionary* pPageResources, | 265 CPDF_Dictionary* pPageResources, |
| 266 FX_BOOL bStdCS, | 266 FX_BOOL bStdCS, |
| 267 FX_DWORD GroupFamily, | 267 uint32_t GroupFamily, |
| 268 FX_BOOL bLoadMask, | 268 FX_BOOL bLoadMask, |
| 269 CPDF_RenderStatus* pRenderStatus, | 269 CPDF_RenderStatus* pRenderStatus, |
| 270 int32_t downsampleWidth, | 270 int32_t downsampleWidth, |
| 271 int32_t downsampleHeight) { | 271 int32_t downsampleHeight) { |
| 272 if (m_pCachedBitmap) { | 272 if (m_pCachedBitmap) { |
| 273 m_pCurBitmap = m_pCachedBitmap; | 273 m_pCurBitmap = m_pCachedBitmap; |
| 274 m_pCurMask = m_pCachedMask; | 274 m_pCurMask = m_pCachedMask; |
| 275 return 1; | 275 return 1; |
| 276 } | 276 } |
| 277 if (!pRenderStatus) { | 277 if (!pRenderStatus) { |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 327 m_pCurBitmap = NULL; | 327 m_pCurBitmap = NULL; |
| 328 return 0; | 328 return 0; |
| 329 } | 329 } |
| 330 ContinueGetCachedBitmap(); | 330 ContinueGetCachedBitmap(); |
| 331 return 0; | 331 return 0; |
| 332 } | 332 } |
| 333 void CPDF_ImageCacheEntry::CalcSize() { | 333 void CPDF_ImageCacheEntry::CalcSize() { |
| 334 m_dwCacheSize = FPDF_ImageCache_EstimateImageSize(m_pCachedBitmap) + | 334 m_dwCacheSize = FPDF_ImageCache_EstimateImageSize(m_pCachedBitmap) + |
| 335 FPDF_ImageCache_EstimateImageSize(m_pCachedMask); | 335 FPDF_ImageCache_EstimateImageSize(m_pCachedMask); |
| 336 } | 336 } |
| OLD | NEW |