Change MultiplyAlphaMask() to take a CFX_DIBitmap

Since CFX_DIBitmap::MultiplyAlphaMask() casts the mask argument from
CFX_DIBBase to CFX_DIBitmap, and assumes that will succeeds, change the
mask parameter to CFX_DIBitmap to match that expectation. Also change
the parameter to pass by value with move semantics, and rename variables
to be more consistent.

Change-Id: I20f4845576241666d19bb6c73fe2398b308c9d2f
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/115814
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Thomas Sepez <tsepez@google.com>
Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/core/fpdfapi/render/cpdf_renderstatus.cpp b/core/fpdfapi/render/cpdf_renderstatus.cpp
index 885cf8a..2154b70 100644
--- a/core/fpdfapi/render/cpdf_renderstatus.cpp
+++ b/core/fpdfapi/render/cpdf_renderstatus.cpp
@@ -637,14 +637,15 @@
   CFX_Matrix new_matrix = mtObj2Device;
   new_matrix.Translate(-rect.left, -rect.top);
 
-  RetainPtr<CFX_DIBitmap> pTextMask;
+  RetainPtr<CFX_DIBitmap> text_mask_bitmap;
   if (bTextClip) {
-    pTextMask = pdfium::MakeRetain<CFX_DIBitmap>();
-    if (!pTextMask->Create(width, height, FXDIB_Format::k8bppMask))
+    text_mask_bitmap = pdfium::MakeRetain<CFX_DIBitmap>();
+    if (!text_mask_bitmap->Create(width, height, FXDIB_Format::k8bppMask)) {
       return true;
+    }
 
     CFX_DefaultRenderDevice text_device;
-    text_device.Attach(pTextMask);
+    text_device.Attach(text_mask_bitmap);
     for (size_t i = 0; i < pPageObj->clip_path().GetTextCount(); ++i) {
       CPDF_TextObject* textobj = pPageObj->clip_path().GetText(i);
       if (!textobj)
@@ -678,14 +679,14 @@
   if (pSMaskDict) {
     CFX_Matrix smask_matrix =
         *pPageObj->general_state().GetSMaskMatrix() * mtObj2Device;
-    RetainPtr<CFX_DIBBase> pSMaskSource =
+    RetainPtr<CFX_DIBitmap> smask_bitmap =
         LoadSMask(pSMaskDict.Get(), &rect, smask_matrix);
-    if (pSMaskSource)
-      bitmap_device.MultiplyAlphaMask(pSMaskSource);
+    if (smask_bitmap) {
+      bitmap_device.MultiplyAlphaMask(std::move(smask_bitmap));
+    }
   }
-  if (pTextMask) {
-    bitmap_device.MultiplyAlphaMask(pTextMask);
-    pTextMask.Reset();
+  if (text_mask_bitmap) {
+    bitmap_device.MultiplyAlphaMask(std::move(text_mask_bitmap));
   }
   if (transparency.IsGroup()) {
     bitmap_device.MultiplyAlpha(group_alpha);
diff --git a/core/fxge/agg/fx_agg_driver.cpp b/core/fxge/agg/fx_agg_driver.cpp
index 065ba66..cab97f0 100644
--- a/core/fxge/agg/fx_agg_driver.cpp
+++ b/core/fxge/agg/fx_agg_driver.cpp
@@ -1135,7 +1135,7 @@
 }
 
 bool CFX_AggDeviceDriver::MultiplyAlphaMask(
-    const RetainPtr<const CFX_DIBBase>& mask) {
+    RetainPtr<const CFX_DIBitmap> mask) {
   return m_pBitmap->MultiplyAlphaMask(std::move(mask));
 }
 
diff --git a/core/fxge/agg/fx_agg_driver.h b/core/fxge/agg/fx_agg_driver.h
index 539b122..0d38405 100644
--- a/core/fxge/agg/fx_agg_driver.h
+++ b/core/fxge/agg/fx_agg_driver.h
@@ -99,7 +99,7 @@
                       const CFX_TextRenderOptions& options) override;
   int GetDriverType() const override;
   bool MultiplyAlpha(float alpha) override;
-  bool MultiplyAlphaMask(const RetainPtr<const CFX_DIBBase>& mask) override;
+  bool MultiplyAlphaMask(RetainPtr<const CFX_DIBitmap> mask) override;
 
   void Clear(uint32_t color);
 
diff --git a/core/fxge/cfx_renderdevice.cpp b/core/fxge/cfx_renderdevice.cpp
index a4aebb4..3d8f428 100644
--- a/core/fxge/cfx_renderdevice.cpp
+++ b/core/fxge/cfx_renderdevice.cpp
@@ -1485,9 +1485,8 @@
   return m_pDeviceDriver->MultiplyAlpha(alpha);
 }
 
-bool CFX_RenderDevice::MultiplyAlphaMask(
-    const RetainPtr<const CFX_DIBBase>& mask) {
-  return m_pDeviceDriver->MultiplyAlphaMask(mask);
+bool CFX_RenderDevice::MultiplyAlphaMask(RetainPtr<const CFX_DIBitmap> mask) {
+  return m_pDeviceDriver->MultiplyAlphaMask(std::move(mask));
 }
 
 CFX_RenderDevice::StateRestorer::StateRestorer(CFX_RenderDevice* pDevice)
diff --git a/core/fxge/cfx_renderdevice.h b/core/fxge/cfx_renderdevice.h
index f69d5d4..9eaf019 100644
--- a/core/fxge/cfx_renderdevice.h
+++ b/core/fxge/cfx_renderdevice.h
@@ -207,7 +207,7 @@
   bool MultiplyAlpha(float alpha);
 
   // Multiplies the device by an alpha mask, returning `true` on success.
-  bool MultiplyAlphaMask(const RetainPtr<const CFX_DIBBase>& mask);
+  bool MultiplyAlphaMask(RetainPtr<const CFX_DIBitmap> mask);
 
 #if defined(PDF_USE_SKIA)
   bool SetBitsWithMask(RetainPtr<const CFX_DIBBase> bitmap,
diff --git a/core/fxge/dib/cfx_dibitmap.cpp b/core/fxge/dib/cfx_dibitmap.cpp
index 9842072..91178f4 100644
--- a/core/fxge/dib/cfx_dibitmap.cpp
+++ b/core/fxge/dib/cfx_dibitmap.cpp
@@ -396,23 +396,22 @@
   return true;
 }
 
-bool CFX_DIBitmap::MultiplyAlphaMask(RetainPtr<const CFX_DIBBase> source) {
-  CHECK(source->IsMaskFormat());
+bool CFX_DIBitmap::MultiplyAlphaMask(RetainPtr<const CFX_DIBitmap> mask) {
+  CHECK(mask->IsMaskFormat());
 
   if (!m_pBuffer) {
     return false;
   }
 
   if (IsOpaqueImage()) {
-    return SetAlphaFromBitmap(std::move(source));
+    return SetAlphaFromBitmap(std::move(mask));
   }
 
-  RetainPtr<const CFX_DIBitmap> pSrcClone = source.As<const CFX_DIBitmap>();
-  if (source->GetWidth() != m_Width || source->GetHeight() != m_Height) {
-    pSrcClone =
-        source->StretchTo(m_Width, m_Height, FXDIB_ResampleOptions(), nullptr);
-    if (!pSrcClone)
+  if (mask->GetWidth() != m_Width || mask->GetHeight() != m_Height) {
+    mask = mask->StretchTo(m_Width, m_Height, FXDIB_ResampleOptions(), nullptr);
+    if (!mask) {
       return false;
+    }
   }
   if (IsMaskFormat()) {
     if (!ConvertFormat(FXDIB_Format::k8bppMask))
@@ -420,15 +419,16 @@
 
     for (int row = 0; row < m_Height; row++) {
       uint8_t* dest_scan = m_pBuffer.Get() + m_Pitch * row;
-      uint8_t* src_scan = pSrcClone->m_pBuffer.Get() + pSrcClone->m_Pitch * row;
-      if (pSrcClone->GetBPP() == 1) {
+      const uint8_t* mask_scan = mask->m_pBuffer.Get() + mask->m_Pitch * row;
+      if (mask->GetBPP() == 1) {
         for (int col = 0; col < m_Width; col++) {
-          if (!((1 << (7 - col % 8)) & src_scan[col / 8]))
+          if (!((1 << (7 - col % 8)) & mask_scan[col / 8])) {
             dest_scan[col] = 0;
+          }
         }
       } else {
         for (int col = 0; col < m_Width; col++) {
-          *dest_scan = (*dest_scan) * src_scan[col] / 255;
+          *dest_scan = (*dest_scan) * mask_scan[col] / 255;
           dest_scan++;
         }
       }
@@ -437,14 +437,15 @@
   }
 
   DCHECK_EQ(GetFormat(), FXDIB_Format::kArgb);
-  if (pSrcClone->GetBPP() == 1)
+  if (mask->GetBPP() == 1) {
     return false;
+  }
 
   for (int row = 0; row < m_Height; row++) {
     uint8_t* dest_scan = m_pBuffer.Get() + m_Pitch * row + 3;
-    uint8_t* src_scan = pSrcClone->m_pBuffer.Get() + pSrcClone->m_Pitch * row;
+    const uint8_t* mask_scan = mask->m_pBuffer.Get() + mask->m_Pitch * row;
     for (int col = 0; col < m_Width; col++) {
-      *dest_scan = (*dest_scan) * src_scan[col] / 255;
+      *dest_scan = (*dest_scan) * mask_scan[col] / 255;
       dest_scan += 4;
     }
   }
diff --git a/core/fxge/dib/cfx_dibitmap.h b/core/fxge/dib/cfx_dibitmap.h
index e48f35a..089d475 100644
--- a/core/fxge/dib/cfx_dibitmap.h
+++ b/core/fxge/dib/cfx_dibitmap.h
@@ -65,7 +65,7 @@
 
   // TODO(crbug.com/pdfium/2007): Migrate callers to `CFX_RenderDevice`.
   bool MultiplyAlpha(float alpha);
-  bool MultiplyAlphaMask(RetainPtr<const CFX_DIBBase> source);
+  bool MultiplyAlphaMask(RetainPtr<const CFX_DIBitmap> mask);
 
   bool TransferBitmap(int dest_left,
                       int dest_top,
diff --git a/core/fxge/renderdevicedriver_iface.h b/core/fxge/renderdevicedriver_iface.h
index c80b427..1dc9a09 100644
--- a/core/fxge/renderdevicedriver_iface.h
+++ b/core/fxge/renderdevicedriver_iface.h
@@ -127,7 +127,7 @@
   virtual bool MultiplyAlpha(float alpha) = 0;
 
   // Multiplies the device by an alpha mask, returning `true` on success.
-  virtual bool MultiplyAlphaMask(const RetainPtr<const CFX_DIBBase>& mask) = 0;
+  virtual bool MultiplyAlphaMask(RetainPtr<const CFX_DIBitmap> mask) = 0;
 };
 
 #endif  // CORE_FXGE_RENDERDEVICEDRIVER_IFACE_H_
diff --git a/core/fxge/skia/fx_skia_device.cpp b/core/fxge/skia/fx_skia_device.cpp
index fbb8f8f..427af0f 100644
--- a/core/fxge/skia/fx_skia_device.cpp
+++ b/core/fxge/skia/fx_skia_device.cpp
@@ -966,7 +966,7 @@
 }
 
 bool CFX_SkiaDeviceDriver::MultiplyAlphaMask(
-    const RetainPtr<const CFX_DIBBase>& mask) {
+    RetainPtr<const CFX_DIBitmap> mask) {
   CHECK(mask->IsMaskFormat());
 
   sk_sp<SkImage> skia_mask = mask->RealizeSkImage();
diff --git a/core/fxge/skia/fx_skia_device.h b/core/fxge/skia/fx_skia_device.h
index 8164de9..ac871c1 100644
--- a/core/fxge/skia/fx_skia_device.h
+++ b/core/fxge/skia/fx_skia_device.h
@@ -153,7 +153,7 @@
                    bool bAlphaMode) override;
 
   bool MultiplyAlpha(float alpha) override;
-  bool MultiplyAlphaMask(const RetainPtr<const CFX_DIBBase>& mask) override;
+  bool MultiplyAlphaMask(RetainPtr<const CFX_DIBitmap> mask) override;
 
   void Clear(uint32_t color);
   void Dump() const;
diff --git a/core/fxge/win32/cgdi_device_driver.cpp b/core/fxge/win32/cgdi_device_driver.cpp
index 5ea7015..b959be4 100644
--- a/core/fxge/win32/cgdi_device_driver.cpp
+++ b/core/fxge/win32/cgdi_device_driver.cpp
@@ -541,8 +541,7 @@
   NOTREACHED_NORETURN();
 }
 
-bool CGdiDeviceDriver::MultiplyAlphaMask(
-    const RetainPtr<const CFX_DIBBase>& mask) {
+bool CGdiDeviceDriver::MultiplyAlphaMask(RetainPtr<const CFX_DIBitmap> mask) {
   // Not implemented. All callers are using `CFX_DIBitmap`-backed raster devices
   // anyway.
   NOTREACHED_NORETURN();
diff --git a/core/fxge/win32/cgdi_device_driver.h b/core/fxge/win32/cgdi_device_driver.h
index f733617..644a2a4 100644
--- a/core/fxge/win32/cgdi_device_driver.h
+++ b/core/fxge/win32/cgdi_device_driver.h
@@ -48,7 +48,7 @@
                         BlendMode blend_type) override;
   bool GetClipBox(FX_RECT* pRect) override;
   bool MultiplyAlpha(float alpha) override;
-  bool MultiplyAlphaMask(const RetainPtr<const CFX_DIBBase>& mask) override;
+  bool MultiplyAlphaMask(RetainPtr<const CFX_DIBitmap> mask) override;
 
   void DrawLine(float x1, float y1, float x2, float y2);
 
diff --git a/core/fxge/win32/cps_printer_driver.cpp b/core/fxge/win32/cps_printer_driver.cpp
index 84a23f1..8e0f914 100644
--- a/core/fxge/win32/cps_printer_driver.cpp
+++ b/core/fxge/win32/cps_printer_driver.cpp
@@ -17,6 +17,7 @@
 #include "core/fxge/cfx_fillrenderoptions.h"
 #include "core/fxge/cfx_path.h"
 #include "core/fxge/dib/cfx_dibbase.h"
+#include "core/fxge/dib/cfx_dibitmap.h"
 #include "core/fxge/dib/cfx_imagerenderer.h"
 #include "core/fxge/win32/cpsoutput.h"
 #include "third_party/base/check.h"
@@ -214,8 +215,7 @@
   NOTREACHED_NORETURN();
 }
 
-bool CPSPrinterDriver::MultiplyAlphaMask(
-    const RetainPtr<const CFX_DIBBase>& mask) {
+bool CPSPrinterDriver::MultiplyAlphaMask(RetainPtr<const CFX_DIBitmap> mask) {
   // PostScript doesn't support transparency. All callers are using
   // `CFX_DIBitmap`-backed raster devices anyway.
   NOTREACHED_NORETURN();
diff --git a/core/fxge/win32/cps_printer_driver.h b/core/fxge/win32/cps_printer_driver.h
index 52d8124..aa2ddf4 100644
--- a/core/fxge/win32/cps_printer_driver.h
+++ b/core/fxge/win32/cps_printer_driver.h
@@ -74,7 +74,7 @@
                       uint32_t color,
                       const CFX_TextRenderOptions& options) override;
   bool MultiplyAlpha(float alpha) override;
-  bool MultiplyAlphaMask(const RetainPtr<const CFX_DIBBase>& mask) override;
+  bool MultiplyAlphaMask(RetainPtr<const CFX_DIBitmap> mask) override;
 
   HDC m_hDC;
   int m_Width;
diff --git a/core/fxge/win32/ctext_only_printer_driver.cpp b/core/fxge/win32/ctext_only_printer_driver.cpp
index dc28953..c5a4903 100644
--- a/core/fxge/win32/ctext_only_printer_driver.cpp
+++ b/core/fxge/win32/ctext_only_printer_driver.cpp
@@ -15,6 +15,7 @@
 #include "core/fxcrt/fx_system.h"
 #include "core/fxge/cfx_font.h"
 #include "core/fxge/dib/cfx_dibbase.h"
+#include "core/fxge/dib/cfx_dibitmap.h"
 #include "core/fxge/text_char_pos.h"
 #include "third_party/base/check_op.h"
 #include "third_party/base/notreached.h"
@@ -186,7 +187,7 @@
 }
 
 bool CTextOnlyPrinterDriver::MultiplyAlphaMask(
-    const RetainPtr<const CFX_DIBBase>& mask) {
+    RetainPtr<const CFX_DIBitmap> mask) {
   // Not needed. All callers are using `CFX_DIBitmap`-backed raster devices
   // anyway.
   NOTREACHED_NORETURN();
diff --git a/core/fxge/win32/ctext_only_printer_driver.h b/core/fxge/win32/ctext_only_printer_driver.h
index a9469eb..aa287f7 100644
--- a/core/fxge/win32/ctext_only_printer_driver.h
+++ b/core/fxge/win32/ctext_only_printer_driver.h
@@ -65,7 +65,7 @@
                       uint32_t color,
                       const CFX_TextRenderOptions& options) override;
   bool MultiplyAlpha(float alpha) override;
-  bool MultiplyAlphaMask(const RetainPtr<const CFX_DIBBase>& mask) override;
+  bool MultiplyAlphaMask(RetainPtr<const CFX_DIBitmap> mask) override;
 
   HDC m_hDC;
   const int m_Width;