M119: 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>
(cherry picked from commit e3593d6470b21372772459968aec121dcc6d885d)
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/112470
Bot-Commit: rubber-stamper@appspot.gserviceaccount.com <rubber-stamper@appspot.gserviceaccount.com>
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;
 }