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