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;