Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(65)

Side by Side Diff: core/src/fpdfapi/fpdf_render/fpdf_render_cache.cpp

Issue 1539983002: Remove CFX_MapPtrToPtr in CFX_PageRenderCache (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@xfa
Patch Set: Address review Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 "render_int.h" 7 #include "render_int.h"
8 8
9 #include "core/include/fpdfapi/fpdf_pageobj.h" 9 #include "core/include/fpdfapi/fpdf_pageobj.h"
10 #include "core/include/fpdfapi/fpdf_render.h" 10 #include "core/include/fpdfapi/fpdf_render.h"
11 #include "core/include/fxge/fx_ge.h" 11 #include "core/include/fxge/fx_ge.h"
12 #include "core/src/fpdfapi/fpdf_page/pageint.h" 12 #include "core/src/fpdfapi/fpdf_page/pageint.h"
13 13
14 struct CACHEINFO { 14 struct CACHEINFO {
15 FX_DWORD time; 15 FX_DWORD time;
16 CPDF_Stream* pStream; 16 CPDF_Stream* pStream;
17 }; 17 };
18
18 extern "C" { 19 extern "C" {
19 static int compare(const void* data1, const void* data2) { 20 static int compare(const void* data1, const void* data2) {
20 return ((CACHEINFO*)data1)->time - ((CACHEINFO*)data2)->time; 21 return ((CACHEINFO*)data1)->time - ((CACHEINFO*)data2)->time;
21 } 22 }
22 }; 23 } // extern "C"
23 void CPDF_Page::ClearRenderCache() { 24
24 if (m_pPageRender) { 25 CPDF_PageRenderCache::~CPDF_PageRenderCache() {
25 m_pPageRender->ClearAll(); 26 for (const auto& it : m_ImageCache)
26 } 27 delete it.second;
27 }
28 void CPDF_PageRenderCache::ClearAll() {
29 FX_POSITION pos = m_ImageCaches.GetStartPosition();
30 while (pos) {
31 void* key;
32 void* value;
33 m_ImageCaches.GetNextAssoc(pos, key, value);
34 delete (CPDF_ImageCache*)value;
35 }
36 m_ImageCaches.RemoveAll();
37 m_nCacheSize = 0;
38 m_nTimeCount = 0;
39 } 28 }
40 void CPDF_PageRenderCache::CacheOptimization(int32_t dwLimitCacheSize) { 29 void CPDF_PageRenderCache::CacheOptimization(int32_t dwLimitCacheSize) {
41 if (m_nCacheSize <= (FX_DWORD)dwLimitCacheSize) { 30 if (m_nCacheSize <= (FX_DWORD)dwLimitCacheSize)
42 return; 31 return;
43 } 32
44 int nCount = m_ImageCaches.GetCount(); 33 size_t nCount = m_ImageCache.size();
45 CACHEINFO* pCACHEINFO = 34 CACHEINFO* pCACHEINFO = FX_Alloc(CACHEINFO, nCount);
46 (CACHEINFO*)FX_Alloc2D(uint8_t, sizeof(CACHEINFO), nCount); 35 size_t i = 0;
47 FX_POSITION pos = m_ImageCaches.GetStartPosition(); 36 for (const auto& it : m_ImageCache) {
48 int i = 0; 37 pCACHEINFO[i].time = it.second->GetTimeCount();
49 while (pos) { 38 pCACHEINFO[i++].pStream = it.second->GetStream();
50 void* key;
51 void* value;
52 m_ImageCaches.GetNextAssoc(pos, key, value);
53 pCACHEINFO[i].time = ((CPDF_ImageCache*)value)->GetTimeCount();
54 pCACHEINFO[i++].pStream = ((CPDF_ImageCache*)value)->GetStream();
55 } 39 }
56 FXSYS_qsort(pCACHEINFO, nCount, sizeof(CACHEINFO), compare); 40 FXSYS_qsort(pCACHEINFO, nCount, sizeof(CACHEINFO), compare);
57 FX_DWORD nTimeCount = m_nTimeCount; 41 FX_DWORD nTimeCount = m_nTimeCount;
42
43 // Check if time value is about to roll over and reset all entries.
44 // The comparision is legal because FX_DWORD is an unsigned type.
58 if (nTimeCount + 1 < nTimeCount) { 45 if (nTimeCount + 1 < nTimeCount) {
59 for (i = 0; i < nCount; i++) { 46 for (i = 0; i < nCount; i++)
60 ((CPDF_ImageCache*)(m_ImageCaches[pCACHEINFO[i].pStream])) 47 m_ImageCache[pCACHEINFO[i].pStream]->m_dwTimeCount = i;
61 ->m_dwTimeCount = i;
62 }
63 m_nTimeCount = nCount; 48 m_nTimeCount = nCount;
64 } 49 }
50
65 i = 0; 51 i = 0;
66 while (nCount > 15) { 52 while (i + 15 < nCount)
67 ClearImageCache(pCACHEINFO[i++].pStream); 53 ClearImageCacheEntry(pCACHEINFO[i++].pStream);
68 nCount--; 54
69 } 55 while (i < nCount && m_nCacheSize > (FX_DWORD)dwLimitCacheSize)
70 while (m_nCacheSize > (FX_DWORD)dwLimitCacheSize) { 56 ClearImageCacheEntry(pCACHEINFO[i++].pStream);
71 ClearImageCache(pCACHEINFO[i++].pStream); 57
72 }
73 FX_Free(pCACHEINFO); 58 FX_Free(pCACHEINFO);
74 } 59 }
75 void CPDF_PageRenderCache::ClearImageCache(CPDF_Stream* pStream) { 60 void CPDF_PageRenderCache::ClearImageCacheEntry(CPDF_Stream* pStream) {
76 void* value = m_ImageCaches.GetValueAt(pStream); 61 auto it = m_ImageCache.find(pStream);
77 if (!value) { 62 if (it == m_ImageCache.end())
78 m_ImageCaches.RemoveKey(pStream);
79 return; 63 return;
80 } 64
81 m_nCacheSize -= ((CPDF_ImageCache*)value)->EstimateSize(); 65 m_nCacheSize -= it->second->EstimateSize();
82 delete (CPDF_ImageCache*)value; 66 delete it->second;
83 m_ImageCaches.RemoveKey(pStream); 67 m_ImageCache.erase(it);
84 } 68 }
85 FX_DWORD CPDF_PageRenderCache::EstimateSize() { 69 FX_DWORD CPDF_PageRenderCache::EstimateSize() {
86 FX_DWORD dwSize = 0; 70 FX_DWORD dwSize = 0;
87 FX_POSITION pos = m_ImageCaches.GetStartPosition(); 71 for (const auto& it : m_ImageCache)
88 while (pos) { 72 dwSize += it.second->EstimateSize();
89 void* key; 73
90 void* value;
91 m_ImageCaches.GetNextAssoc(pos, key, value);
92 dwSize += ((CPDF_ImageCache*)value)->EstimateSize();
93 }
94 m_nCacheSize = dwSize; 74 m_nCacheSize = dwSize;
95 return dwSize; 75 return dwSize;
96 } 76 }
97 FX_DWORD CPDF_PageRenderCache::GetCachedSize(CPDF_Stream* pStream) const {
98 if (!pStream) {
99 return m_nCacheSize;
100 }
101 CPDF_ImageCache* pImageCache;
102 if (!m_ImageCaches.Lookup(pStream, (void*&)pImageCache)) {
103 return 0;
104 }
105 return pImageCache->EstimateSize();
106 }
107 void CPDF_PageRenderCache::GetCachedBitmap(CPDF_Stream* pStream, 77 void CPDF_PageRenderCache::GetCachedBitmap(CPDF_Stream* pStream,
108 CFX_DIBSource*& pBitmap, 78 CFX_DIBSource*& pBitmap,
109 CFX_DIBSource*& pMask, 79 CFX_DIBSource*& pMask,
110 FX_DWORD& MatteColor, 80 FX_DWORD& MatteColor,
111 FX_BOOL bStdCS, 81 FX_BOOL bStdCS,
112 FX_DWORD GroupFamily, 82 FX_DWORD GroupFamily,
113 FX_BOOL bLoadMask, 83 FX_BOOL bLoadMask,
114 CPDF_RenderStatus* pRenderStatus, 84 CPDF_RenderStatus* pRenderStatus,
115 int32_t downsampleWidth, 85 int32_t downsampleWidth,
116 int32_t downsampleHeight) { 86 int32_t downsampleHeight) {
117 CPDF_ImageCache* pImageCache; 87 CPDF_ImageCacheEntry* pEntry;
118 FX_BOOL bFind = m_ImageCaches.Lookup(pStream, (void*&)pImageCache); 88 const auto it = m_ImageCache.find(pStream);
119 if (!bFind) { 89 FX_BOOL bFound = it != m_ImageCache.end();
120 pImageCache = new CPDF_ImageCache(m_pPage->m_pDocument, pStream); 90 if (bFound)
121 } 91 pEntry = it->second;
92 else
93 pEntry = new CPDF_ImageCacheEntry(m_pPage->m_pDocument, pStream);
94
122 m_nTimeCount++; 95 m_nTimeCount++;
123 FX_BOOL bCached = pImageCache->GetCachedBitmap( 96 FX_BOOL bAlreadyCached = pEntry->GetCachedBitmap(
124 pBitmap, pMask, MatteColor, m_pPage->m_pPageResources, bStdCS, 97 pBitmap, pMask, MatteColor, m_pPage->m_pPageResources, bStdCS,
125 GroupFamily, bLoadMask, pRenderStatus, downsampleWidth, downsampleHeight); 98 GroupFamily, bLoadMask, pRenderStatus, downsampleWidth, downsampleHeight);
126 if (!bFind) { 99
127 m_ImageCaches.SetAt(pStream, pImageCache); 100 if (!bFound)
128 } 101 m_ImageCache[pStream] = pEntry;
129 if (!bCached) { 102
130 m_nCacheSize += pImageCache->EstimateSize(); 103 if (!bAlreadyCached)
131 } 104 m_nCacheSize += pEntry->EstimateSize();
132 } 105 }
133 FX_BOOL CPDF_PageRenderCache::StartGetCachedBitmap( 106 FX_BOOL CPDF_PageRenderCache::StartGetCachedBitmap(
134 CPDF_Stream* pStream, 107 CPDF_Stream* pStream,
135 FX_BOOL bStdCS, 108 FX_BOOL bStdCS,
136 FX_DWORD GroupFamily, 109 FX_DWORD GroupFamily,
137 FX_BOOL bLoadMask, 110 FX_BOOL bLoadMask,
138 CPDF_RenderStatus* pRenderStatus, 111 CPDF_RenderStatus* pRenderStatus,
139 int32_t downsampleWidth, 112 int32_t downsampleWidth,
140 int32_t downsampleHeight) { 113 int32_t downsampleHeight) {
141 m_bCurFindCache = m_ImageCaches.Lookup(pStream, (void*&)m_pCurImageCache); 114 const auto it = m_ImageCache.find(pStream);
142 if (!m_bCurFindCache) { 115 m_bCurFindCache = it != m_ImageCache.end();
143 m_pCurImageCache = new CPDF_ImageCache(m_pPage->m_pDocument, pStream); 116 if (m_bCurFindCache) {
117 m_pCurImageCacheEntry = it->second;
118 } else {
119 m_pCurImageCacheEntry =
120 new CPDF_ImageCacheEntry(m_pPage->m_pDocument, pStream);
144 } 121 }
145 int ret = m_pCurImageCache->StartGetCachedBitmap( 122 int ret = m_pCurImageCacheEntry->StartGetCachedBitmap(
146 pRenderStatus->m_pFormResource, m_pPage->m_pPageResources, bStdCS, 123 pRenderStatus->m_pFormResource, m_pPage->m_pPageResources, bStdCS,
147 GroupFamily, bLoadMask, pRenderStatus, downsampleWidth, downsampleHeight); 124 GroupFamily, bLoadMask, pRenderStatus, downsampleWidth, downsampleHeight);
148 if (ret == 2) { 125 if (ret == 2)
149 return TRUE; 126 return TRUE;
150 } 127
151 m_nTimeCount++; 128 m_nTimeCount++;
152 if (!m_bCurFindCache) { 129 if (!m_bCurFindCache)
153 m_ImageCaches.SetAt(pStream, m_pCurImageCache); 130 m_ImageCache[pStream] = m_pCurImageCacheEntry;
154 } 131
155 if (!ret) { 132 if (!ret)
156 m_nCacheSize += m_pCurImageCache->EstimateSize(); 133 m_nCacheSize += m_pCurImageCacheEntry->EstimateSize();
157 } 134
158 return FALSE; 135 return FALSE;
159 } 136 }
160 FX_BOOL CPDF_PageRenderCache::Continue(IFX_Pause* pPause) { 137 FX_BOOL CPDF_PageRenderCache::Continue(IFX_Pause* pPause) {
161 int ret = m_pCurImageCache->Continue(pPause); 138 int ret = m_pCurImageCacheEntry->Continue(pPause);
162 if (ret == 2) { 139 if (ret == 2)
163 return TRUE; 140 return TRUE;
164 }
165 m_nTimeCount++; 141 m_nTimeCount++;
166 if (!m_bCurFindCache) { 142 if (!m_bCurFindCache)
167 m_ImageCaches.SetAt(m_pCurImageCache->GetStream(), m_pCurImageCache); 143 m_ImageCache[m_pCurImageCacheEntry->GetStream()] = m_pCurImageCacheEntry;
168 } 144 if (!ret)
169 if (!ret) { 145 m_nCacheSize += m_pCurImageCacheEntry->EstimateSize();
170 m_nCacheSize += m_pCurImageCache->EstimateSize();
171 }
172 return FALSE; 146 return FALSE;
173 } 147 }
174 void CPDF_PageRenderCache::ResetBitmap(CPDF_Stream* pStream, 148 void CPDF_PageRenderCache::ResetBitmap(CPDF_Stream* pStream,
175 const CFX_DIBitmap* pBitmap) { 149 const CFX_DIBitmap* pBitmap) {
176 CPDF_ImageCache* pImageCache; 150 CPDF_ImageCacheEntry* pEntry;
177 if (!m_ImageCaches.Lookup(pStream, (void*&)pImageCache)) { 151 const auto it = m_ImageCache.find(pStream);
178 if (!pBitmap) { 152 if (it == m_ImageCache.end()) {
153 if (!pBitmap)
179 return; 154 return;
180 } 155 pEntry = new CPDF_ImageCacheEntry(m_pPage->m_pDocument, pStream);
181 pImageCache = new CPDF_ImageCache(m_pPage->m_pDocument, pStream); 156 m_ImageCache[pStream] = pEntry;
182 m_ImageCaches.SetAt(pStream, pImageCache); 157 } else {
158 pEntry = it->second;
183 } 159 }
184 int oldsize = pImageCache->EstimateSize(); 160 m_nCacheSize -= pEntry->EstimateSize();
185 pImageCache->Reset(pBitmap); 161 pEntry->Reset(pBitmap);
186 m_nCacheSize = pImageCache->EstimateSize() - oldsize; 162 m_nCacheSize += pEntry->EstimateSize();
187 } 163 }
188 CPDF_ImageCache::CPDF_ImageCache(CPDF_Document* pDoc, CPDF_Stream* pStream) 164 CPDF_ImageCacheEntry::CPDF_ImageCacheEntry(CPDF_Document* pDoc,
165 CPDF_Stream* pStream)
189 : m_dwTimeCount(0), 166 : m_dwTimeCount(0),
190 m_pCurBitmap(NULL), 167 m_pCurBitmap(NULL),
191 m_pCurMask(NULL), 168 m_pCurMask(NULL),
192 m_MatteColor(0), 169 m_MatteColor(0),
193 m_pRenderStatus(NULL), 170 m_pRenderStatus(NULL),
194 m_pDocument(pDoc), 171 m_pDocument(pDoc),
195 m_pStream(pStream), 172 m_pStream(pStream),
196 m_pCachedBitmap(NULL), 173 m_pCachedBitmap(NULL),
197 m_pCachedMask(NULL), 174 m_pCachedMask(NULL),
198 m_dwCacheSize(0) {} 175 m_dwCacheSize(0) {}
199 CPDF_ImageCache::~CPDF_ImageCache() { 176 CPDF_ImageCacheEntry::~CPDF_ImageCacheEntry() {
200 delete m_pCachedBitmap; 177 delete m_pCachedBitmap;
201 m_pCachedBitmap = NULL;
202 delete m_pCachedMask; 178 delete m_pCachedMask;
203 m_pCachedMask = NULL;
204 } 179 }
205 void CPDF_ImageCache::Reset(const CFX_DIBitmap* pBitmap) { 180 void CPDF_ImageCacheEntry::Reset(const CFX_DIBitmap* pBitmap) {
206 delete m_pCachedBitmap; 181 delete m_pCachedBitmap;
207 m_pCachedBitmap = NULL; 182 m_pCachedBitmap = NULL;
208 if (pBitmap) { 183 if (pBitmap) {
209 m_pCachedBitmap = pBitmap->Clone(); 184 m_pCachedBitmap = pBitmap->Clone();
210 } 185 }
211 CalcSize(); 186 CalcSize();
212 } 187 }
213 void CPDF_PageRenderCache::ClearImageData() { 188 void CPDF_PageRenderCache::ClearImageData() {
214 FX_POSITION pos = m_ImageCaches.GetStartPosition(); 189 for (const auto& it : m_ImageCache)
215 while (pos) { 190 it.second->ClearImageData();
216 void* key;
217 void* value;
218 m_ImageCaches.GetNextAssoc(pos, key, value);
219 ((CPDF_ImageCache*)value)->ClearImageData();
220 }
221 } 191 }
222 void CPDF_ImageCache::ClearImageData() { 192 void CPDF_ImageCacheEntry::ClearImageData() {
223 if (m_pCachedBitmap && !m_pCachedBitmap->GetBuffer()) { 193 if (m_pCachedBitmap && !m_pCachedBitmap->GetBuffer()) {
224 ((CPDF_DIBSource*)m_pCachedBitmap)->ClearImageData(); 194 ((CPDF_DIBSource*)m_pCachedBitmap)->ClearImageData();
225 } 195 }
226 } 196 }
227 static FX_DWORD FPDF_ImageCache_EstimateImageSize(const CFX_DIBSource* pDIB) { 197 static FX_DWORD FPDF_ImageCache_EstimateImageSize(const CFX_DIBSource* pDIB) {
228 return pDIB && pDIB->GetBuffer() 198 return pDIB && pDIB->GetBuffer()
229 ? (FX_DWORD)pDIB->GetHeight() * pDIB->GetPitch() + 199 ? (FX_DWORD)pDIB->GetHeight() * pDIB->GetPitch() +
230 (FX_DWORD)pDIB->GetPaletteSize() * 4 200 (FX_DWORD)pDIB->GetPaletteSize() * 4
231 : 0; 201 : 0;
232 } 202 }
233 FX_BOOL CPDF_ImageCache::GetCachedBitmap(CFX_DIBSource*& pBitmap, 203 FX_BOOL CPDF_ImageCacheEntry::GetCachedBitmap(CFX_DIBSource*& pBitmap,
234 CFX_DIBSource*& pMask, 204 CFX_DIBSource*& pMask,
235 FX_DWORD& MatteColor, 205 FX_DWORD& MatteColor,
236 CPDF_Dictionary* pPageResources, 206 CPDF_Dictionary* pPageResources,
237 FX_BOOL bStdCS, 207 FX_BOOL bStdCS,
238 FX_DWORD GroupFamily, 208 FX_DWORD GroupFamily,
239 FX_BOOL bLoadMask, 209 FX_BOOL bLoadMask,
240 CPDF_RenderStatus* pRenderStatus, 210 CPDF_RenderStatus* pRenderStatus,
241 int32_t downsampleWidth, 211 int32_t downsampleWidth,
242 int32_t downsampleHeight) { 212 int32_t downsampleHeight) {
243 if (m_pCachedBitmap) { 213 if (m_pCachedBitmap) {
244 pBitmap = m_pCachedBitmap; 214 pBitmap = m_pCachedBitmap;
245 pMask = m_pCachedMask; 215 pMask = m_pCachedMask;
246 MatteColor = m_MatteColor; 216 MatteColor = m_MatteColor;
247 return TRUE; 217 return TRUE;
248 } 218 }
249 if (!pRenderStatus) { 219 if (!pRenderStatus) {
250 return FALSE; 220 return FALSE;
251 } 221 }
252 CPDF_RenderContext* pContext = pRenderStatus->GetContext(); 222 CPDF_RenderContext* pContext = pRenderStatus->GetContext();
(...skipping 18 matching lines...) Expand all
271 if (pMaskSrc) { 241 if (pMaskSrc) {
272 m_pCachedMask = pMaskSrc->Clone(); 242 m_pCachedMask = pMaskSrc->Clone();
273 delete pMaskSrc; 243 delete pMaskSrc;
274 } 244 }
275 245
276 pBitmap = m_pCachedBitmap; 246 pBitmap = m_pCachedBitmap;
277 pMask = m_pCachedMask; 247 pMask = m_pCachedMask;
278 CalcSize(); 248 CalcSize();
279 return FALSE; 249 return FALSE;
280 } 250 }
281 CFX_DIBSource* CPDF_ImageCache::DetachBitmap() { 251 CFX_DIBSource* CPDF_ImageCacheEntry::DetachBitmap() {
282 CFX_DIBSource* pDIBSource = m_pCurBitmap; 252 CFX_DIBSource* pDIBSource = m_pCurBitmap;
283 m_pCurBitmap = NULL; 253 m_pCurBitmap = NULL;
284 return pDIBSource; 254 return pDIBSource;
285 } 255 }
286 CFX_DIBSource* CPDF_ImageCache::DetachMask() { 256 CFX_DIBSource* CPDF_ImageCacheEntry::DetachMask() {
287 CFX_DIBSource* pDIBSource = m_pCurMask; 257 CFX_DIBSource* pDIBSource = m_pCurMask;
288 m_pCurMask = NULL; 258 m_pCurMask = NULL;
289 return pDIBSource; 259 return pDIBSource;
290 } 260 }
291 int CPDF_ImageCache::StartGetCachedBitmap(CPDF_Dictionary* pFormResources, 261 int CPDF_ImageCacheEntry::StartGetCachedBitmap(CPDF_Dictionary* pFormResources,
292 CPDF_Dictionary* pPageResources, 262 CPDF_Dictionary* pPageResources,
293 FX_BOOL bStdCS, 263 FX_BOOL bStdCS,
294 FX_DWORD GroupFamily, 264 FX_DWORD GroupFamily,
295 FX_BOOL bLoadMask, 265 FX_BOOL bLoadMask,
296 CPDF_RenderStatus* pRenderStatus, 266 CPDF_RenderStatus* pRenderStatus,
297 int32_t downsampleWidth, 267 int32_t downsampleWidth,
298 int32_t downsampleHeight) { 268 int32_t downsampleHeight) {
299 if (m_pCachedBitmap) { 269 if (m_pCachedBitmap) {
300 m_pCurBitmap = m_pCachedBitmap; 270 m_pCurBitmap = m_pCachedBitmap;
301 m_pCurMask = m_pCachedMask; 271 m_pCurMask = m_pCachedMask;
302 return 1; 272 return 1;
303 } 273 }
304 if (!pRenderStatus) { 274 if (!pRenderStatus) {
305 return 0; 275 return 0;
306 } 276 }
307 m_pRenderStatus = pRenderStatus; 277 m_pRenderStatus = pRenderStatus;
308 m_pCurBitmap = new CPDF_DIBSource; 278 m_pCurBitmap = new CPDF_DIBSource;
309 int ret = 279 int ret =
310 ((CPDF_DIBSource*)m_pCurBitmap) 280 ((CPDF_DIBSource*)m_pCurBitmap)
311 ->StartLoadDIBSource(m_pDocument, m_pStream, TRUE, pFormResources, 281 ->StartLoadDIBSource(m_pDocument, m_pStream, TRUE, pFormResources,
312 pPageResources, bStdCS, GroupFamily, bLoadMask); 282 pPageResources, bStdCS, GroupFamily, bLoadMask);
313 if (ret == 2) { 283 if (ret == 2) {
314 return ret; 284 return ret;
315 } 285 }
316 if (!ret) { 286 if (!ret) {
317 delete m_pCurBitmap; 287 delete m_pCurBitmap;
318 m_pCurBitmap = NULL; 288 m_pCurBitmap = NULL;
319 return 0; 289 return 0;
320 } 290 }
321 ContinueGetCachedBitmap(); 291 ContinueGetCachedBitmap();
322 return 0; 292 return 0;
323 } 293 }
324 int CPDF_ImageCache::ContinueGetCachedBitmap() { 294 void CPDF_ImageCacheEntry::ContinueGetCachedBitmap() {
325 m_MatteColor = ((CPDF_DIBSource*)m_pCurBitmap)->m_MatteColor; 295 m_MatteColor = ((CPDF_DIBSource*)m_pCurBitmap)->m_MatteColor;
326 m_pCurMask = ((CPDF_DIBSource*)m_pCurBitmap)->DetachMask(); 296 m_pCurMask = ((CPDF_DIBSource*)m_pCurBitmap)->DetachMask();
327 CPDF_RenderContext* pContext = m_pRenderStatus->GetContext(); 297 CPDF_RenderContext* pContext = m_pRenderStatus->GetContext();
328 CPDF_PageRenderCache* pPageRenderCache = pContext->GetPageCache(); 298 CPDF_PageRenderCache* pPageRenderCache = pContext->GetPageCache();
329 m_dwTimeCount = pPageRenderCache->GetTimeCount(); 299 m_dwTimeCount = pPageRenderCache->GetTimeCount();
330 if (m_pCurBitmap->GetPitch() * m_pCurBitmap->GetHeight() < 300 if (m_pCurBitmap->GetPitch() * m_pCurBitmap->GetHeight() <
331 FPDF_HUGE_IMAGE_SIZE) { 301 FPDF_HUGE_IMAGE_SIZE) {
332 m_pCachedBitmap = m_pCurBitmap->Clone(); 302 m_pCachedBitmap = m_pCurBitmap->Clone();
333 delete m_pCurBitmap; 303 delete m_pCurBitmap;
334 m_pCurBitmap = NULL; 304 m_pCurBitmap = NULL;
335 } else { 305 } else {
336 m_pCachedBitmap = m_pCurBitmap; 306 m_pCachedBitmap = m_pCurBitmap;
337 } 307 }
338 if (m_pCurMask) { 308 if (m_pCurMask) {
339 m_pCachedMask = m_pCurMask->Clone(); 309 m_pCachedMask = m_pCurMask->Clone();
340 delete m_pCurMask; 310 delete m_pCurMask;
341 m_pCurMask = NULL; 311 m_pCurMask = NULL;
342 } 312 }
343 m_pCurBitmap = m_pCachedBitmap; 313 m_pCurBitmap = m_pCachedBitmap;
344 m_pCurMask = m_pCachedMask; 314 m_pCurMask = m_pCachedMask;
345 CalcSize(); 315 CalcSize();
346 return 0;
347 } 316 }
348 int CPDF_ImageCache::Continue(IFX_Pause* pPause) { 317 int CPDF_ImageCacheEntry::Continue(IFX_Pause* pPause) {
349 int ret = ((CPDF_DIBSource*)m_pCurBitmap)->ContinueLoadDIBSource(pPause); 318 int ret = ((CPDF_DIBSource*)m_pCurBitmap)->ContinueLoadDIBSource(pPause);
350 if (ret == 2) { 319 if (ret == 2) {
351 return ret; 320 return ret;
352 } 321 }
353 if (!ret) { 322 if (!ret) {
354 delete m_pCurBitmap; 323 delete m_pCurBitmap;
355 m_pCurBitmap = NULL; 324 m_pCurBitmap = NULL;
356 return 0; 325 return 0;
357 } 326 }
358 ContinueGetCachedBitmap(); 327 ContinueGetCachedBitmap();
359 return 0; 328 return 0;
360 } 329 }
361 void CPDF_ImageCache::CalcSize() { 330 void CPDF_ImageCacheEntry::CalcSize() {
362 m_dwCacheSize = FPDF_ImageCache_EstimateImageSize(m_pCachedBitmap) + 331 m_dwCacheSize = FPDF_ImageCache_EstimateImageSize(m_pCachedBitmap) +
363 FPDF_ImageCache_EstimateImageSize(m_pCachedMask); 332 FPDF_ImageCache_EstimateImageSize(m_pCachedMask);
364 } 333 }
365 void CPDF_Document::ClearRenderFont() { 334 void CPDF_Document::ClearRenderFont() {
366 if (m_pDocRender) { 335 if (m_pDocRender) {
367 CFX_FontCache* pCache = m_pDocRender->GetFontCache(); 336 CFX_FontCache* pCache = m_pDocRender->GetFontCache();
368 if (pCache) { 337 if (pCache) {
369 pCache->FreeCache(FALSE); 338 pCache->FreeCache(FALSE);
370 } 339 }
371 } 340 }
372 } 341 }
OLDNEW
« no previous file with comments | « core/include/fpdfapi/fpdf_render.h ('k') | core/src/fpdfapi/fpdf_render/fpdf_render_loadimage.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698