Flush CFX_SkiaDeviceDriver in CPDF_RenderStatus::DrawTilingPattern().
DrawTilingPattern() loads and renders a short-lived CPDF_Form. The Skia
CFX_RenderDevice, which does caching and outlives this CPDF_Form, needs
to be flushed appropriately. Do so using a ScopedSkiaDeviceFlush class
to easily cover all the places where DrawTilingPattern() can return.
Bug: chromium:984811
Change-Id: I47c3fdf211c8b9a9976bd4dacebbf89613f12315
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/58813
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/core/fpdfapi/render/cpdf_renderstatus.cpp b/core/fpdfapi/render/cpdf_renderstatus.cpp
index 1e1ebc6..785c7be 100644
--- a/core/fpdfapi/render/cpdf_renderstatus.cpp
+++ b/core/fpdfapi/render/cpdf_renderstatus.cpp
@@ -979,6 +979,22 @@
(pChar->colored() && MissingStrokeColor(pColorState)));
}
+#if defined(_SKIA_SUPPORT_)
+class ScopedSkiaDeviceFlush {
+ public:
+ explicit ScopedSkiaDeviceFlush(CFX_RenderDevice* pDevice)
+ : m_pDevice(pDevice) {}
+
+ ScopedSkiaDeviceFlush(const ScopedSkiaDeviceFlush&) = delete;
+ ScopedSkiaDeviceFlush& operator=(const ScopedSkiaDeviceFlush&) = delete;
+
+ ~ScopedSkiaDeviceFlush() { m_pDevice->Flush(/*release=*/false); }
+
+ private:
+ CFX_RenderDevice* const m_pDevice;
+};
+#endif
+
} // namespace
CPDF_RenderStatus::CPDF_RenderStatus(CPDF_RenderContext* pContext,
@@ -2136,6 +2152,9 @@
return;
CFX_RenderDevice::StateRestorer restorer(m_pDevice);
+#if defined(_SKIA_SUPPORT_)
+ ScopedSkiaDeviceFlush scoped_skia_device_flush(m_pDevice);
+#endif
if (!ClipPattern(pPageObj, mtObj2Device, bStroke))
return;