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_