diff options
Diffstat (limited to 'core/fpdfapi/render/cpdf_imagecacheentry.cpp')
-rw-r--r-- | core/fpdfapi/render/cpdf_imagecacheentry.cpp | 66 |
1 files changed, 37 insertions, 29 deletions
diff --git a/core/fpdfapi/render/cpdf_imagecacheentry.cpp b/core/fpdfapi/render/cpdf_imagecacheentry.cpp index 751b3eb4b4..82b6117f86 100644 --- a/core/fpdfapi/render/cpdf_imagecacheentry.cpp +++ b/core/fpdfapi/render/cpdf_imagecacheentry.cpp @@ -31,27 +31,30 @@ CPDF_ImageCacheEntry::CPDF_ImageCacheEntry(CPDF_Document* pDoc, CPDF_ImageCacheEntry::~CPDF_ImageCacheEntry() {} -void CPDF_ImageCacheEntry::Reset(const CFX_RetainPtr<CFX_DIBitmap>& pBitmap) { - m_pCachedBitmap.Reset(); +void CPDF_ImageCacheEntry::Reset(const CFX_DIBitmap* pBitmap) { + m_pCachedBitmap.reset(); if (pBitmap) m_pCachedBitmap = pBitmap->Clone(); CalcSize(); } -static uint32_t FPDF_ImageCache_EstimateImageSize( - const CFX_RetainPtr<CFX_DIBSource>& pDIB) { +static uint32_t FPDF_ImageCache_EstimateImageSize(const CFX_DIBSource* pDIB) { return pDIB && pDIB->GetBuffer() ? (uint32_t)pDIB->GetHeight() * pDIB->GetPitch() + (uint32_t)pDIB->GetPaletteSize() * 4 : 0; } -CFX_RetainPtr<CFX_DIBSource> CPDF_ImageCacheEntry::DetachBitmap() { - return std::move(m_pCurBitmap); +CFX_DIBSource* CPDF_ImageCacheEntry::DetachBitmap() { + CFX_DIBSource* pDIBSource = m_pCurBitmap; + m_pCurBitmap = nullptr; + return pDIBSource; } -CFX_RetainPtr<CFX_DIBSource> CPDF_ImageCacheEntry::DetachMask() { - return std::move(m_pCurMask); +CFX_DIBSource* CPDF_ImageCacheEntry::DetachMask() { + CFX_DIBSource* pDIBSource = m_pCurMask; + m_pCurMask = nullptr; + return pDIBSource; } int CPDF_ImageCacheEntry::StartGetCachedBitmap(CPDF_Dictionary* pFormResources, @@ -63,23 +66,25 @@ int CPDF_ImageCacheEntry::StartGetCachedBitmap(CPDF_Dictionary* pFormResources, int32_t downsampleWidth, int32_t downsampleHeight) { if (m_pCachedBitmap) { - m_pCurBitmap = m_pCachedBitmap; - m_pCurMask = m_pCachedMask; + m_pCurBitmap = m_pCachedBitmap.get(); + m_pCurMask = m_pCachedMask.get(); return 1; } if (!pRenderStatus) return 0; m_pRenderStatus = pRenderStatus; - m_pCurBitmap = pdfium::MakeRetain<CPDF_DIBSource>(); - int ret = m_pCurBitmap.As<CPDF_DIBSource>()->StartLoadDIBSource( - m_pDocument, m_pStream, true, pFormResources, pPageResources, bStdCS, - GroupFamily, bLoadMask); + m_pCurBitmap = new CPDF_DIBSource; + int ret = + ((CPDF_DIBSource*)m_pCurBitmap) + ->StartLoadDIBSource(m_pDocument, m_pStream, true, pFormResources, + pPageResources, bStdCS, GroupFamily, bLoadMask); if (ret == 2) return ret; if (!ret) { - m_pCurBitmap.Reset(); + delete m_pCurBitmap; + m_pCurBitmap = nullptr; return 0; } ContinueGetCachedBitmap(); @@ -87,41 +92,44 @@ int CPDF_ImageCacheEntry::StartGetCachedBitmap(CPDF_Dictionary* pFormResources, } void CPDF_ImageCacheEntry::ContinueGetCachedBitmap() { - m_MatteColor = m_pCurBitmap.As<CPDF_DIBSource>()->GetMatteColor(); - m_pCurMask = m_pCurBitmap.As<CPDF_DIBSource>()->DetachMask(); + m_MatteColor = ((CPDF_DIBSource*)m_pCurBitmap)->GetMatteColor(); + m_pCurMask = ((CPDF_DIBSource*)m_pCurBitmap)->DetachMask(); CPDF_RenderContext* pContext = m_pRenderStatus->GetContext(); CPDF_PageRenderCache* pPageRenderCache = pContext->GetPageCache(); m_dwTimeCount = pPageRenderCache->GetTimeCount(); if (m_pCurBitmap->GetPitch() * m_pCurBitmap->GetHeight() < FPDF_HUGE_IMAGE_SIZE) { m_pCachedBitmap = m_pCurBitmap->Clone(); - m_pCurBitmap.Reset(); + delete m_pCurBitmap; + m_pCurBitmap = nullptr; } else { - m_pCachedBitmap = m_pCurBitmap; + m_pCachedBitmap = pdfium::WrapUnique<CFX_DIBSource>(m_pCurBitmap); } if (m_pCurMask) { m_pCachedMask = m_pCurMask->Clone(); - m_pCurMask.Reset(); + delete m_pCurMask; + m_pCurMask = nullptr; } - m_pCurBitmap = m_pCachedBitmap; - m_pCurMask = m_pCachedMask; + m_pCurBitmap = m_pCachedBitmap.get(); + m_pCurMask = m_pCachedMask.get(); CalcSize(); } int CPDF_ImageCacheEntry::Continue(IFX_Pause* pPause) { - int ret = m_pCurBitmap.As<CPDF_DIBSource>()->ContinueLoadDIBSource(pPause); - if (!ret) { - m_pCurBitmap.Reset(); - return 0; - } + int ret = ((CPDF_DIBSource*)m_pCurBitmap)->ContinueLoadDIBSource(pPause); if (ret == 2) return ret; + if (!ret) { + delete m_pCurBitmap; + m_pCurBitmap = nullptr; + return 0; + } ContinueGetCachedBitmap(); return 0; } void CPDF_ImageCacheEntry::CalcSize() { - m_dwCacheSize = FPDF_ImageCache_EstimateImageSize(m_pCachedBitmap) + - FPDF_ImageCache_EstimateImageSize(m_pCachedMask); + m_dwCacheSize = FPDF_ImageCache_EstimateImageSize(m_pCachedBitmap.get()) + + FPDF_ImageCache_EstimateImageSize(m_pCachedMask.get()); } |