Remove unnecessary Clear() operations
Removes redundant CFX_DIBitmap::Clear(0) operations that follow a
Create() with a format other than FXDIB_Format::kRgb32. Create() already
initializes the bitmap memory to 0, and Clear() does the same thing
except when using FXDIB_Format::kRgb32 on Skia, or when using an indexed
format with a custom palette.
Bug: pdfium:2016
Change-Id: I1a7e3dd00095b10d79275d64dc25350c79c62451
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/106530
Commit-Queue: Nigi <nigi@chromium.org>
Auto-Submit: K. Moon <kmoon@chromium.org>
Commit-Queue: K. Moon <kmoon@chromium.org>
Reviewed-by: Nigi <nigi@chromium.org>
diff --git a/core/fpdfapi/render/cpdf_imagerenderer.cpp b/core/fpdfapi/render/cpdf_imagerenderer.cpp
index aa2038a..c5f3f1d 100644
--- a/core/fpdfapi/render/cpdf_imagerenderer.cpp
+++ b/core/fpdfapi/render/cpdf_imagerenderer.cpp
@@ -313,7 +313,6 @@
nullptr)) {
return true;
}
- bitmap_device1.GetBitmap()->Clear(0);
CPDF_RenderStatus bitmap_render(m_pRenderStatus->GetContext(),
&bitmap_device1);
@@ -339,7 +338,6 @@
FXDIB_Format::k8bppRgb, nullptr)) {
return true;
}
- bitmap_device2.GetBitmap()->Clear(0);
CalculateDrawImage(&bitmap_device1, &bitmap_device2, m_pDIBBase, new_matrix,
rect);
bitmap_device2.GetBitmap()->ConvertFormat(FXDIB_Format::k8bppMask);
@@ -381,7 +379,6 @@
FXDIB_Format::k8bppRgb, nullptr)) {
return true;
}
- ClearBitmap(bitmap_device2, 0);
CalculateDrawImage(&bitmap_device1, &bitmap_device2, m_pLoader->GetMask(),
new_matrix, rect);
#if defined(_SKIA_SUPPORT_)
diff --git a/core/fpdfapi/render/cpdf_rendershading.cpp b/core/fpdfapi/render/cpdf_rendershading.cpp
index 5228a70..ce7543b 100644
--- a/core/fpdfapi/render/cpdf_rendershading.cpp
+++ b/core/fpdfapi/render/cpdf_rendershading.cpp
@@ -921,7 +921,9 @@
if (pBitmap->GetBuffer().empty())
return;
- pBitmap->Clear(background);
+ if (background != 0) {
+ pBitmap->Clear(background);
+ }
const CFX_Matrix final_matrix = mtMatrix * buffer.GetMatrix();
const auto& funcs = pPattern->GetFuncs();
switch (pPattern->GetShadingType()) {
diff --git a/core/fpdfapi/render/cpdf_renderstatus.cpp b/core/fpdfapi/render/cpdf_renderstatus.cpp
index 3eac569..fe58de8 100644
--- a/core/fpdfapi/render/cpdf_renderstatus.cpp
+++ b/core/fpdfapi/render/cpdf_renderstatus.cpp
@@ -725,7 +725,9 @@
}
CFX_Matrix FinalMatrix = m_DeviceMatrix;
FinalMatrix.Translate(-bbox.left, -bbox.top);
- pBackdrop->Clear(pBackdrop->IsAlphaFormat() ? 0 : 0xffffffff);
+ if (!pBackdrop->IsAlphaFormat()) {
+ pBackdrop->Clear(0xffffffff);
+ }
CFX_DefaultRenderDevice device;
device.Attach(pBackdrop);
diff --git a/core/fpdfapi/render/cpdf_rendertiling.cpp b/core/fpdfapi/render/cpdf_rendertiling.cpp
index db1f338..fcde2b2 100644
--- a/core/fpdfapi/render/cpdf_rendertiling.cpp
+++ b/core/fpdfapi/render/cpdf_rendertiling.cpp
@@ -39,7 +39,6 @@
CFX_DefaultRenderDevice bitmap_device;
bitmap_device.AttachWithBackdropAndGroupKnockout(
pBitmap, /*pBackdropBitmap=*/nullptr, /*bGroupKnockout=*/true);
- pBitmap->Clear(0);
CFX_FloatRect cell_bbox =
pPattern->pattern_to_form().TransformRect(pPattern->bbox());
cell_bbox = mtObject2Device.TransformRect(cell_bbox);
@@ -195,7 +194,6 @@
if (!pScreen->Create(clip_width, clip_height, FXDIB_Format::kArgb))
return nullptr;
- pScreen->Clear(0);
pdfium::span<const uint8_t> src_buf = pPatternBitmap->GetBuffer();
for (int col = min_col; col <= max_col; col++) {
for (int row = min_row; row <= max_row; row++) {
diff --git a/core/fxge/agg/fx_agg_driver.cpp b/core/fxge/agg/fx_agg_driver.cpp
index 19b46ff..a1949de 100644
--- a/core/fxge/agg/fx_agg_driver.cpp
+++ b/core/fxge/agg/fx_agg_driver.cpp
@@ -1054,7 +1054,6 @@
auto pThisLayer = pdfium::MakeRetain<CFX_DIBitmap>();
pThisLayer->Create(path_rect.Width(), path_rect.Height(),
FXDIB_Format::k8bppMask);
- pThisLayer->Clear(0);
agg::rendering_buffer raw_buf(pThisLayer->GetBuffer().data(),
pThisLayer->GetWidth(), pThisLayer->GetHeight(),
pThisLayer->GetPitch());
diff --git a/core/fxge/cfx_renderdevice.cpp b/core/fxge/cfx_renderdevice.cpp
index 7e178ce..d39a02f 100644
--- a/core/fxge/cfx_renderdevice.cpp
+++ b/core/fxge/cfx_renderdevice.cpp
@@ -767,7 +767,6 @@
return false;
if (bitmap->IsAlphaFormat()) {
- bitmap->Clear(0);
backdrop->Copy(bitmap);
} else {
if (!m_pDeviceDriver->GetDIBits(bitmap, rect.left, rect.top))
@@ -1115,7 +1114,6 @@
auto bitmap = pdfium::MakeRetain<CFX_DIBitmap>();
if (!bitmap->Create(pixel_width, pixel_height, FXDIB_Format::k1bppMask))
return false;
- bitmap->Clear(0);
for (const TextGlyphPos& glyph : glyphs) {
if (!glyph.m_pGlyph)
continue;
@@ -1144,8 +1142,6 @@
bitmap->Clear(0xFFFFFFFF);
if (!GetDIBits(bitmap, bmp_rect.left, bmp_rect.top))
return false;
- } else {
- bitmap->Clear(0);
}
int dest_width = pixel_width;
int a = 0;
diff --git a/core/fxge/dib/cfx_dibitmap.cpp b/core/fxge/dib/cfx_dibitmap.cpp
index fff3977..62881a6 100644
--- a/core/fxge/dib/cfx_dibitmap.cpp
+++ b/core/fxge/dib/cfx_dibitmap.cpp
@@ -167,6 +167,8 @@
case FXDIB_Format::kArgb: {
if (CFX_DefaultRenderDevice::SkiaIsDefaultRenderer() &&
FXDIB_Format::kRgb32 == GetFormat()) {
+ // TODO(crbug.com/pdfium/2016): This is not reliable because alpha may
+ // be modified outside of this operation.
color |= 0xFF000000;
}
for (int i = 0; i < m_Width; i++)
diff --git a/core/fxge/dib/cfx_imagetransformer.cpp b/core/fxge/dib/cfx_imagetransformer.cpp
index af4c35d..904a7f5 100644
--- a/core/fxge/dib/cfx_imagetransformer.cpp
+++ b/core/fxge/dib/cfx_imagetransformer.cpp
@@ -246,8 +246,6 @@
if (!pTransformed->Create(m_result.Width(), m_result.Height(), format))
return;
- pTransformed->Clear(0);
-
CFX_Matrix result2stretch(1.0f, 0.0f, 0.0f, 1.0f, m_result.left,
m_result.top);
result2stretch.Concat(m_dest2stretch);
diff --git a/core/fxge/win32/cfx_psrenderer_unittest.cpp b/core/fxge/win32/cfx_psrenderer_unittest.cpp
index 81430df..6186f0f 100644
--- a/core/fxge/win32/cfx_psrenderer_unittest.cpp
+++ b/core/fxge/win32/cfx_psrenderer_unittest.cpp
@@ -204,7 +204,6 @@
auto bitmap = pdfium::MakeRetain<CFX_DIBitmap>();
bool result = bitmap->Create(kWidth, kHeight, FXDIB_Format::k1bppRgb);
ASSERT_TRUE(result);
- bitmap->Clear(0);
ASSERT_TRUE(renderer.DrawDIBits(bitmap, /*color=*/0, CFX_Matrix(),
FXDIB_ResampleOptions()));
}