From 0004f29bf6ee3c6060a272c79f14993e92e053c7 Mon Sep 17 00:00:00 2001 From: Tom Sepez Date: Mon, 27 Mar 2017 13:51:46 -0700 Subject: Refcount all CFX_DIBSources (and subclasses) all the time. There are currently several ownership models for these objects, including ad-hoc logic for sharing and deletion, and the now-redundant CFX_DIBitmapRef externally-counted handle to the DIBs. Replace them all with the internal refcount scheme. Change-Id: I2db399dfc19219eda384f94cc989353b78ce2872 Reviewed-on: https://pdfium-review.googlesource.com/3166 Reviewed-by: dsinclair Commit-Queue: dsinclair --- core/fpdfapi/render/cpdf_dibsource.cpp | 46 ++++++++++++++++------------------ 1 file changed, 21 insertions(+), 25 deletions(-) (limited to 'core/fpdfapi/render/cpdf_dibsource.cpp') diff --git a/core/fpdfapi/render/cpdf_dibsource.cpp b/core/fpdfapi/render/cpdf_dibsource.cpp index 899a783c47..f3703dd23a 100644 --- a/core/fpdfapi/render/cpdf_dibsource.cpp +++ b/core/fpdfapi/render/cpdf_dibsource.cpp @@ -8,6 +8,7 @@ #include #include +#include #include #include "core/fpdfapi/cpdf_modulemgr.h" @@ -126,12 +127,11 @@ CPDF_DIBSource::CPDF_DIBSource() CPDF_DIBSource::~CPDF_DIBSource() { FX_Free(m_pMaskedLine); FX_Free(m_pLineBuf); - m_pCachedBitmap.reset(); + m_pCachedBitmap.Reset(); // TODO(tsepez): determine if required early here. FX_Free(m_pCompData); CPDF_ColorSpace* pCS = m_pColorSpace; - if (pCS && m_pDocument) { + if (pCS && m_pDocument) m_pDocument->GetPageData()->ReleaseColorSpace(pCS->GetArray()); - } } bool CPDF_DIBSource::Load(CPDF_Document* pDoc, const CPDF_Stream* pStream) { @@ -332,7 +332,7 @@ int CPDF_DIBSource::ContinueLoadDIBSource(IFX_Pause* pPause) { m_pStreamAcc.get(), m_pGlobalStream.get(), m_pCachedBitmap->GetBuffer(), m_pCachedBitmap->GetPitch(), pPause); if (ret < 0) { - m_pCachedBitmap.reset(); + m_pCachedBitmap.Reset(); m_pGlobalStream.reset(); m_pJbig2Context.reset(); return 0; @@ -355,7 +355,7 @@ int CPDF_DIBSource::ContinueLoadDIBSource(IFX_Pause* pPause) { } ret = pJbig2Module->ContinueDecode(m_pJbig2Context.get(), pPause); if (ret < 0) { - m_pCachedBitmap.reset(); + m_pCachedBitmap.Reset(); m_pGlobalStream.reset(); m_pJbig2Context.reset(); return 0; @@ -507,10 +507,10 @@ int CPDF_DIBSource::CreateDecoder() { return m_pCachedBitmap ? 1 : 0; } if (decoder == "JBIG2Decode") { - m_pCachedBitmap = pdfium::MakeUnique(); + m_pCachedBitmap = pdfium::MakeRetain(); if (!m_pCachedBitmap->Create( m_Width, m_Height, m_bImageMask ? FXDIB_1bppMask : FXDIB_1bppRgb)) { - m_pCachedBitmap.reset(); + m_pCachedBitmap.Reset(); return 0; } m_Status = 1; @@ -656,9 +656,9 @@ void CPDF_DIBSource::LoadJpxBitmap() { format = FXDIB_Rgb; } - m_pCachedBitmap = pdfium::MakeUnique(); + m_pCachedBitmap = pdfium::MakeRetain(); if (!m_pCachedBitmap->Create(width, height, format)) { - m_pCachedBitmap.reset(); + m_pCachedBitmap.Reset(); return; } m_pCachedBitmap->Clear(0xFFFFFFFF); @@ -671,7 +671,7 @@ void CPDF_DIBSource::LoadJpxBitmap() { } if (!pJpxModule->Decode(context->decoder(), m_pCachedBitmap->GetBuffer(), m_pCachedBitmap->GetPitch(), output_offsets)) { - m_pCachedBitmap.reset(); + m_pCachedBitmap.Reset(); return; } if (m_pColorSpace && m_pColorSpace->GetFamily() == PDFCS_INDEXED && @@ -713,32 +713,29 @@ int CPDF_DIBSource::StratLoadMask() { } int CPDF_DIBSource::ContinueLoadMaskDIB(IFX_Pause* pPause) { - if (!m_pMask) { + if (!m_pMask) return 1; - } + int ret = m_pMask->ContinueLoadDIBSource(pPause); - if (ret == 2) { + if (ret == 2) return ret; - } - if (m_pColorSpace && m_bStdCS) { + + if (m_pColorSpace && m_bStdCS) m_pColorSpace->EnableStdConversion(false); - } + if (!ret) { - delete m_pMask; - m_pMask = nullptr; + m_pMask.Reset(); return ret; } return 1; } -CPDF_DIBSource* CPDF_DIBSource::DetachMask() { - CPDF_DIBSource* pDIBSource = m_pMask; - m_pMask = nullptr; - return pDIBSource; +CFX_RetainPtr CPDF_DIBSource::DetachMask() { + return std::move(m_pMask); } int CPDF_DIBSource::StartLoadMaskDIB() { - m_pMask = new CPDF_DIBSource; + m_pMask = pdfium::MakeRetain(); int ret = m_pMask->StartLoadDIBSource(m_pDocument, m_pMaskStream, false, nullptr, nullptr, true); if (ret == 2) { @@ -747,8 +744,7 @@ int CPDF_DIBSource::StartLoadMaskDIB() { return 2; } if (!ret) { - delete m_pMask; - m_pMask = nullptr; + m_pMask.Reset(); return 1; } return 1; -- cgit v1.2.3