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;