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;
 }