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