Make SkCanvas handling more robust
- Make sure CFX_DefaultRenderDevice::AttachCanvas() callers check the
return value.
- Change the SkCanvas parameter in CFX_SkiaDeviceDriver::Create() and
CFX_DefaultRenderDevice::AttachCanvas() to references, since all
callers pass in a non-null pointer anyway.
Change-Id: Icab1a045b7d89c12fbc12936821adc4c6cb3242b
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/123030
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/cfx_defaultrenderdevice.h b/core/fxge/cfx_defaultrenderdevice.h
index b63e7d9..ee87539 100644
--- a/core/fxge/cfx_defaultrenderdevice.h
+++ b/core/fxge/cfx_defaultrenderdevice.h
@@ -28,7 +28,7 @@
RetainPtr<CFX_DIBitmap> pBackdropBitmap,
bool bGroupKnockout);
#if defined(PDF_USE_SKIA)
- bool AttachCanvas(SkCanvas* canvas);
+ [[nodiscard]] bool AttachCanvas(SkCanvas& canvas);
#endif
bool Create(int width, int height, FXDIB_Format format);
diff --git a/core/fxge/skia/fx_skia_device.cpp b/core/fxge/skia/fx_skia_device.cpp
index 4a3f51a..038dfa3 100644
--- a/core/fxge/skia/fx_skia_device.cpp
+++ b/core/fxge/skia/fx_skia_device.cpp
@@ -681,11 +681,7 @@
// static
std::unique_ptr<CFX_SkiaDeviceDriver> CFX_SkiaDeviceDriver::Create(
- SkCanvas* canvas) {
- if (!canvas) {
- return nullptr;
- }
-
+ SkCanvas& canvas) {
auto driver = pdfium::WrapUnique(new CFX_SkiaDeviceDriver(canvas));
if (!driver->m_pBitmap || !driver->m_pBackdropBitmap) {
return nullptr;
@@ -747,8 +743,8 @@
m_pCanvas = surface_->getCanvas();
}
-CFX_SkiaDeviceDriver::CFX_SkiaDeviceDriver(SkCanvas* canvas)
- : m_pCanvas(canvas), m_bGroupKnockout(false) {
+CFX_SkiaDeviceDriver::CFX_SkiaDeviceDriver(SkCanvas& canvas)
+ : m_pCanvas(&canvas), m_bGroupKnockout(false) {
int width = m_pCanvas->imageInfo().width();
int height = m_pCanvas->imageInfo().height();
DCHECK_EQ(kUnknown_SkColorType, m_pCanvas->imageInfo().colorType());
@@ -1659,7 +1655,7 @@
return true;
}
-bool CFX_DefaultRenderDevice::AttachCanvas(SkCanvas* canvas) {
+bool CFX_DefaultRenderDevice::AttachCanvas(SkCanvas& canvas) {
auto driver = CFX_SkiaDeviceDriver::Create(canvas);
if (!driver) {
return false;
diff --git a/core/fxge/skia/fx_skia_device.h b/core/fxge/skia/fx_skia_device.h
index 7a8caba..e575e1e 100644
--- a/core/fxge/skia/fx_skia_device.h
+++ b/core/fxge/skia/fx_skia_device.h
@@ -42,7 +42,7 @@
bool bRgbByteOrder,
RetainPtr<CFX_DIBitmap> pBackdropBitmap,
bool bGroupKnockout);
- static std::unique_ptr<CFX_SkiaDeviceDriver> Create(SkCanvas* canvas);
+ static std::unique_ptr<CFX_SkiaDeviceDriver> Create(SkCanvas& canvas);
~CFX_SkiaDeviceDriver() override;
@@ -168,7 +168,7 @@
bool bRgbByteOrder,
RetainPtr<CFX_DIBitmap> pBackdropBitmap,
bool bGroupKnockout);
- explicit CFX_SkiaDeviceDriver(SkCanvas* canvas);
+ explicit CFX_SkiaDeviceDriver(SkCanvas& canvas);
bool TryDrawText(pdfium::span<const TextCharPos> char_pos,
const CFX_Font* pFont,
diff --git a/core/fxge/skia/fx_skia_device_embeddertest.cpp b/core/fxge/skia/fx_skia_device_embeddertest.cpp
index 5d64a1c..3682d11 100644
--- a/core/fxge/skia/fx_skia_device_embeddertest.cpp
+++ b/core/fxge/skia/fx_skia_device_embeddertest.cpp
@@ -168,7 +168,7 @@
int start_y,
int size_x,
int size_y,
- SkCanvas* canvas) {
+ SkCanvas& canvas) {
CPDF_Page* cpdf_page = CPDFPageFromFPDFPage(page);
auto context = std::make_unique<CPDF_PageRenderContext>();
@@ -178,7 +178,7 @@
cpdf_page->SetRenderContext(std::move(context));
auto default_device = std::make_unique<CFX_DefaultRenderDevice>();
- default_device->AttachCanvas(canvas);
+ CHECK(default_device->AttachCanvas(canvas));
unowned_context->m_pDevice = std::move(default_device);
CPDFSDK_RenderPageWithContext(unowned_context, cpdf_page, start_x, start_y,
@@ -283,11 +283,11 @@
// Render top half.
RenderPageToSkCanvas(page, /*start_x=*/0, /*start_y=*/0,
- /*size_x=*/kPageWidth, /*size_y=*/kPageHeight, &canvas);
+ /*size_x=*/kPageWidth, /*size_y=*/kPageHeight, canvas);
// Render bottom half.
RenderPageToSkCanvas(page, /*start_x=*/0, /*start_y=*/-kPageHeight / 2,
- /*size_x=*/kPageWidth, /*size_y=*/kPageHeight, &canvas);
+ /*size_x=*/kPageWidth, /*size_y=*/kPageHeight, canvas);
EXPECT_THAT(image_ids, SizeIs(1));
diff --git a/fpdfsdk/fpdf_formfill.cpp b/fpdfsdk/fpdf_formfill.cpp
index 17ecbdc..7d741d0 100644
--- a/fpdfsdk/fpdf_formfill.cpp
+++ b/fpdfsdk/fpdf_formfill.cpp
@@ -203,7 +203,9 @@
#if defined(PDF_USE_SKIA)
SkCanvas* sk_canvas = SkCanvasFromFPDFSkiaCanvas(canvas);
if (sk_canvas && CFX_DefaultRenderDevice::UseSkiaRenderer()) {
- pDevice->AttachCanvas(sk_canvas);
+ if (!pDevice->AttachCanvas(*sk_canvas)) {
+ return;
+ }
}
#endif
diff --git a/fpdfsdk/fpdf_view.cpp b/fpdfsdk/fpdf_view.cpp
index 537b11a..4943746 100644
--- a/fpdfsdk/fpdf_view.cpp
+++ b/fpdfsdk/fpdf_view.cpp
@@ -794,7 +794,9 @@
cpdf_page->SetRenderContext(std::move(owned_context));
auto device = std::make_unique<CFX_DefaultRenderDevice>();
- device->AttachCanvas(sk_canvas);
+ if (!device->AttachCanvas(*sk_canvas)) {
+ return;
+ }
context->m_pDevice = std::move(device);
CPDFSDK_RenderPageWithContext(context, cpdf_page, 0, 0, size_x, size_y, 0, 0,