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/fxge/dib/fx_dib_transform.cpp | 38 ++++++++++++++++++++------------------ 1 file changed, 20 insertions(+), 18 deletions(-) (limited to 'core/fxge/dib/fx_dib_transform.cpp') diff --git a/core/fxge/dib/fx_dib_transform.cpp b/core/fxge/dib/fx_dib_transform.cpp index 4a1c3ee050..3d8ddf8783 100644 --- a/core/fxge/dib/fx_dib_transform.cpp +++ b/core/fxge/dib/fx_dib_transform.cpp @@ -100,7 +100,7 @@ void bicubic_get_pos_weight(int pos_pixel[], v_w[3] = SDP_Table[512 - res_y]; } -FXDIB_Format GetTransformedFormat(const CFX_DIBSource* pDrc) { +FXDIB_Format GetTransformedFormat(const CFX_RetainPtr& pDrc) { FXDIB_Format format = pDrc->GetFormat(); if (pDrc->IsAlphaMask()) { format = FXDIB_8bppMask; @@ -179,7 +179,7 @@ class CFX_BilinearMatrix : public CPDF_FixedMatrix { } }; -std::unique_ptr CFX_DIBSource::SwapXY( +CFX_RetainPtr CFX_DIBSource::SwapXY( bool bXFlip, bool bYFlip, const FX_RECT* pDestClip) const { @@ -189,7 +189,7 @@ std::unique_ptr CFX_DIBSource::SwapXY( if (dest_clip.IsEmpty()) return nullptr; - auto pTransBitmap = pdfium::MakeUnique(); + auto pTransBitmap = pdfium::MakeRetain(); int result_height = dest_clip.Height(); int result_width = dest_clip.Width(); if (!pTransBitmap->Create(result_width, result_height, GetFormat())) @@ -303,13 +303,14 @@ FX_RECT FXDIB_SwapClipBox(FX_RECT& clip, return rect; } -std::unique_ptr CFX_DIBSource::TransformTo( +CFX_RetainPtr CFX_DIBSource::TransformTo( const CFX_Matrix* pDestMatrix, int& result_left, int& result_top, uint32_t flags, - const FX_RECT* pDestClip) const { - CFX_ImageTransformer transformer(this, pDestMatrix, flags, pDestClip); + const FX_RECT* pDestClip) { + CFX_RetainPtr holder(this); + CFX_ImageTransformer transformer(holder, pDestMatrix, flags, pDestClip); transformer.Start(); transformer.Continue(nullptr); result_left = transformer.result().left; @@ -317,11 +318,11 @@ std::unique_ptr CFX_DIBSource::TransformTo( return transformer.DetachBitmap(); } -std::unique_ptr CFX_DIBSource::StretchTo( - int dest_width, - int dest_height, - uint32_t flags, - const FX_RECT* pClip) const { +CFX_RetainPtr CFX_DIBSource::StretchTo(int dest_width, + int dest_height, + uint32_t flags, + const FX_RECT* pClip) { + CFX_RetainPtr holder(this); FX_RECT clip_rect(0, 0, FXSYS_abs(dest_width), FXSYS_abs(dest_height)); if (pClip) clip_rect.Intersect(*pClip); @@ -333,7 +334,7 @@ std::unique_ptr CFX_DIBSource::StretchTo( return Clone(&clip_rect); CFX_BitmapStorer storer; - CFX_ImageStretcher stretcher(&storer, this, dest_width, dest_height, + CFX_ImageStretcher stretcher(&storer, holder, dest_width, dest_height, clip_rect, flags); if (stretcher.Start()) stretcher.Continue(nullptr); @@ -341,10 +342,11 @@ std::unique_ptr CFX_DIBSource::StretchTo( return storer.Detach(); } -CFX_ImageTransformer::CFX_ImageTransformer(const CFX_DIBSource* pSrc, - const CFX_Matrix* pMatrix, - int flags, - const FX_RECT* pClip) +CFX_ImageTransformer::CFX_ImageTransformer( + const CFX_RetainPtr& pSrc, + const CFX_Matrix* pMatrix, + int flags, + const FX_RECT* pClip) : m_pSrc(pSrc), m_pMatrix(pMatrix), m_pClip(pClip), @@ -444,7 +446,7 @@ bool CFX_ImageTransformer::Continue(IFX_Pause* pPause) { stretch_buf_mask = m_Storer.GetBitmap()->m_pAlphaMask->GetBuffer(); int stretch_pitch = m_Storer.GetBitmap()->GetPitch(); - std::unique_ptr pTransformed(new CFX_DIBitmap); + auto pTransformed = pdfium::MakeRetain(); FXDIB_Format transformF = GetTransformedFormat(m_Stretcher->source()); if (!pTransformed->Create(m_result.Width(), m_result.Height(), transformF)) return false; @@ -958,6 +960,6 @@ bool CFX_ImageTransformer::Continue(IFX_Pause* pPause) { return false; } -std::unique_ptr CFX_ImageTransformer::DetachBitmap() { +CFX_RetainPtr CFX_ImageTransformer::DetachBitmap() { return m_Storer.Detach(); } -- cgit v1.2.3