Make SkBitmap immutable before asImage()
Calls SkBitmap::setImmutable() before calling SkBitmap::asImage(), as
this avoids a copy in asImage(). This only works if the SkBitmap is
actually immutable, but all existing uses of asImage() qualify.
Bug: pdfium:2014
Change-Id: Ic7c37e4e2ae1f6d3a87898b19d630f92ca3fb34c
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/105350
Reviewed-by: Nigi <nigi@chromium.org>
Commit-Queue: K. Moon <kmoon@chromium.org>
diff --git a/core/fxge/skia/fx_skia_device.cpp b/core/fxge/skia/fx_skia_device.cpp
index e7ed359..0abf7a7 100644
--- a/core/fxge/skia/fx_skia_device.cpp
+++ b/core/fxge/skia/fx_skia_device.cpp
@@ -1126,6 +1126,7 @@
if (!Upsample(mask, dst32_storage, &skia_mask, /*forceAlpha=*/true)) {
return false;
}
+ skia_mask.setImmutable();
SkPaint paint;
paint.setBlendMode(SkBlendMode::kDstIn);
@@ -1517,9 +1518,11 @@
int top) {
if (!m_pBitmap)
return true;
+
uint8_t* srcBuffer = m_pBitmap->GetBuffer().data();
if (!srcBuffer)
return true;
+
int srcWidth = m_pBitmap->GetWidth();
int srcHeight = m_pBitmap->GetHeight();
size_t srcRowBytes = m_pBitmap->GetPitch();
@@ -1527,8 +1530,11 @@
srcWidth, srcHeight, SkColorType::kN32_SkColorType, kPremul_SkAlphaType);
SkBitmap skSrcBitmap;
skSrcBitmap.installPixels(srcImageInfo, srcBuffer, srcRowBytes);
+ skSrcBitmap.setImmutable();
+
uint8_t* dstBuffer = pBitmap->GetBuffer().data();
DCHECK(dstBuffer);
+
int dstWidth = pBitmap->GetWidth();
int dstHeight = pBitmap->GetHeight();
size_t dstRowBytes = pBitmap->GetPitch();
@@ -1537,6 +1543,7 @@
kPremul_SkAlphaType);
SkBitmap skDstBitmap;
skDstBitmap.installPixels(dstImageInfo, dstBuffer, dstRowBytes);
+
SkCanvas canvas(skDstBitmap);
canvas.drawImageRect(skSrcBitmap.asImage(),
SkRect::MakeXYWH(left, top, dstWidth, dstHeight),
@@ -1743,12 +1750,15 @@
const FXDIB_ResampleOptions& options,
BlendMode blend_type) {
DebugValidate(m_pBitmap, m_pBackdropBitmap);
+
// Storage vector must outlive `skBitmap`.
DataVector<uint32_t> dst32_storage;
SkBitmap skBitmap;
if (!Upsample(pSource, dst32_storage, &skBitmap, /*forceAlpha=*/false)) {
return false;
}
+ skBitmap.setImmutable();
+
{
SkAutoCanvasRestore scoped_save_restore(m_pCanvas, /*doSave=*/true);