From 174de19776de251aed79220742ecde3e2e435fed Mon Sep 17 00:00:00 2001 From: Lei Zhang Date: Wed, 19 Sep 2018 17:26:54 +0000 Subject: Encapsulate CPDF_ImageLoader. Change-Id: Iee7ce04630fed86f651cd382a19e46b2f7ab6d61 Reviewed-on: https://pdfium-review.googlesource.com/42672 Reviewed-by: Ryan Harrison Commit-Queue: Lei Zhang --- core/fpdfapi/render/cpdf_imageloader.cpp | 22 ++++++++++++++++------ core/fpdfapi/render/cpdf_imageloader.h | 16 ++++++++++++---- core/fpdfapi/render/cpdf_imagerenderer.cpp | 27 +++++++++++---------------- 3 files changed, 39 insertions(+), 26 deletions(-) diff --git a/core/fpdfapi/render/cpdf_imageloader.cpp b/core/fpdfapi/render/cpdf_imageloader.cpp index 157bc48d1b..d7b7bb8354 100644 --- a/core/fpdfapi/render/cpdf_imageloader.cpp +++ b/core/fpdfapi/render/cpdf_imageloader.cpp @@ -12,14 +12,12 @@ #include "core/fpdfapi/render/cpdf_imagecacheentry.h" #include "core/fpdfapi/render/cpdf_pagerendercache.h" #include "core/fpdfapi/render/cpdf_renderstatus.h" +#include "core/fpdfapi/render/cpdf_transferfunc.h" +#include "core/fxge/dib/cfx_dibitmap.h" -CPDF_ImageLoader::CPDF_ImageLoader() - : m_MatteColor(0), - m_bCached(false), - m_pCache(nullptr), - m_pImageObject(nullptr) {} +CPDF_ImageLoader::CPDF_ImageLoader() = default; -CPDF_ImageLoader::~CPDF_ImageLoader() {} +CPDF_ImageLoader::~CPDF_ImageLoader() = default; bool CPDF_ImageLoader::Start(CPDF_ImageObject* pImage, CPDF_PageRenderCache* pCache, @@ -52,6 +50,18 @@ bool CPDF_ImageLoader::Continue(PauseIndicatorIface* pPause, return ret; } +RetainPtr CPDF_ImageLoader::TranslateImage( + const RetainPtr& pTransferFunc) { + ASSERT(pTransferFunc); + ASSERT(!pTransferFunc->GetIdentity()); + + m_pBitmap = pTransferFunc->TranslateImage(m_pBitmap); + if (m_bCached && m_pMask) + m_pMask = m_pMask->Clone(nullptr); + m_bCached = false; + return m_pBitmap; +} + void CPDF_ImageLoader::HandleFailure() { if (m_pCache) { CPDF_ImageCacheEntry* entry = m_pCache->GetCurImageCacheEntry(); diff --git a/core/fpdfapi/render/cpdf_imageloader.h b/core/fpdfapi/render/cpdf_imageloader.h index de29d0e2a9..7586d69cc2 100644 --- a/core/fpdfapi/render/cpdf_imageloader.h +++ b/core/fpdfapi/render/cpdf_imageloader.h @@ -16,6 +16,7 @@ class CPDF_ImageObject; class CPDF_PageRenderCache; class CPDF_RenderStatus; +class CPDF_TransferFunc; class PauseIndicatorIface; class CPDF_ImageLoader { @@ -31,14 +32,21 @@ class CPDF_ImageLoader { CPDF_RenderStatus* pRenderStatus); bool Continue(PauseIndicatorIface* pPause, CPDF_RenderStatus* pRenderStatus); - RetainPtr m_pBitmap; - RetainPtr m_pMask; - uint32_t m_MatteColor; - bool m_bCached; + RetainPtr TranslateImage( + const RetainPtr& pTransferFunc); + + const RetainPtr& GetBitmap() const { return m_pBitmap; } + const RetainPtr& GetMask() const { return m_pMask; } + uint32_t MatteColor() const { return m_MatteColor; } private: void HandleFailure(); + RetainPtr m_pBitmap; + RetainPtr m_pMask; + uint32_t m_MatteColor = 0; + bool m_bCached = false; + UnownedPtr m_pCache; UnownedPtr m_pImageObject; }; diff --git a/core/fpdfapi/render/cpdf_imagerenderer.cpp b/core/fpdfapi/render/cpdf_imagerenderer.cpp index 33aca42ee1..cd68322644 100644 --- a/core/fpdfapi/render/cpdf_imagerenderer.cpp +++ b/core/fpdfapi/render/cpdf_imagerenderer.cpp @@ -70,28 +70,23 @@ bool CPDF_ImageRenderer::StartLoadDIBBase() { } bool CPDF_ImageRenderer::StartRenderDIBBase() { - if (!m_Loader.m_pBitmap) + if (!m_Loader.GetBitmap()) return false; CPDF_GeneralState& state = m_pImageObject->m_GeneralState; m_BitmapAlpha = FXSYS_round(255 * state.GetFillAlpha()); - m_pDIBBase = m_Loader.m_pBitmap; + m_pDIBBase = m_Loader.GetBitmap(); if (m_pRenderStatus->GetRenderOptions().ColorModeIs( CPDF_RenderOptions::kAlpha) && - !m_Loader.m_pMask) { + !m_Loader.GetMask()) { return StartBitmapAlpha(); } if (state.GetTR()) { if (!state.GetTransferFunc()) state.SetTransferFunc(m_pRenderStatus->GetTransferFunc(state.GetTR())); - if (state.GetTransferFunc() && !state.GetTransferFunc()->GetIdentity()) { - m_pDIBBase = m_Loader.m_pBitmap = - state.GetTransferFunc()->TranslateImage(m_Loader.m_pBitmap); - if (m_Loader.m_bCached && m_Loader.m_pMask) - m_Loader.m_pMask = m_Loader.m_pMask->Clone(nullptr); - m_Loader.m_bCached = false; - } + if (state.GetTransferFunc() && !state.GetTransferFunc()->GetIdentity()) + m_pDIBBase = m_Loader.TranslateImage(state.GetTransferFunc()); } m_FillArgb = 0; m_bPatternColor = false; @@ -127,7 +122,7 @@ bool CPDF_ImageRenderer::StartRenderDIBBase() { else if (m_pImageObject->GetImage()->IsInterpol()) m_Flags |= FXDIB_INTERPOL; - if (m_Loader.m_pMask) + if (m_Loader.GetMask()) return DrawMaskedImage(); if (m_bPatternColor) @@ -242,11 +237,11 @@ void CPDF_ImageRenderer::CalculateDrawImage( m_Flags, true, FXDIB_BLEND_NORMAL)) { image_render.Continue(nullptr); } - if (m_Loader.m_MatteColor == 0xffffffff) + if (m_Loader.MatteColor() == 0xffffffff) return; - int matte_r = FXARGB_R(m_Loader.m_MatteColor); - int matte_g = FXARGB_G(m_Loader.m_MatteColor); - int matte_b = FXARGB_B(m_Loader.m_MatteColor); + int matte_r = FXARGB_R(m_Loader.MatteColor()); + int matte_g = FXARGB_G(m_Loader.MatteColor()); + int matte_b = FXARGB_B(m_Loader.MatteColor()); for (int row = 0; row < rect.Height(); row++) { uint8_t* dest_scan = pBitmapDevice1->GetBitmap()->GetWritableScanline(row); const uint8_t* mask_scan = pBitmapDevice2->GetBitmap()->GetScanline(row); @@ -359,7 +354,7 @@ bool CPDF_ImageRenderer::DrawMaskedImage() { #else bitmap_device2.GetBitmap()->Clear(0); #endif - CalculateDrawImage(&bitmap_device1, &bitmap_device2, m_Loader.m_pMask, + CalculateDrawImage(&bitmap_device1, &bitmap_device2, m_Loader.GetMask(), &new_matrix, rect); #ifdef _SKIA_SUPPORT_ m_pRenderStatus->GetRenderDevice()->SetBitsWithMask( -- cgit v1.2.3