Fix Skia + EMF rendering for transparencies
Reapply part of https://pdfium-review.googlesource.com/111431 that
was reverted in https://pdfium-review.googlesource.com/112371 by
splitting CPDF_RenderContext::GetBackground() into two. One is
GetBackgroundToBitmap(), which is called bt CPDF_DeviceBuffer. This
keeps the performance issue in https://crbug.com/1489537 from
regressing. The other is GetBackgroundToDevice(), which is used in
CPDF_ScaledRenderBuffer to render correctly. CPDF_ScaledRenderBuffer
uses CFX_DefaultRenderDevice and not CFX_WindowsRenderDevice, so there
is no speed issues here.
Bug: chromium:1510316
Change-Id: I540ea8f6ef6dac38053b30e3d290d4acdb02a52e
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/115010
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/core/fpdfapi/render/cpdf_devicebuffer.cpp b/core/fpdfapi/render/cpdf_devicebuffer.cpp
index 5bd4691..627f1ce 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(pBuffer, m_pObject, nullptr, m_Matrix);
+ m_pContext->GetBackgroundToBitmap(pBuffer, m_pObject, 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 4116840..7036ad9 100644
--- a/core/fpdfapi/render/cpdf_rendercontext.cpp
+++ b/core/fpdfapi/render/cpdf_rendercontext.cpp
@@ -21,6 +21,7 @@
#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,
@@ -32,15 +33,22 @@
CPDF_RenderContext::~CPDF_RenderContext() = default;
-void CPDF_RenderContext::GetBackground(RetainPtr<CFX_DIBitmap> pBuffer,
- const CPDF_PageObject* pObj,
- const CPDF_RenderOptions* pOptions,
- const CFX_Matrix& mtFinal) {
+void CPDF_RenderContext::GetBackgroundToDevice(
+ CFX_RenderDevice* device,
+ const CPDF_PageObject* object,
+ const CPDF_RenderOptions* options,
+ const CFX_Matrix& matrix) {
+ device->FillRect(FX_RECT(0, 0, device->GetWidth(), device->GetHeight()),
+ 0xffffffff);
+ Render(device, object, options, &matrix);
+}
+
+void CPDF_RenderContext::GetBackgroundToBitmap(RetainPtr<CFX_DIBitmap> bitmap,
+ const CPDF_PageObject* object,
+ const CFX_Matrix& matrix) {
CFX_DefaultRenderDevice device;
- device.Attach(std::move(pBuffer));
- device.FillRect(FX_RECT(0, 0, device.GetWidth(), device.GetHeight()),
- 0xffffffff);
- Render(&device, pObj, pOptions, &mtFinal);
+ device.Attach(std::move(bitmap));
+ GetBackgroundToDevice(&device, object, /*options=*/nullptr, matrix);
}
void CPDF_RenderContext::AppendLayer(CPDF_PageObjectHolder* pObjectHolder,
diff --git a/core/fpdfapi/render/cpdf_rendercontext.h b/core/fpdfapi/render/cpdf_rendercontext.h
index 383e798..f26fe76 100644
--- a/core/fpdfapi/render/cpdf_rendercontext.h
+++ b/core/fpdfapi/render/cpdf_rendercontext.h
@@ -52,10 +52,13 @@
const CPDF_RenderOptions* pOptions,
const CFX_Matrix* pLastMatrix);
- void GetBackground(RetainPtr<CFX_DIBitmap> pBuffer,
- const CPDF_PageObject* pObj,
- const CPDF_RenderOptions* pOptions,
- const CFX_Matrix& mtFinal);
+ void GetBackgroundToDevice(CFX_RenderDevice* device,
+ const CPDF_PageObject* object,
+ const CPDF_RenderOptions* options,
+ const CFX_Matrix& matrix);
+ void GetBackgroundToBitmap(RetainPtr<CFX_DIBitmap> bitmap,
+ const CPDF_PageObject* object,
+ const CFX_Matrix& matrix);
size_t CountLayers() const { return m_Layers.size(); }
Layer* GetLayer(uint32_t index) { return &m_Layers[index]; }
diff --git a/core/fpdfapi/render/cpdf_scaledrenderbuffer.cpp b/core/fpdfapi/render/cpdf_scaledrenderbuffer.cpp
index 187797c..534511a 100644
--- a/core/fpdfapi/render/cpdf_scaledrenderbuffer.cpp
+++ b/core/fpdfapi/render/cpdf_scaledrenderbuffer.cpp
@@ -57,8 +57,8 @@
}
m_Matrix.Scale(0.5f, 0.5f);
}
- pContext->GetBackground(m_pBitmapDevice->GetBitmap(), pObj, pOptions,
- m_Matrix);
+ pContext->GetBackgroundToDevice(m_pBitmapDevice.get(), pObj, pOptions,
+ m_Matrix);
return true;
}