Avoid an extra bitmap copy in CFX_SkiaDeviceDriver
The 24-bit to 32-bit bitmap conversion is currently CFX_DIBitmap::Copy()
plus ConvertFormat(), which writes into the CFX_DIBitmap twice. Instead,
use TransferBitmap() to only write once.
Change-Id: Ie086b9d21271d5dbe076cc4889280cfd638f93e0
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/122753
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Tom Sepez <tsepez@google.com>
Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/core/fxge/skia/fx_skia_device.cpp b/core/fxge/skia/fx_skia_device.cpp
index 911684a..77dc1a2 100644
--- a/core/fxge/skia/fx_skia_device.cpp
+++ b/core/fxge/skia/fx_skia_device.cpp
@@ -715,11 +715,15 @@
// Save the input bitmap as `m_pOriginalBitmap` and save its 32 bpp
// equivalent at `m_pBitmap` for Skia's internal process.
m_pOriginalBitmap = std::move(m_pBitmap);
+ const int width = m_pOriginalBitmap->GetWidth();
+ const int height = m_pOriginalBitmap->GetHeight();
+
m_pBitmap = pdfium::MakeRetain<CFX_DIBitmap>();
// TODO(crbug.com/42271020): Consider adding support for
// `FXDIB_Format::kArgbPremul`
- if (!m_pBitmap->Copy(m_pOriginalBitmap) ||
- !m_pBitmap->ConvertFormat(FXDIB_Format::kArgb)) {
+ if (!m_pBitmap->Create(width, height, FXDIB_Format::kArgb) ||
+ !m_pBitmap->TransferBitmap(width, height, m_pOriginalBitmap,
+ /*src_left=*/0, /*src_top=*/0)) {
// Skip creating SkCanvas if the 32-bpp bitmap creation fails.
// CFX_SkiaDeviceDriver::Create() will check for the missing `m_pCanvas`
// and not use `this`.