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;