flush but do not release skia driver

Most calls to the Skia Driver combine flushing
the draw cache with deleting the driver itself.

Progressive drawing needs to flush the cache to
keep drawing in order, but the driver must remain
for the next progressive draw.

R=dsinclair@chromium.org, hnakashima@chromium.org
Bug: pdfium:833
Change-Id: I311f80b2dc0ef6e4df9a3a0f082ae076cb7a591f
Reviewed-on: https://pdfium-review.googlesource.com/8890
Reviewed-by: dsinclair <dsinclair@chromium.org>
Commit-Queue: dsinclair <dsinclair@chromium.org>
diff --git a/core/fpdfapi/render/cpdf_renderstatus.cpp b/core/fpdfapi/render/cpdf_renderstatus.cpp
index e033f26..a086505 100644
--- a/core/fpdfapi/render/cpdf_renderstatus.cpp
+++ b/core/fpdfapi/render/cpdf_renderstatus.cpp
@@ -944,7 +944,7 @@
   context.AppendLayer(pPattern->form(), &mtPattern2Bitmap);
   context.Render(&bitmap_device, &options, nullptr);
 #if defined _SKIA_SUPPORT_PATHS_
-  bitmap_device.Flush();
+  bitmap_device.Flush(true);
   pBitmap->UnPreMultiply();
 #endif
   return pBitmap;
@@ -1602,7 +1602,7 @@
                            m_bDropObjects, pFormResource, true);
   bitmap_render.ProcessObjectNoClip(pPageObj, &new_matrix);
 #if defined _SKIA_SUPPORT_PATHS_
-  bitmap_device.Flush();
+  bitmap_device.Flush(true);
   bitmap->UnPreMultiply();
 #endif
   m_bStopped = bitmap_render.m_bStopped;
diff --git a/core/fxge/cfx_renderdevice.cpp b/core/fxge/cfx_renderdevice.cpp
index 407c090..279e720 100644
--- a/core/fxge/cfx_renderdevice.cpp
+++ b/core/fxge/cfx_renderdevice.cpp
@@ -375,13 +375,16 @@
 CFX_RenderDevice::~CFX_RenderDevice() {
   RestoreState(false);
 #if defined _SKIA_SUPPORT_ || defined _SKIA_SUPPORT_PATHS_
-  Flush();
+  Flush(true);
 #endif
 }
 
 #if defined _SKIA_SUPPORT_ || defined _SKIA_SUPPORT_PATHS_
-void CFX_RenderDevice::Flush() {
-  m_pDeviceDriver.reset();
+void CFX_RenderDevice::Flush(bool release) {
+  if (release)
+    m_pDeviceDriver.reset();
+  else
+    m_pDeviceDriver->Flush();
 }
 #endif
 
diff --git a/core/fxge/cfx_renderdevice.h b/core/fxge/cfx_renderdevice.h
index ef15718..ad8e487 100644
--- a/core/fxge/cfx_renderdevice.h
+++ b/core/fxge/cfx_renderdevice.h
@@ -274,7 +274,7 @@
                                int blend_type);
 #endif
 #if defined _SKIA_SUPPORT_ || defined _SKIA_SUPPORT_PATHS_
-  void Flush();
+  void Flush(bool release);
 #endif
 
  private:
diff --git a/core/fxge/skia/fx_skia_device.cpp b/core/fxge/skia/fx_skia_device.cpp
index 855699a..523c8a2 100644
--- a/core/fxge/skia/fx_skia_device.cpp
+++ b/core/fxge/skia/fx_skia_device.cpp
@@ -2595,7 +2595,7 @@
 }
 
 CFX_DefaultRenderDevice::~CFX_DefaultRenderDevice() {
-  Flush();
+  Flush(true);
 }
 
 #ifdef _SKIA_SUPPORT_
diff --git a/fpdfsdk/fpdf_progressive.cpp b/fpdfsdk/fpdf_progressive.cpp
index 1b10a11..2411869 100644
--- a/fpdfsdk/fpdf_progressive.cpp
+++ b/fpdfsdk/fpdf_progressive.cpp
@@ -61,7 +61,7 @@
                          rotate, flags, false, &IPauseAdapter);
 
 #ifdef _SKIA_SUPPORT_PATHS_
-  pDevice->Flush();
+  pDevice->Flush(false);
   pBitmap->UnPreMultiply();
 #endif
   if (pContext->m_pRenderer) {
@@ -86,7 +86,7 @@
     pContext->m_pRenderer->Continue(&IPauseAdapter);
 #ifdef _SKIA_SUPPORT_PATHS_
     CFX_RenderDevice* pDevice = pContext->m_pDevice.get();
-    pDevice->Flush();
+    pDevice->Flush(false);
     pDevice->GetBitmap()->UnPreMultiply();
 #endif
     return CPDF_ProgressiveRenderer::ToFPDFStatus(
@@ -97,6 +97,15 @@
 
 DLLEXPORT void STDCALL FPDF_RenderPage_Close(FPDF_PAGE page) {
   CPDF_Page* pPage = CPDFPageFromFPDFPage(page);
-  if (pPage)
+  if (pPage) {
+#ifdef _SKIA_SUPPORT_PATHS_
+    CPDF_PageRenderContext* pContext = pPage->GetRenderContext();
+    if (pContext && pContext->m_pRenderer) {
+      CFX_RenderDevice* pDevice = pContext->m_pDevice.get();
+      pDevice->Flush(true);
+      pDevice->GetBitmap()->UnPreMultiply();
+    }
+#endif
     pPage->SetRenderContext(nullptr);
+  }
 }
diff --git a/fpdfsdk/fpdfformfill.cpp b/fpdfsdk/fpdfformfill.cpp
index 627bd0a..e541b81 100644
--- a/fpdfsdk/fpdfformfill.cpp
+++ b/fpdfsdk/fpdfformfill.cpp
@@ -144,7 +144,7 @@
 #endif  // PDF_ENABLE_XFA
   }
 #ifdef _SKIA_SUPPORT_PATHS_
-  pDevice->Flush();
+  pDevice->Flush(true);
   holder->UnPreMultiply();
 #endif
 }
diff --git a/fpdfsdk/fpdfview.cpp b/fpdfsdk/fpdfview.cpp
index f8823c9..956e6db 100644
--- a/fpdfsdk/fpdfview.cpp
+++ b/fpdfsdk/fpdfview.cpp
@@ -940,7 +940,7 @@
                          rotate, flags, true, nullptr);
 
 #ifdef _SKIA_SUPPORT_PATHS_
-  pDevice->Flush();
+  pDevice->Flush(true);
   pBitmap->UnPreMultiply();
 #endif
   pPage->SetRenderContext(nullptr);