Add runtime renderer checks

Adjust render code which is Skia-specific to also do a runtime check
against which renderer is active.  This will enable AGG to still be
used for builds in which Skia is included.

Bug: pdfium:1878
Change-Id: I92f9d510d9765147a6af893e1bc67706ee572d6d
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/96894
Reviewed-by: Lei Zhang <thestig@chromium.org>
Reviewed-by: Nigi <nigi@chromium.org>
Commit-Queue: Alan Screen <awscreen@chromium.org>
diff --git a/core/fpdfapi/render/cpdf_imagerenderer.cpp b/core/fpdfapi/render/cpdf_imagerenderer.cpp
index c75c76b..0a558ad 100644
--- a/core/fpdfapi/render/cpdf_imagerenderer.cpp
+++ b/core/fpdfapi/render/cpdf_imagerenderer.cpp
@@ -56,6 +56,29 @@
   return safe_val.ValueOrDefault(kLimit) >= kLimit;
 }
 
+void ClearBitmap(CFX_DefaultRenderDevice& bitmap_device, uint32_t color) {
+#if defined(_SKIA_SUPPORT_)
+  if (CFX_DefaultRenderDevice::SkiaIsDefaultRenderer()) {
+    bitmap_device.Clear(color);
+    return;
+  }
+#endif
+  bitmap_device.GetBitmap()->Clear(color);
+}
+
+RetainPtr<CFX_DIBBase> PreMultiplyBitmapIfAlpha(
+    RetainPtr<CFX_DIBBase> base_bitmap) {
+#if defined(_SKIA_SUPPORT_)
+  if (CFX_DefaultRenderDevice::SkiaIsDefaultRenderer()) {
+    RetainPtr<CFX_DIBitmap> premultiplied = base_bitmap->Realize();
+    if (base_bitmap->IsAlphaFormat())
+      CFX_SkiaDeviceDriver::PreMultiply(premultiplied);
+    return premultiplied;
+  }
+#endif  // defined(_SKIA_SUPPORT_)
+  return base_bitmap;
+}
+
 }  // namespace
 
 CPDF_ImageRenderer::CPDF_ImageRenderer(CPDF_RenderStatus* pStatus)
@@ -333,11 +356,7 @@
                              nullptr)) {
     return true;
   }
-#if defined(_SKIA_SUPPORT_)
-  bitmap_device1.Clear(0xffffff);
-#else
-  bitmap_device1.GetBitmap()->Clear(0xffffff);
-#endif
+  ClearBitmap(bitmap_device1, 0xffffff);
   CPDF_RenderStatus bitmap_render(m_pRenderStatus->GetContext(),
                                   &bitmap_device1);
   bitmap_render.SetDropObjects(m_pRenderStatus->GetDropObjects());
@@ -352,25 +371,23 @@
                              FXDIB_Format::k8bppRgb, nullptr)) {
     return true;
   }
-#if defined(_SKIA_SUPPORT_)
-  bitmap_device2.Clear(0);
-#else
-  bitmap_device2.GetBitmap()->Clear(0);
-#endif
+  ClearBitmap(bitmap_device2, 0);
   CalculateDrawImage(&bitmap_device1, &bitmap_device2, m_Loader.GetMask(),
                      new_matrix, rect);
 #if defined(_SKIA_SUPPORT_)
-  m_pRenderStatus->GetRenderDevice()->SetBitsWithMask(
-      bitmap_device1.GetBitmap(), bitmap_device2.GetBitmap(), rect.left,
-      rect.top, m_BitmapAlpha, m_BlendType);
-#else
+  if (CFX_DefaultRenderDevice::SkiaIsDefaultRenderer()) {
+    m_pRenderStatus->GetRenderDevice()->SetBitsWithMask(
+        bitmap_device1.GetBitmap(), bitmap_device2.GetBitmap(), rect.left,
+        rect.top, m_BitmapAlpha, m_BlendType);
+    return false;
+  }
+#endif
   bitmap_device2.GetBitmap()->ConvertFormat(FXDIB_Format::k8bppMask);
   bitmap_device1.GetBitmap()->MultiplyAlpha(bitmap_device2.GetBitmap());
   if (m_BitmapAlpha < 255)
     bitmap_device1.GetBitmap()->MultiplyAlpha(m_BitmapAlpha);
   m_pRenderStatus->GetRenderDevice()->SetDIBitsWithBlend(
       bitmap_device1.GetBitmap(), rect.left, rect.top, m_BlendType);
-#endif  //  defined(_SKIA_SUPPORT_)
   return false;
 }
 
@@ -388,15 +405,7 @@
       m_ResampleOptions.bInterpolateBilinear = true;
     }
   }
-  RetainPtr<CFX_DIBBase> bitmap;
-#if defined(_SKIA_SUPPORT_)
-  RetainPtr<CFX_DIBitmap> premultiplied = m_pDIBBase->Realize();
-  if (m_pDIBBase->IsAlphaFormat())
-    CFX_SkiaDeviceDriver::PreMultiply(premultiplied);
-  bitmap = std::move(premultiplied);
-#else
-  bitmap = m_pDIBBase;
-#endif  // defined(_SKIA_SUPPORT_)
+  RetainPtr<CFX_DIBBase> bitmap = PreMultiplyBitmapIfAlpha(m_pDIBBase);
   if (m_pRenderStatus->GetRenderDevice()->StartDIBitsWithBlend(
           bitmap, m_BitmapAlpha, m_FillArgb, m_ImageMatrix, m_ResampleOptions,
           &m_DeviceHandle, m_BlendType)) {
diff --git a/core/fpdfapi/render/cpdf_renderstatus.cpp b/core/fpdfapi/render/cpdf_renderstatus.cpp
index 0e6dcb9..9bf9b53 100644
--- a/core/fpdfapi/render/cpdf_renderstatus.cpp
+++ b/core/fpdfapi/render/cpdf_renderstatus.cpp
@@ -119,6 +119,20 @@
   return fill_options;
 }
 
+FXDIB_Format GetFormatForLuminosity(bool is_luminosity) {
+  if (!is_luminosity)
+    return FXDIB_Format::k8bppMask;
+#if BUILDFLAG(IS_APPLE)
+  return FXDIB_Format::kRgb32;
+#else
+  if (CFX_DefaultRenderDevice::SkiaIsDefaultRenderer() ||
+      CFX_DefaultRenderDevice::SkiaPathsIsDefaultRenderer()) {
+    return FXDIB_Format::kRgb32;
+  }
+  return FXDIB_Format::kRgb;
+#endif
+}
+
 bool IsAvailableMatrix(const CFX_Matrix& matrix) {
   if (matrix.a == 0 || matrix.d == 0)
     return matrix.b != 0 && matrix.c != 0;
@@ -158,7 +172,12 @@
   ScopedSkiaDeviceFlush(const ScopedSkiaDeviceFlush&) = delete;
   ScopedSkiaDeviceFlush& operator=(const ScopedSkiaDeviceFlush&) = delete;
 
-  ~ScopedSkiaDeviceFlush() { m_pDevice->Flush(/*release=*/false); }
+  ~ScopedSkiaDeviceFlush() {
+    if (CFX_DefaultRenderDevice::SkiaIsDefaultRenderer() ||
+        CFX_DefaultRenderDevice::SkiaPathsIsDefaultRenderer()) {
+      m_pDevice->Flush(/*release=*/false);
+    }
+  }
 
  private:
   UnownedPtr<CFX_RenderDevice> const m_pDevice;
@@ -702,8 +721,11 @@
   bitmap_render.Initialize(nullptr, nullptr);
   bitmap_render.ProcessObjectNoClip(pPageObj, new_matrix);
 #if defined(_SKIA_SUPPORT_) || defined(_SKIA_SUPPORT_PATHS_)
-  bitmap_device.Flush(true);
-  bitmap->UnPreMultiply();
+  if (CFX_DefaultRenderDevice::SkiaIsDefaultRenderer() ||
+      CFX_DefaultRenderDevice::SkiaPathsIsDefaultRenderer()) {
+    bitmap_device.Flush(true);
+    bitmap->UnPreMultiply();
+  }
 #endif  // defined(_SKIA_SUPPORT_) || defined(_SKIA_SUPPORT_PATHS_)
   m_bStopped = bitmap_render.m_bStopped;
   if (pSMaskDict) {
@@ -722,7 +744,8 @@
     bitmap->MultiplyAlpha(static_cast<int32_t>(group_alpha * 255));
   }
 #if defined(_SKIA_SUPPORT_)
-  bitmap->PreMultiply();
+  if (CFX_DefaultRenderDevice::SkiaIsDefaultRenderer())
+    bitmap->PreMultiply();
 #endif
   transparency = m_Transparency;
   if (pPageObj->IsForm()) {
@@ -800,7 +823,8 @@
 
 #if defined(_SKIA_SUPPORT_)
 void CPDF_RenderStatus::DebugVerifyDeviceIsPreMultiplied() const {
-  m_pDevice->DebugVerifyBitmapIsPreMultiplied();
+  if (CFX_DefaultRenderDevice::SkiaIsDefaultRenderer())
+    m_pDevice->DebugVerifyBitmapIsPreMultiplied();
 }
 #endif
 
@@ -1259,19 +1283,19 @@
   if (blend_mode == BlendMode::kNormal) {
     if (!pDIBitmap->IsMaskFormat()) {
       if (bitmap_alpha < 255) {
-#if defined(_SKIA_SUPPORT_)
-        std::unique_ptr<CFX_ImageRenderer> dummy;
-        CFX_Matrix m = CFX_RenderDevice::GetFlipMatrix(
-            pDIBitmap->GetWidth(), pDIBitmap->GetHeight(), left, top);
-        m_pDevice->StartDIBits(pDIBitmap, bitmap_alpha, 0, m,
-                               FXDIB_ResampleOptions(), &dummy);
-        return;
-#else
+        if (CFX_DefaultRenderDevice::SkiaIsDefaultRenderer()) {
+          std::unique_ptr<CFX_ImageRenderer> dummy;
+          CFX_Matrix m = CFX_RenderDevice::GetFlipMatrix(
+              pDIBitmap->GetWidth(), pDIBitmap->GetHeight(), left, top);
+          m_pDevice->StartDIBits(pDIBitmap, bitmap_alpha, 0, m,
+                                 FXDIB_ResampleOptions(), &dummy);
+          return;
+        }
         pDIBitmap->MultiplyAlpha(bitmap_alpha);
-#endif
       }
 #if defined(_SKIA_SUPPORT_)
-      CFX_SkiaDeviceDriver::PreMultiply(pDIBitmap);
+      if (CFX_DefaultRenderDevice::SkiaIsDefaultRenderer())
+        CFX_SkiaDeviceDriver::PreMultiply(pDIBitmap);
 #endif
       if (m_pDevice->SetDIBits(pDIBitmap, left, top)) {
         return;
@@ -1398,13 +1422,7 @@
       pdfium::transparency::kAlpha;
   int width = pClipRect->right - pClipRect->left;
   int height = pClipRect->bottom - pClipRect->top;
-  FXDIB_Format format;
-#if BUILDFLAG(IS_APPLE) || defined(_SKIA_SUPPORT_) || \
-    defined(_SKIA_SUPPORT_PATHS_)
-  format = bLuminosity ? FXDIB_Format::kRgb32 : FXDIB_Format::k8bppMask;
-#else
-  format = bLuminosity ? FXDIB_Format::kRgb : FXDIB_Format::k8bppMask;
-#endif
+  FXDIB_Format format = GetFormatForLuminosity(bLuminosity);
   if (!bitmap_device.Create(width, height, format, nullptr))
     return nullptr;
 
diff --git a/core/fpdfapi/render/cpdf_rendertiling.cpp b/core/fpdfapi/render/cpdf_rendertiling.cpp
index b5d38e4..160c384 100644
--- a/core/fpdfapi/render/cpdf_rendertiling.cpp
+++ b/core/fpdfapi/render/cpdf_rendertiling.cpp
@@ -59,8 +59,10 @@
   context.AppendLayer(pPatternForm, mtPattern2Bitmap);
   context.Render(&bitmap_device, nullptr, &options, nullptr);
 #if defined(_SKIA_SUPPORT_PATHS_)
-  bitmap_device.Flush(true);
-  pBitmap->UnPreMultiply();
+  if (CFX_DefaultRenderDevice::SkiaPathsIsDefaultRenderer()) {
+    bitmap_device.Flush(true);
+    pBitmap->UnPreMultiply();
+  }
 #endif
   return pBitmap;
 }
diff --git a/core/fxge/cfx_glyphcache.cpp b/core/fxge/cfx_glyphcache.cpp
index a3c4a71..ce8d58b 100644
--- a/core/fxge/cfx_glyphcache.cpp
+++ b/core/fxge/cfx_glyphcache.cpp
@@ -15,6 +15,7 @@
 
 #include "build/build_config.h"
 #include "core/fxcrt/fx_codepage.h"
+#include "core/fxge/cfx_defaultrenderdevice.h"
 #include "core/fxge/cfx_font.h"
 #include "core/fxge/cfx_fontmgr.h"
 #include "core/fxge/cfx_gemodule.h"
@@ -261,9 +262,10 @@
   GenKey(&keygen, pFont, matrix, dest_width, anti_alias, bNative);
   ByteString FaceGlyphsKey(keygen.key_, keygen.key_len_);
 
-#if BUILDFLAG(IS_APPLE) && !defined(_SKIA_SUPPORT_) && \
-    !defined(_SKIA_SUPPORT_PATHS_)
-  const bool bDoLookUp = !text_options->native_text;
+#if BUILDFLAG(IS_APPLE)
+  const bool bDoLookUp = !text_options->native_text ||
+                         CFX_DefaultRenderDevice::SkiaIsDefaultRenderer() ||
+                         CFX_DefaultRenderDevice::SkiaPathsIsDefaultRenderer();
 #else
   const bool bDoLookUp = true;
 #endif
@@ -272,8 +274,10 @@
                              bFontStyle, dest_width, anti_alias);
   }
 
-#if BUILDFLAG(IS_APPLE) && !defined(_SKIA_SUPPORT_) && \
-    !defined(_SKIA_SUPPORT_PATHS_)
+#if BUILDFLAG(IS_APPLE)
+  DCHECK(!CFX_DefaultRenderDevice::SkiaIsDefaultRenderer());
+  DCHECK(!CFX_DefaultRenderDevice::SkiaPathsIsDefaultRenderer());
+
   std::unique_ptr<CFX_GlyphBitmap> pGlyphBitmap;
   auto it = m_SizeMap.find(FaceGlyphsKey);
   if (it != m_SizeMap.end()) {
@@ -307,7 +311,7 @@
   text_options->native_text = false;
   return LookUpGlyphBitmap(pFont, matrix, FaceGlyphsKey2, glyph_index,
                            bFontStyle, dest_width, anti_alias);
-#endif
+#endif  // BUILDFLAG(IS_APPLE)
 }
 
 #if defined(_SKIA_SUPPORT_) || defined(_SKIA_SUPPORT_PATHS_)
diff --git a/core/fxge/cfx_renderdevice.cpp b/core/fxge/cfx_renderdevice.cpp
index bd5fd3d..b010a05 100644
--- a/core/fxge/cfx_renderdevice.cpp
+++ b/core/fxge/cfx_renderdevice.cpp
@@ -473,6 +473,16 @@
   return new_path_size != 0;
 }
 
+FXDIB_Format GetCreateCompatibleBitmapFormat(int render_caps) {
+  if (render_caps & FXRC_BYTEMASK_OUTPUT)
+    return FXDIB_Format::k8bppMask;
+  if (render_caps & FXRC_ALPHA_OUTPUT)
+    return FXDIB_Format::kArgb;
+  if (CFX_DefaultRenderDevice::SkiaPathsIsDefaultRenderer())
+    return FXDIB_Format::kRgb32;
+  return CFX_DIBBase::kPlatformRGBFormat;
+}
+
 }  // namespace
 
 CFX_RenderDevice::CFX_RenderDevice() = default;
@@ -480,7 +490,10 @@
 CFX_RenderDevice::~CFX_RenderDevice() {
   RestoreState(false);
 #if defined(_SKIA_SUPPORT_) || defined(_SKIA_SUPPORT_PATHS_)
-  Flush(true);
+  if (CFX_DefaultRenderDevice::SkiaIsDefaultRenderer() ||
+      CFX_DefaultRenderDevice::SkiaPathsIsDefaultRenderer()) {
+    Flush(true);
+  }
 #endif
 }
 
@@ -550,16 +563,8 @@
     const RetainPtr<CFX_DIBitmap>& pDIB,
     int width,
     int height) const {
-  if (m_RenderCaps & FXRC_BYTEMASK_OUTPUT)
-    return pDIB->Create(width, height, FXDIB_Format::k8bppMask);
-#if defined(_SKIA_SUPPORT_PATHS_)
-  constexpr FXDIB_Format kFormat = FXDIB_Format::kRgb32;
-#else
-  constexpr FXDIB_Format kFormat = CFX_DIBBase::kPlatformRGBFormat;
-#endif
-  return pDIB->Create(
-      width, height,
-      m_RenderCaps & FXRC_ALPHA_OUTPUT ? FXDIB_Format::kArgb : kFormat);
+  return pDIB->Create(width, height,
+                      GetCreateCompatibleBitmapFormat(m_RenderCaps));
 }
 
 void CFX_RenderDevice::SetBaseClip(const FX_RECT& rect) {
@@ -788,7 +793,10 @@
     return false;
   }
 #if defined(_SKIA_SUPPORT_) || defined(_SKIA_SUPPORT_PATHS_)
-  bitmap_device.GetDeviceDriver()->Flush();
+  if (CFX_DefaultRenderDevice::SkiaIsDefaultRenderer() ||
+      CFX_DefaultRenderDevice::SkiaPathsIsDefaultRenderer()) {
+    bitmap_device.GetDeviceDriver()->Flush();
+  }
 #endif
   FX_RECT src_rect(0, 0, rect.Width(), rect.Height());
   return m_pDeviceDriver->SetDIBits(bitmap, 0, src_rect, rect.left, rect.top,
@@ -1034,13 +1042,14 @@
         // one expires 10/7/19.  This makes LCD anti-aliasing very ugly, so we
         // instead fall back on NORMAL anti-aliasing.
         anti_alias = FT_RENDER_MODE_NORMAL;
-#if defined(_SKIA_SUPPORT_) || defined(_SKIA_SUPPORT_PATHS_)
-        // Since |anti_alias| doesn't affect Skia rendering, and Skia only
-        // follows strictly to the options provided by |text_options|, we need
-        // to update |text_options| so that Skia falls back on normal
-        // anti-aliasing as well.
-        text_options.aliasing_type = CFX_TextRenderOptions::kAntiAliasing;
-#endif
+        if (CFX_DefaultRenderDevice::SkiaIsDefaultRenderer() ||
+            CFX_DefaultRenderDevice::SkiaPathsIsDefaultRenderer()) {
+          // Since |anti_alias| doesn't affect Skia rendering, and Skia only
+          // follows strictly to the options provided by |text_options|, we need
+          // to update |text_options| so that Skia falls back on normal
+          // anti-aliasing as well.
+          text_options.aliasing_type = CFX_TextRenderOptions::kAntiAliasing;
+        }
       } else if ((m_RenderCaps & FXRC_ALPHA_OUTPUT)) {
         // Whether Skia uses LCD optimization should strictly follow the
         // rendering options provided by |text_options|. No change needs to be
@@ -1200,10 +1209,13 @@
   }
 
 #if defined(_SKIA_SUPPORT_) || defined(_SKIA_SUPPORT_PATH_)
-  // DrawNormalTextHelper() can result in unpremultiplied bitmaps for rendering
-  // glyphs. Make sure `bitmap` is premultiplied before proceeding or
-  // CFX_DIBBase::DebugVerifyBufferIsPreMultiplied() check will fail.
-  bitmap->PreMultiply();
+  if (CFX_DefaultRenderDevice::SkiaIsDefaultRenderer() ||
+      CFX_DefaultRenderDevice::SkiaPathsIsDefaultRenderer()) {
+    // DrawNormalTextHelper() can result in unpremultiplied bitmaps for
+    // rendering glyphs. Make sure `bitmap` is premultiplied before proceeding
+    // or CFX_DIBBase::DebugVerifyBufferIsPreMultiplied() check will fail.
+    bitmap->PreMultiply();
+  }
 #endif
 
   if (bitmap->IsMaskFormat())
diff --git a/core/fxge/dib/cfx_dibitmap.cpp b/core/fxge/dib/cfx_dibitmap.cpp
index bb24ab8..086a269 100644
--- a/core/fxge/dib/cfx_dibitmap.cpp
+++ b/core/fxge/dib/cfx_dibitmap.cpp
@@ -19,6 +19,7 @@
 #include "core/fxcrt/fx_safe_types.h"
 #include "core/fxge/calculate_pitch.h"
 #include "core/fxge/cfx_cliprgn.h"
+#include "core/fxge/cfx_defaultrenderdevice.h"
 #include "core/fxge/dib/cfx_scanlinecompositor.h"
 #include "third_party/base/check.h"
 #include "third_party/base/check_op.h"
@@ -175,10 +176,10 @@
     }
     case FXDIB_Format::kRgb32:
     case FXDIB_Format::kArgb: {
-#if defined(_SKIA_SUPPORT_)
-      if (FXDIB_Format::kRgb32 == GetFormat())
+      if (CFX_DefaultRenderDevice::SkiaIsDefaultRenderer() &&
+          FXDIB_Format::kRgb32 == GetFormat()) {
         color |= 0xFF000000;
-#endif
+      }
       for (int i = 0; i < m_Width; i++)
         reinterpret_cast<uint32_t*>(pBuffer)[i] = color;
       for (int row = 1; row < m_Height; row++)
diff --git a/fpdfsdk/fpdf_formfill.cpp b/fpdfsdk/fpdf_formfill.cpp
index cb7f675..2694f75 100644
--- a/fpdfsdk/fpdf_formfill.cpp
+++ b/fpdfsdk/fpdf_formfill.cpp
@@ -194,7 +194,8 @@
 
   auto pDevice = std::make_unique<CFX_DefaultRenderDevice>();
 #if defined(_SKIA_SUPPORT_)
-  pDevice->AttachRecorder(static_cast<SkPictureRecorder*>(recorder));
+  if (CFX_DefaultRenderDevice::SkiaIsDefaultRenderer())
+    pDevice->AttachRecorder(static_cast<SkPictureRecorder*>(recorder));
 #endif
 
   RetainPtr<CFX_DIBitmap> holder(CFXDIBitmapFromFPDFBitmap(bitmap));
@@ -219,8 +220,10 @@
   }
 
 #if defined(_SKIA_SUPPORT_PATHS_)
-  pDevice->Flush(true);
-  holder->UnPreMultiply();
+  if (CFX_DefaultRenderDevice::SkiaPathsIsDefaultRenderer()) {
+    pDevice->Flush(true);
+    holder->UnPreMultiply();
+  }
 #endif
 }
 
diff --git a/fpdfsdk/fpdf_progressive.cpp b/fpdfsdk/fpdf_progressive.cpp
index da74d85..9abb298 100644
--- a/fpdfsdk/fpdf_progressive.cpp
+++ b/fpdfsdk/fpdf_progressive.cpp
@@ -75,9 +75,12 @@
                                 /*need_to_restore=*/false, &pause_adapter);
 
 #if defined(_SKIA_SUPPORT_) || defined(_SKIA_SUPPORT_PATHS_)
-  pDevice->Flush(false);
-  pBitmap->UnPreMultiply();
-#endif
+  if (CFX_DefaultRenderDevice::SkiaIsDefaultRenderer() ||
+      CFX_DefaultRenderDevice::SkiaPathsIsDefaultRenderer()) {
+    pDevice->Flush(false);
+    pBitmap->UnPreMultiply();
+  }
+#endif  // defined(_SKIA_SUPPORT_) || defined(_SKIA_SUPPORT_PATHS_)
 
   if (!pContext->m_pRenderer)
     return FPDF_RENDER_FAILED;
@@ -117,10 +120,13 @@
   pContext->m_pRenderer->Continue(&pause_adapter);
 
 #if defined(_SKIA_SUPPORT_) || defined(_SKIA_SUPPORT_PATHS_)
-  CFX_RenderDevice* pDevice = pContext->m_pDevice.get();
-  pDevice->Flush(false);
-  pDevice->GetBitmap()->UnPreMultiply();
-#endif
+  if (CFX_DefaultRenderDevice::SkiaIsDefaultRenderer() ||
+      CFX_DefaultRenderDevice::SkiaPathsIsDefaultRenderer()) {
+    CFX_RenderDevice* pDevice = pContext->m_pDevice.get();
+    pDevice->Flush(false);
+    pDevice->GetBitmap()->UnPreMultiply();
+  }
+#endif  // defined(_SKIA_SUPPORT_) || defined(_SKIA_SUPPORT_PATHS_)
   return ToFPDFStatus(pContext->m_pRenderer->GetStatus());
 }
 
@@ -128,12 +134,14 @@
   CPDF_Page* pPage = CPDFPageFromFPDFPage(page);
   if (pPage) {
 #if defined(_SKIA_SUPPORT_PATHS_)
-    auto* pContext =
-        static_cast<CPDF_PageRenderContext*>(pPage->GetRenderContext());
-    if (pContext && pContext->m_pRenderer) {
-      CFX_RenderDevice* pDevice = pContext->m_pDevice.get();
-      pDevice->Flush(true);
-      pDevice->GetBitmap()->UnPreMultiply();
+    if (CFX_DefaultRenderDevice::SkiaPathsIsDefaultRenderer()) {
+      auto* pContext =
+          static_cast<CPDF_PageRenderContext*>(pPage->GetRenderContext());
+      if (pContext && pContext->m_pRenderer) {
+        CFX_RenderDevice* pDevice = pContext->m_pDevice.get();
+        pDevice->Flush(true);
+        pDevice->GetBitmap()->UnPreMultiply();
+      }
     }
 #endif
     pPage->ClearRenderContext();
diff --git a/fpdfsdk/fpdf_view.cpp b/fpdfsdk/fpdf_view.cpp
index ba34d08..b05b600 100644
--- a/fpdfsdk/fpdf_view.cpp
+++ b/fpdfsdk/fpdf_view.cpp
@@ -636,8 +636,11 @@
                                 /*pause=*/nullptr);
 
 #if defined(_SKIA_SUPPORT_) || defined(_SKIA_SUPPORT_PATHS_)
-  pDevice->Flush(true);
-  pBitmap->UnPreMultiply();
+  if (CFX_DefaultRenderDevice::SkiaIsDefaultRenderer() ||
+      CFX_DefaultRenderDevice::SkiaPathsIsDefaultRenderer()) {
+    pDevice->Flush(true);
+    pBitmap->UnPreMultiply();
+  }
 #endif
 }
 
diff --git a/xfa/fde/cfde_textout.cpp b/xfa/fde/cfde_textout.cpp
index 7f10ba2..5b46a94 100644
--- a/xfa/fde/cfde_textout.cpp
+++ b/xfa/fde/cfde_textout.cpp
@@ -26,6 +26,10 @@
 #include "xfa/fgas/font/cfgas_gefont.h"
 #include "xfa/fgas/layout/cfgas_txtbreak.h"
 
+#if defined(_SKIA_SUPPORT_) || defined(_SKIA_SUPPORT_PATHS_)
+#include "core/fxge/cfx_defaultrenderdevice.h"
+#endif
+
 namespace {
 
 bool TextAlignmentVerticallyCentered(const FDE_TextAlignment align) {
@@ -119,7 +123,10 @@
                                   -fFontSize, matrix, color, kOptions);
   }
 #if defined(_SKIA_SUPPORT_) || defined(_SKIA_SUPPORT_PATHS_)
-  device->Flush(false);
+  if (CFX_DefaultRenderDevice::SkiaIsDefaultRenderer() ||
+      CFX_DefaultRenderDevice::SkiaPathsIsDefaultRenderer()) {
+    device->Flush(false);
+  }
 #endif
 
   return bRet;