Handle MultiplyAlpha(1.0f) within MultiplyAlpha()
Treat this as a no-op inside of MultiplyAlpha(), instead of relying on
the caller to do the check. Also make sure the alpha value passed into
MultiplyAlpha() is in the range [0, 1].
Change-Id: I819866906d57a506e9310a6993701ae532c1266a
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/115492
Reviewed-by: Tom Sepez <tsepez@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 1b6b08b..1d27796 100644
--- a/core/fpdfapi/render/cpdf_imagerenderer.cpp
+++ b/core/fpdfapi/render/cpdf_imagerenderer.cpp
@@ -314,7 +314,6 @@
rect);
bitmap_device2.GetBitmap()->ConvertFormat(FXDIB_Format::k8bppMask);
bitmap_device1.GetBitmap()->MultiplyAlphaMask(bitmap_device2.GetBitmap());
- bitmap_device1.GetBitmap()->MultiplyAlpha(1.0f);
m_pRenderStatus->GetRenderDevice()->SetDIBitsWithBlend(
bitmap_device1.GetBitmap(), rect.left, rect.top, m_BlendType);
return false;
@@ -364,9 +363,7 @@
}
#endif
bitmap_device1.GetBitmap()->MultiplyAlphaMask(bitmap_device2.GetBitmap());
- if (m_Alpha != 1.0f) {
- bitmap_device1.GetBitmap()->MultiplyAlpha(m_Alpha);
- }
+ bitmap_device1.GetBitmap()->MultiplyAlpha(m_Alpha);
m_pRenderStatus->GetRenderDevice()->SetDIBitsWithBlend(
bitmap_device1.GetBitmap(), rect.left, rect.top, m_BlendType);
return false;
@@ -567,9 +564,7 @@
pBitmap, m_pTransformer->result().left, m_pTransformer->result().top,
m_FillArgb);
} else {
- if (m_Alpha != 1.0f) {
- pBitmap->MultiplyAlpha(m_Alpha);
- }
+ pBitmap->MultiplyAlpha(m_Alpha);
m_Result = m_pRenderStatus->GetRenderDevice()->SetDIBitsWithBlend(
pBitmap, m_pTransformer->result().left, m_pTransformer->result().top,
m_BlendType);
diff --git a/core/fpdfapi/render/cpdf_renderstatus.cpp b/core/fpdfapi/render/cpdf_renderstatus.cpp
index 81678ce..7ae0f1c 100644
--- a/core/fpdfapi/render/cpdf_renderstatus.cpp
+++ b/core/fpdfapi/render/cpdf_renderstatus.cpp
@@ -687,7 +687,7 @@
bitmap_device.MultiplyAlphaMask(pTextMask);
pTextMask.Reset();
}
- if (group_alpha != 1.0f && transparency.IsGroup()) {
+ if (transparency.IsGroup()) {
bitmap_device.MultiplyAlpha(group_alpha);
}
transparency = m_Transparency;
diff --git a/core/fxge/dib/cfx_dibitmap.cpp b/core/fxge/dib/cfx_dibitmap.cpp
index 13f310f..9842072 100644
--- a/core/fxge/dib/cfx_dibitmap.cpp
+++ b/core/fxge/dib/cfx_dibitmap.cpp
@@ -452,8 +452,16 @@
}
bool CFX_DIBitmap::MultiplyAlpha(float alpha) {
- if (!m_pBuffer)
+ CHECK_GE(alpha, 0.0f);
+ CHECK_LE(alpha, 1.0f);
+
+ if (alpha == 1.0f) {
+ return true;
+ }
+
+ if (!m_pBuffer) {
return false;
+ }
switch (GetFormat()) {
case FXDIB_Format::k1bppMask:
diff --git a/core/fxge/dib/cfx_imagerenderer.cpp b/core/fxge/dib/cfx_imagerenderer.cpp
index 2848b3b..3dc2e27 100644
--- a/core/fxge/dib/cfx_imagerenderer.cpp
+++ b/core/fxge/dib/cfx_imagerenderer.cpp
@@ -112,9 +112,7 @@
pBitmap->GetHeight(), pBitmap, m_MaskColor, 0, 0,
BlendMode::kNormal, m_pClipRgn, m_bRgbByteOrder);
} else {
- if (m_Alpha != 1.0f) {
- pBitmap->MultiplyAlpha(m_Alpha);
- }
+ pBitmap->MultiplyAlpha(m_Alpha);
m_pDevice->CompositeBitmap(
m_pTransformer->result().left, m_pTransformer->result().top,
pBitmap->GetWidth(), pBitmap->GetHeight(), pBitmap, 0, 0,
diff --git a/core/fxge/skia/fx_skia_device.cpp b/core/fxge/skia/fx_skia_device.cpp
index 2c39b5c..0009c22 100644
--- a/core/fxge/skia/fx_skia_device.cpp
+++ b/core/fxge/skia/fx_skia_device.cpp
@@ -953,10 +953,15 @@
}
bool CFX_SkiaDeviceDriver::MultiplyAlpha(float alpha) {
- SkPaint paint;
- paint.setAlphaf(alpha);
- paint.setBlendMode(SkBlendMode::kDstIn);
- m_pCanvas->drawPaint(paint);
+ CHECK_GE(alpha, 0.0f);
+ CHECK_LE(alpha, 1.0f);
+
+ if (alpha != 1.0f) {
+ SkPaint paint;
+ paint.setAlphaf(alpha);
+ paint.setBlendMode(SkBlendMode::kDstIn);
+ m_pCanvas->drawPaint(paint);
+ }
return true;
}