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;
}