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;