Pass span<> arg to CPDF_TransferFuncDib::TranslateScanline().

Then immediately punt on the problem by calling .data().

-- Remove always-the-same output buffer arg and avoid indirection.
-- Make TranslateScanline() be private.
-- Avoid non-public overrides of other public methods.

Change-Id: I2ea9c7be1bfb47a59e36e949b88ba516e6ce9029
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/85551
Commit-Queue: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
diff --git a/core/fpdfapi/page/cpdf_transferfuncdib.cpp b/core/fpdfapi/page/cpdf_transferfuncdib.cpp
index eb29fad..6936dea 100644
--- a/core/fpdfapi/page/cpdf_transferfuncdib.cpp
+++ b/core/fpdfapi/page/cpdf_transferfuncdib.cpp
@@ -43,8 +43,8 @@
 }
 
 void CPDF_TransferFuncDIB::TranslateScanline(
-    const uint8_t* src_buf,
-    std::vector<uint8_t, FxAllocAllocator<uint8_t>>* dest_buf) const {
+    pdfium::span<const uint8_t> src_span) const {
+  const uint8_t* src_buf = src_span.data();
   bool bSkip = false;
   switch (m_pSrc->GetFormat()) {
     case FXDIB_Format::k1bppRgb: {
@@ -57,13 +57,13 @@
       int index = 0;
       for (int i = 0; i < m_Width; i++) {
         if (src_buf[i / 8] & (1 << (7 - i % 8))) {
-          (*dest_buf)[index++] = b1;
-          (*dest_buf)[index++] = g1;
-          (*dest_buf)[index++] = r1;
+          m_Scanline[index++] = b1;
+          m_Scanline[index++] = g1;
+          m_Scanline[index++] = r1;
         } else {
-          (*dest_buf)[index++] = b0;
-          (*dest_buf)[index++] = g0;
-          (*dest_buf)[index++] = r0;
+          m_Scanline[index++] = b0;
+          m_Scanline[index++] = g0;
+          m_Scanline[index++] = r0;
         }
 #if defined(OS_APPLE)
         index++;
@@ -77,9 +77,9 @@
       int index = 0;
       for (int i = 0; i < m_Width; i++) {
         if (src_buf[i / 8] & (1 << (7 - i % 8)))
-          (*dest_buf)[index++] = m1;
+          m_Scanline[index++] = m1;
         else
-          (*dest_buf)[index++] = m0;
+          m_Scanline[index++] = m0;
       }
       break;
     }
@@ -89,14 +89,14 @@
       for (int i = 0; i < m_Width; i++) {
         if (m_pSrc->HasPalette()) {
           FX_ARGB src_argb = src_palette[*src_buf];
-          (*dest_buf)[index++] = m_RampB[FXARGB_R(src_argb)];
-          (*dest_buf)[index++] = m_RampG[FXARGB_G(src_argb)];
-          (*dest_buf)[index++] = m_RampR[FXARGB_B(src_argb)];
+          m_Scanline[index++] = m_RampB[FXARGB_R(src_argb)];
+          m_Scanline[index++] = m_RampG[FXARGB_G(src_argb)];
+          m_Scanline[index++] = m_RampR[FXARGB_B(src_argb)];
         } else {
           uint32_t src_byte = *src_buf;
-          (*dest_buf)[index++] = m_RampB[src_byte];
-          (*dest_buf)[index++] = m_RampG[src_byte];
-          (*dest_buf)[index++] = m_RampR[src_byte];
+          m_Scanline[index++] = m_RampB[src_byte];
+          m_Scanline[index++] = m_RampG[src_byte];
+          m_Scanline[index++] = m_RampR[src_byte];
         }
         src_buf++;
 #if defined(OS_APPLE)
@@ -108,15 +108,15 @@
     case FXDIB_Format::k8bppMask: {
       int index = 0;
       for (int i = 0; i < m_Width; i++)
-        (*dest_buf)[index++] = m_RampR[*(src_buf++)];
+        m_Scanline[index++] = m_RampR[*(src_buf++)];
       break;
     }
     case FXDIB_Format::kRgb: {
       int index = 0;
       for (int i = 0; i < m_Width; i++) {
-        (*dest_buf)[index++] = m_RampB[*(src_buf++)];
-        (*dest_buf)[index++] = m_RampG[*(src_buf++)];
-        (*dest_buf)[index++] = m_RampR[*(src_buf++)];
+        m_Scanline[index++] = m_RampB[*(src_buf++)];
+        m_Scanline[index++] = m_RampG[*(src_buf++)];
+        m_Scanline[index++] = m_RampR[*(src_buf++)];
 #if defined(OS_APPLE)
         index++;
 #endif
@@ -129,11 +129,11 @@
     case FXDIB_Format::kArgb: {
       int index = 0;
       for (int i = 0; i < m_Width; i++) {
-        (*dest_buf)[index++] = m_RampB[*(src_buf++)];
-        (*dest_buf)[index++] = m_RampG[*(src_buf++)];
-        (*dest_buf)[index++] = m_RampR[*(src_buf++)];
+        m_Scanline[index++] = m_RampB[*(src_buf++)];
+        m_Scanline[index++] = m_RampG[*(src_buf++)];
+        m_Scanline[index++] = m_RampR[*(src_buf++)];
         if (!bSkip) {
-          (*dest_buf)[index++] = *src_buf;
+          m_Scanline[index++] = *src_buf;
 #if defined(OS_APPLE)
         } else {
           index++;
@@ -149,6 +149,6 @@
 }
 
 pdfium::span<const uint8_t> CPDF_TransferFuncDIB::GetScanline(int line) const {
-  TranslateScanline(m_pSrc->GetScanline(line).data(), &m_Scanline);
+  TranslateScanline(m_pSrc->GetScanline(line));
   return m_Scanline;
 }
diff --git a/core/fpdfapi/page/cpdf_transferfuncdib.h b/core/fpdfapi/page/cpdf_transferfuncdib.h
index 2756b5b..87832d9 100644
--- a/core/fpdfapi/page/cpdf_transferfuncdib.h
+++ b/core/fpdfapi/page/cpdf_transferfuncdib.h
@@ -20,18 +20,15 @@
  public:
   CONSTRUCT_VIA_MAKE_RETAIN;
 
-  void TranslateScanline(
-      const uint8_t* src_buf,
-      std::vector<uint8_t, FxAllocAllocator<uint8_t>>* dest_buf) const;
+  // CFX_DIBBase:
+  pdfium::span<const uint8_t> GetScanline(int line) const override;
 
  private:
   CPDF_TransferFuncDIB(const RetainPtr<CFX_DIBBase>& pSrc,
                        const RetainPtr<CPDF_TransferFunc>& pTransferFunc);
   ~CPDF_TransferFuncDIB() override;
 
-  // CFX_DIBBase:
-  pdfium::span<const uint8_t> GetScanline(int line) const override;
-
+  void TranslateScanline(pdfium::span<const uint8_t> src_span) const;
   FXDIB_Format GetDestFormat() const;
 
   RetainPtr<CFX_DIBBase> const m_pSrc;