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