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;