Refactor CFX_ImageTransformer::Continue().
Split off portions of the function into separate helper functions for
the different types of stretch operations. This makes the branching
logic in Continue() easier to understand.
Also change int m_Status, which keeps track of the type of operation
being performed, into enum StretchType m_type.
Change-Id: I86c2cf456d75e18b8248d5a5f907b768cb8b6e50
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/65131
Commit-Queue: Lei Zhang <thestig@chromium.org>
Reviewed-by: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fxge/dib/cfx_imagetransformer.cpp b/core/fxge/dib/cfx_imagetransformer.cpp
index 3c02603..3afc48c 100644
--- a/core/fxge/dib/cfx_imagetransformer.cpp
+++ b/core/fxge/dib/cfx_imagetransformer.cpp
@@ -334,7 +334,7 @@
&m_Storer, m_pSrc, dest_height, dest_width, result_clip,
m_ResampleOptions);
m_Stretcher->Start();
- m_Status = 1;
+ m_type = kRotate;
return;
}
if (fabs(m_matrix.b) < kFix16 && fabs(m_matrix.c) < kFix16) {
@@ -347,7 +347,7 @@
&m_Storer, m_pSrc, dest_width, dest_height, result_clip,
m_ResampleOptions);
m_Stretcher->Start();
- m_Status = 2;
+ m_type = kNormal;
return;
}
@@ -377,37 +377,49 @@
&m_Storer, m_pSrc, stretch_width, stretch_height, m_StretchClip,
m_ResampleOptions);
m_Stretcher->Start();
- m_Status = 3;
+ m_type = kOther;
}
-CFX_ImageTransformer::~CFX_ImageTransformer() {}
+CFX_ImageTransformer::~CFX_ImageTransformer() = default;
bool CFX_ImageTransformer::Continue(PauseIndicatorIface* pPause) {
- if (m_Status == 1) {
- if (m_Stretcher->Continue(pPause))
- return true;
-
- if (m_Storer.GetBitmap()) {
- m_Storer.Replace(
- m_Storer.GetBitmap()->SwapXY(m_matrix.c > 0, m_matrix.b < 0));
- }
+ if (m_type == kNone)
return false;
- }
- if (m_Status == 2)
- return m_Stretcher->Continue(pPause);
- if (m_Status != 3)
- return false;
if (m_Stretcher->Continue(pPause))
return true;
+ switch (m_type) {
+ case kNormal:
+ break;
+ case kRotate:
+ ContinueRotate(pPause);
+ break;
+ case kOther:
+ ContinueOther(pPause);
+ break;
+ default:
+ NOTREACHED();
+ break;
+ }
+ return false;
+}
+
+void CFX_ImageTransformer::ContinueRotate(PauseIndicatorIface* pPause) {
+ if (m_Storer.GetBitmap()) {
+ m_Storer.Replace(
+ m_Storer.GetBitmap()->SwapXY(m_matrix.c > 0, m_matrix.b < 0));
+ }
+}
+
+void CFX_ImageTransformer::ContinueOther(PauseIndicatorIface* pPause) {
if (!m_Storer.GetBitmap())
- return false;
+ return;
auto pTransformed = pdfium::MakeRetain<CFX_DIBitmap>();
FXDIB_Format format = GetTransformedFormat(m_Stretcher->source());
if (!pTransformed->Create(m_result.Width(), m_result.Height(), format))
- return false;
+ return;
const auto& pSrcMask = m_Storer.GetBitmap()->m_pAlphaMask;
const uint8_t* pSrcMaskBuf = pSrcMask ? pSrcMask->GetBuffer() : nullptr;
@@ -446,7 +458,6 @@
CalcColor(cdata, format, Bpp);
}
m_Storer.Replace(std::move(pTransformed));
- return false;
}
RetainPtr<CFX_DIBitmap> CFX_ImageTransformer::DetachBitmap() {
diff --git a/core/fxge/dib/cfx_imagetransformer.h b/core/fxge/dib/cfx_imagetransformer.h
index c95b441..3372003 100644
--- a/core/fxge/dib/cfx_imagetransformer.h
+++ b/core/fxge/dib/cfx_imagetransformer.h
@@ -67,6 +67,16 @@
RetainPtr<CFX_DIBitmap> DetachBitmap();
private:
+ enum StretchType {
+ kNone,
+ kNormal,
+ kRotate,
+ kOther,
+ };
+
+ void ContinueRotate(PauseIndicatorIface* pPause);
+ void ContinueOther(PauseIndicatorIface* pPause);
+
void CalcMask(const CalcData& cdata);
void CalcAlpha(const CalcData& cdata);
void CalcMono(const CalcData& cdata, FXDIB_Format format);
@@ -83,7 +93,7 @@
std::unique_ptr<CFX_ImageStretcher> m_Stretcher;
CFX_BitmapStorer m_Storer;
const FXDIB_ResampleOptions m_ResampleOptions;
- int m_Status = 0;
+ StretchType m_type = kNone;
};
#endif // CORE_FXGE_DIB_CFX_IMAGETRANSFORMER_H_