Avoid rendering into the device in CPDF_RenderContext::GetBackground() Change GetBackground() to render into a bitmap again, and avoid rendering directly into the CFX_RenderDevice. This is a partial revert of https://pdfium-review.googlesource.com//111431 to fix a performance regression when the CFX_RenderDevice is backed by a printer on Windows. Bug: chromium:1489537 Change-Id: I01014078a5a438f54a1e21652005601f2fd9b3d8 Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/112371 Commit-Queue: Lei Zhang <thestig@chromium.org> Reviewed-by: Nigi <nigi@chromium.org>
diff --git a/core/fpdfapi/render/cpdf_devicebuffer.cpp b/core/fpdfapi/render/cpdf_devicebuffer.cpp index e67adef..5bd4691 100644 --- a/core/fpdfapi/render/cpdf_devicebuffer.cpp +++ b/core/fpdfapi/render/cpdf_devicebuffer.cpp
@@ -89,7 +89,7 @@ m_pBitmap->GetHeight())) { return; } - m_pContext->GetBackground(m_pDevice, m_pObject, nullptr, m_Matrix); + m_pContext->GetBackground(pBuffer, m_pObject, nullptr, m_Matrix); pBuffer->CompositeBitmap(0, 0, pBuffer->GetWidth(), pBuffer->GetHeight(), m_pBitmap, 0, 0, BlendMode::kNormal, nullptr, false); m_pDevice->StretchDIBits(pBuffer, m_Rect.left, m_Rect.top, m_Rect.Width(),
diff --git a/core/fpdfapi/render/cpdf_rendercontext.cpp b/core/fpdfapi/render/cpdf_rendercontext.cpp index 7589b41..4116840 100644 --- a/core/fpdfapi/render/cpdf_rendercontext.cpp +++ b/core/fpdfapi/render/cpdf_rendercontext.cpp
@@ -21,7 +21,6 @@ #include "core/fxge/cfx_renderdevice.h" #include "core/fxge/dib/cfx_dibitmap.h" #include "core/fxge/dib/fx_dib.h" -#include "third_party/base/check.h" CPDF_RenderContext::CPDF_RenderContext( CPDF_Document* pDoc, @@ -33,14 +32,15 @@ CPDF_RenderContext::~CPDF_RenderContext() = default; -void CPDF_RenderContext::GetBackground(CFX_RenderDevice* pDevice, +void CPDF_RenderContext::GetBackground(RetainPtr<CFX_DIBitmap> pBuffer, const CPDF_PageObject* pObj, const CPDF_RenderOptions* pOptions, const CFX_Matrix& mtFinal) { - CHECK(pDevice); - pDevice->FillRect(FX_RECT(0, 0, pDevice->GetWidth(), pDevice->GetHeight()), - 0xffffffff); - Render(pDevice, pObj, pOptions, &mtFinal); + CFX_DefaultRenderDevice device; + device.Attach(std::move(pBuffer)); + device.FillRect(FX_RECT(0, 0, device.GetWidth(), device.GetHeight()), + 0xffffffff); + Render(&device, pObj, pOptions, &mtFinal); } void CPDF_RenderContext::AppendLayer(CPDF_PageObjectHolder* pObjectHolder,
diff --git a/core/fpdfapi/render/cpdf_rendercontext.h b/core/fpdfapi/render/cpdf_rendercontext.h index 1012e81..383e798 100644 --- a/core/fpdfapi/render/cpdf_rendercontext.h +++ b/core/fpdfapi/render/cpdf_rendercontext.h
@@ -13,6 +13,7 @@ #include "core/fxcrt/retain_ptr.h" #include "core/fxcrt/unowned_ptr.h" +class CFX_DIBitmap; class CFX_Matrix; class CFX_RenderDevice; class CPDF_Dictionary; @@ -51,7 +52,7 @@ const CPDF_RenderOptions* pOptions, const CFX_Matrix* pLastMatrix); - void GetBackground(CFX_RenderDevice* pDevice, + void GetBackground(RetainPtr<CFX_DIBitmap> pBuffer, const CPDF_PageObject* pObj, const CPDF_RenderOptions* pOptions, const CFX_Matrix& mtFinal);
diff --git a/core/fpdfapi/render/cpdf_scaledrenderbuffer.cpp b/core/fpdfapi/render/cpdf_scaledrenderbuffer.cpp index 4cba877..2f2f953 100644 --- a/core/fpdfapi/render/cpdf_scaledrenderbuffer.cpp +++ b/core/fpdfapi/render/cpdf_scaledrenderbuffer.cpp
@@ -57,7 +57,8 @@ } m_Matrix.Scale(0.5f, 0.5f); } - pContext->GetBackground(m_pBitmapDevice.get(), pObj, pOptions, m_Matrix); + pContext->GetBackground(m_pBitmapDevice->GetBitmap(), pObj, pOptions, + m_Matrix); return true; }