Split CPDF_ImageRenderer::Continue().
Put the different rendering paths in their own methods. Also convert the
|m_Status| member that selects the rendering path into enum Mode, and
give the rendering modes meaningful names.
Change-Id: I3cd9bb0b97a0a4d80ad27c95827ea30ea0c5f727
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/51355
Reviewed-by: Henrique Nakashima <hnakashima@chromium.org>
Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/core/fpdfapi/render/cpdf_imagerenderer.cpp b/core/fpdfapi/render/cpdf_imagerenderer.cpp
index 1f9ef98..b4568ae 100644
--- a/core/fpdfapi/render/cpdf_imagerenderer.cpp
+++ b/core/fpdfapi/render/cpdf_imagerenderer.cpp
@@ -66,7 +66,7 @@
m_pRenderStatus->GetContext()->GetPageCache(), m_bStdCS,
m_pRenderStatus->GetGroupFamily(),
m_pRenderStatus->GetLoadMask(), m_pRenderStatus.Get())) {
- m_Status = 4;
+ m_Mode = Mode::kDefault;
return true;
}
return false;
@@ -396,7 +396,7 @@
premultiplied, m_BitmapAlpha, m_FillArgb, m_ImageMatrix,
m_ResampleOptions, &m_DeviceHandle, m_BlendType)) {
if (m_DeviceHandle) {
- m_Status = 3;
+ m_Mode = Mode::kBlend;
return true;
}
return false;
@@ -406,7 +406,7 @@
m_pDIBBase, m_BitmapAlpha, m_FillArgb, m_ImageMatrix,
m_ResampleOptions, &m_DeviceHandle, m_BlendType)) {
if (m_DeviceHandle) {
- m_Status = 3;
+ m_Mode = Mode::kBlend;
return true;
}
return false;
@@ -426,7 +426,7 @@
FX_RECT clip_box = m_pRenderStatus->GetRenderDevice()->GetClipBox();
clip_box.Intersect(image_rect.value());
- m_Status = 2;
+ m_Mode = Mode::kTransform;
m_pTransformer = pdfium::MakeUnique<CFX_ImageTransformer>(
m_pDIBBase, m_ImageMatrix, m_ResampleOptions, &clip_box);
return true;
@@ -533,40 +533,53 @@
}
bool CPDF_ImageRenderer::Continue(PauseIndicatorIface* pPause) {
- if (m_Status == 2) {
- if (m_pTransformer->Continue(pPause))
- return true;
-
- RetainPtr<CFX_DIBitmap> pBitmap = m_pTransformer->DetachBitmap();
- if (!pBitmap)
+ switch (m_Mode) {
+ case Mode::kNone:
return false;
+ case Mode::kDefault:
+ return ContinueDefault(pPause);
+ case Mode::kBlend:
+ return ContinueBlend(pPause);
+ case Mode::kTransform:
+ return ContinueTransform(pPause);
+ }
+}
- if (pBitmap->IsAlphaMask()) {
- if (m_BitmapAlpha != 255)
- m_FillArgb = FXARGB_MUL_ALPHA(m_FillArgb, m_BitmapAlpha);
- m_Result = m_pRenderStatus->GetRenderDevice()->SetBitMask(
- pBitmap, m_pTransformer->result().left, m_pTransformer->result().top,
- m_FillArgb);
- } else {
- if (m_BitmapAlpha != 255)
- pBitmap->MultiplyAlpha(m_BitmapAlpha);
- m_Result = m_pRenderStatus->GetRenderDevice()->SetDIBitsWithBlend(
- pBitmap, m_pTransformer->result().left, m_pTransformer->result().top,
- m_BlendType);
- }
+bool CPDF_ImageRenderer::ContinueDefault(PauseIndicatorIface* pPause) {
+ if (m_Loader.Continue(pPause, m_pRenderStatus.Get()))
+ return true;
+
+ if (!StartRenderDIBBase())
return false;
- }
- if (m_Status == 3) {
- return m_pRenderStatus->GetRenderDevice()->ContinueDIBits(
- m_DeviceHandle.get(), pPause);
- }
- if (m_Status == 4) {
- if (m_Loader.Continue(pPause, m_pRenderStatus.Get()))
- return true;
+ return Continue(pPause);
+}
- if (StartRenderDIBBase())
- return Continue(pPause);
+bool CPDF_ImageRenderer::ContinueBlend(PauseIndicatorIface* pPause) {
+ return m_pRenderStatus->GetRenderDevice()->ContinueDIBits(
+ m_DeviceHandle.get(), pPause);
+}
+
+bool CPDF_ImageRenderer::ContinueTransform(PauseIndicatorIface* pPause) {
+ if (m_pTransformer->Continue(pPause))
+ return true;
+
+ RetainPtr<CFX_DIBitmap> pBitmap = m_pTransformer->DetachBitmap();
+ if (!pBitmap)
+ return false;
+
+ if (pBitmap->IsAlphaMask()) {
+ if (m_BitmapAlpha != 255)
+ m_FillArgb = FXARGB_MUL_ALPHA(m_FillArgb, m_BitmapAlpha);
+ m_Result = m_pRenderStatus->GetRenderDevice()->SetBitMask(
+ pBitmap, m_pTransformer->result().left, m_pTransformer->result().top,
+ m_FillArgb);
+ } else {
+ if (m_BitmapAlpha != 255)
+ pBitmap->MultiplyAlpha(m_BitmapAlpha);
+ m_Result = m_pRenderStatus->GetRenderDevice()->SetDIBitsWithBlend(
+ pBitmap, m_pTransformer->result().left, m_pTransformer->result().top,
+ m_BlendType);
}
return false;
}
diff --git a/core/fpdfapi/render/cpdf_imagerenderer.h b/core/fpdfapi/render/cpdf_imagerenderer.h
index bf3db2d..f12b6a5 100644
--- a/core/fpdfapi/render/cpdf_imagerenderer.h
+++ b/core/fpdfapi/render/cpdf_imagerenderer.h
@@ -50,10 +50,20 @@
bool GetResult() const { return m_Result; }
private:
+ enum class Mode {
+ kNone = 0,
+ kDefault,
+ kBlend,
+ kTransform,
+ };
+
bool StartBitmapAlpha();
bool StartDIBBase();
bool StartRenderDIBBase();
bool StartLoadDIBBase();
+ bool ContinueDefault(PauseIndicatorIface* pPause);
+ bool ContinueBlend(PauseIndicatorIface* pPause);
+ bool ContinueTransform(PauseIndicatorIface* pPause);
bool DrawMaskedImage();
bool DrawPatternImage();
bool NotDrawing() const;
@@ -82,7 +92,7 @@
CPDF_ImageLoader m_Loader;
std::unique_ptr<CFX_ImageTransformer> m_pTransformer;
std::unique_ptr<CFX_ImageRenderer> m_DeviceHandle;
- int m_Status = 0;
+ Mode m_Mode = Mode::kNone;
int m_BitmapAlpha = 0;
BlendMode m_BlendType = BlendMode::kNormal;
FX_ARGB m_FillArgb = 0;