Change CFX_DIBitmap::MultiplyAlpha() to take a float
Some MultiplyAlpha() methods take a float, while others take an integer.
It is too easy to mix them up, so change CFX_DIBitmap::MultiplyAlpha()
to take a float to avoid inconsistencies.
Change-Id: I32041bbbe3a16b19e8eca4413677c0096a93e69e
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/115452
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 42ec4a0..6584e06 100644
--- a/core/fpdfapi/render/cpdf_imagerenderer.cpp
+++ b/core/fpdfapi/render/cpdf_imagerenderer.cpp
@@ -314,7 +314,7 @@
rect);
bitmap_device2.GetBitmap()->ConvertFormat(FXDIB_Format::k8bppMask);
bitmap_device1.GetBitmap()->MultiplyAlphaMask(bitmap_device2.GetBitmap());
- bitmap_device1.GetBitmap()->MultiplyAlpha(255);
+ bitmap_device1.GetBitmap()->MultiplyAlpha(1.0f);
m_pRenderStatus->GetRenderDevice()->SetDIBitsWithBlend(
bitmap_device1.GetBitmap(), rect.left, rect.top, m_BlendType);
return false;
@@ -365,7 +365,7 @@
#endif
bitmap_device1.GetBitmap()->MultiplyAlphaMask(bitmap_device2.GetBitmap());
if (m_BitmapAlpha < 255)
- bitmap_device1.GetBitmap()->MultiplyAlpha(m_BitmapAlpha);
+ bitmap_device1.GetBitmap()->MultiplyAlpha(m_BitmapAlpha / 255.0f);
m_pRenderStatus->GetRenderDevice()->SetDIBitsWithBlend(
bitmap_device1.GetBitmap(), rect.left, rect.top, m_BlendType);
return false;
@@ -562,7 +562,7 @@
m_FillArgb);
} else {
if (m_BitmapAlpha != 255)
- pBitmap->MultiplyAlpha(m_BitmapAlpha);
+ pBitmap->MultiplyAlpha(m_BitmapAlpha / 255.0f);
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 0830b85..de5fa6e 100644
--- a/core/fpdfapi/render/cpdf_renderstatus.cpp
+++ b/core/fpdfapi/render/cpdf_renderstatus.cpp
@@ -1218,7 +1218,7 @@
FXDIB_ResampleOptions(), &dummy);
return;
}
- pDIBitmap->MultiplyAlpha(bitmap_alpha);
+ pDIBitmap->MultiplyAlpha(bitmap_alpha / 255.0f);
}
if (m_pDevice->SetDIBits(pDIBitmap, left, top)) {
return;
diff --git a/core/fxge/agg/fx_agg_driver.cpp b/core/fxge/agg/fx_agg_driver.cpp
index 9eda66e..b123566 100644
--- a/core/fxge/agg/fx_agg_driver.cpp
+++ b/core/fxge/agg/fx_agg_driver.cpp
@@ -1131,7 +1131,7 @@
}
bool CFX_AggDeviceDriver::MultiplyAlpha(float alpha) {
- return m_pBitmap->MultiplyAlpha(static_cast<int32_t>(alpha * 255));
+ return m_pBitmap->MultiplyAlpha(alpha);
}
bool CFX_AggDeviceDriver::MultiplyAlphaMask(
diff --git a/core/fxge/dib/cfx_dibitmap.cpp b/core/fxge/dib/cfx_dibitmap.cpp
index f9793fc..2fc6d44 100644
--- a/core/fxge/dib/cfx_dibitmap.cpp
+++ b/core/fxge/dib/cfx_dibitmap.cpp
@@ -455,7 +455,7 @@
return true;
}
-bool CFX_DIBitmap::MultiplyAlpha(int alpha) {
+bool CFX_DIBitmap::MultiplyAlpha(float alpha) {
if (!m_pBuffer)
return false;
@@ -467,19 +467,21 @@
MultiplyAlpha(alpha);
break;
case FXDIB_Format::k8bppMask: {
+ const int bitmap_alpha = static_cast<int>(alpha * 255);
for (int row = 0; row < m_Height; row++) {
uint8_t* scan_line = m_pBuffer.Get() + row * m_Pitch;
for (int col = 0; col < m_Width; col++) {
- scan_line[col] = scan_line[col] * alpha / 255;
+ scan_line[col] = scan_line[col] * bitmap_alpha / 255;
}
}
break;
}
case FXDIB_Format::kArgb: {
+ const int bitmap_alpha = static_cast<int>(alpha * 255);
for (int row = 0; row < m_Height; row++) {
uint8_t* scan_line = m_pBuffer.Get() + row * m_Pitch + 3;
for (int col = 0; col < m_Width; col++) {
- *scan_line = (*scan_line) * alpha / 255;
+ *scan_line = (*scan_line) * bitmap_alpha / 255;
scan_line += 4;
}
}
diff --git a/core/fxge/dib/cfx_dibitmap.h b/core/fxge/dib/cfx_dibitmap.h
index 4dbe64a..29315df 100644
--- a/core/fxge/dib/cfx_dibitmap.h
+++ b/core/fxge/dib/cfx_dibitmap.h
@@ -65,7 +65,7 @@
bool SetUniformOpaqueAlpha();
// TODO(crbug.com/pdfium/2007): Migrate callers to `CFX_RenderDevice`.
- bool MultiplyAlpha(int alpha);
+ bool MultiplyAlpha(float alpha);
bool MultiplyAlphaMask(const RetainPtr<const CFX_DIBBase>& pSrcBitmap);
bool TransferBitmap(int dest_left,
diff --git a/core/fxge/dib/cfx_imagerenderer.cpp b/core/fxge/dib/cfx_imagerenderer.cpp
index 5abd96c..592124d 100644
--- a/core/fxge/dib/cfx_imagerenderer.cpp
+++ b/core/fxge/dib/cfx_imagerenderer.cpp
@@ -108,7 +108,7 @@
BlendMode::kNormal, m_pClipRgn, m_bRgbByteOrder);
} else {
if (m_BitmapAlpha != 255)
- pBitmap->MultiplyAlpha(m_BitmapAlpha);
+ pBitmap->MultiplyAlpha(m_BitmapAlpha / 255.0f);
m_pDevice->CompositeBitmap(
m_pTransformer->result().left, m_pTransformer->result().top,
pBitmap->GetWidth(), pBitmap->GetHeight(), pBitmap, 0, 0,