Change `CFX_DIBBase::m_pPalette` to a vector. Use a container instead of manual memory management. Makes converting to spans in the future easier. Change-Id: I917cb297554d1af10308d6b45a95dd89e0f9457a Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/75211 Commit-Queue: Lei Zhang <thestig@chromium.org> Reviewed-by: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fpdfapi/page/cpdf_transferfuncdib.cpp b/core/fpdfapi/page/cpdf_transferfuncdib.cpp index dc51a86..9ccfb12 100644 --- a/core/fpdfapi/page/cpdf_transferfuncdib.cpp +++ b/core/fpdfapi/page/cpdf_transferfuncdib.cpp
@@ -27,7 +27,7 @@ m_bpp = GetBppFromFormat(format); m_AlphaFlag = GetAlphaFlagFromFormat(format); m_Pitch = (m_Width * m_bpp + 31) / 32 * 4; - m_pPalette.reset(); + m_palette.clear(); m_Scanline.resize(m_Pitch); }
diff --git a/core/fxge/dib/cfx_dibbase.cpp b/core/fxge/dib/cfx_dibbase.cpp index 29ee7be..b50ec24 100644 --- a/core/fxge/dib/cfx_dibbase.cpp +++ b/core/fxge/dib/cfx_dibbase.cpp
@@ -20,6 +20,7 @@ #include "core/fxge/dib/cfx_imagestretcher.h" #include "core/fxge/dib/cfx_imagetransformer.h" #include "third_party/base/notreached.h" +#include "third_party/base/span.h" #include "third_party/base/stl_util.h" namespace { @@ -291,7 +292,7 @@ const RetainPtr<CFX_DIBBase>& pSrcBitmap, int src_left, int src_top, - uint32_t* dst_plt) { + pdfium::span<uint32_t> dst_plt) { ConvertBuffer_IndexCopy(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top); const uint32_t* src_plt = pSrcBitmap->GetPaletteData(); @@ -307,7 +308,8 @@ dst_plt[i] = ArgbEncode(0xff, r, g, b); } } else { - memcpy(dst_plt, src_plt, plt_size * 4); + for (size_t i = 0; i < plt_size; ++i) + dst_plt[i] = src_plt[i]; } } @@ -318,7 +320,7 @@ const RetainPtr<CFX_DIBBase>& pSrcBitmap, int src_left, int src_top, - uint32_t* dst_plt) { + pdfium::span<uint32_t> dst_plt) { int bpp = pSrcBitmap->GetBPP() / 8; CFX_Palette palette(pSrcBitmap); const std::pair<uint32_t, uint32_t>* Luts = palette.GetLuts(); @@ -366,7 +368,8 @@ } } } - memcpy(dst_plt, pal, sizeof(uint32_t) * 256); + for (size_t i = 0; i < 256; ++i) + dst_plt[i] = pal[i]; } void ConvertBuffer_1bppMask2Rgb(FXDIB_Format dest_format, @@ -755,22 +758,18 @@ return; if (GetBPP() == 1) { - m_pPalette.reset(FX_Alloc(uint32_t, 2)); - if (IsCmykImage()) { - m_pPalette.get()[0] = 0xff; - m_pPalette.get()[1] = 0; - } else { - m_pPalette.get()[0] = 0xff000000; - m_pPalette.get()[1] = 0xffffffff; - } + if (IsCmykImage()) + m_palette = {0xff, 0x00}; + else + m_palette = {0xff000000, 0xffffffff}; } else if (GetBPP() == 8) { - m_pPalette.reset(FX_Alloc(uint32_t, 256)); + m_palette.resize(256); if (IsCmykImage()) { for (int i = 0; i < 256; ++i) - m_pPalette.get()[i] = 0xff - i; + m_palette[i] = 0xff - i; } else { for (int i = 0; i < 256; ++i) - m_pPalette.get()[i] = 0xff000000 | (i * 0x10101); + m_palette[i] = 0xff000000 | (i * 0x10101); } } } @@ -823,7 +822,7 @@ void CFX_DIBBase::SetPaletteArgb(int index, uint32_t color) { ASSERT((GetBPP() == 1 || GetBPP() == 8) && !IsAlphaMask()); BuildPalette(); - m_pPalette.get()[index] = color; + m_palette[index] = color; } int CFX_DIBBase::FindPalette(uint32_t color) const { @@ -902,14 +901,14 @@ void CFX_DIBBase::SetPalette(const uint32_t* pSrc) { static const uint32_t kPaletteSize = 256; if (!pSrc || GetBPP() > 8) { - m_pPalette.reset(); + m_palette.clear(); return; } uint32_t pal_size = 1 << GetBPP(); - if (!m_pPalette) - m_pPalette.reset(FX_Alloc(uint32_t, pal_size)); + if (m_palette.empty()) + m_palette.resize(pal_size); pal_size = std::min(pal_size, kPaletteSize); - memcpy(m_pPalette.get(), pSrc, pal_size * sizeof(uint32_t)); + std::copy(pSrc, pSrc + pal_size, m_palette.begin()); } void CFX_DIBBase::GetPalette(uint32_t* pal, int alpha) const { @@ -1078,13 +1077,13 @@ } RetainPtr<CFX_DIBBase> holder(this); - std::unique_ptr<uint32_t, FxFreeDeleter> pal_8bpp; + std::vector<uint32_t, FxAllocAllocator<uint32_t>> pal_8bpp; if (!ConvertBuffer(dest_format, pClone->GetBuffer(), pClone->GetPitch(), m_Width, m_Height, holder, 0, 0, &pal_8bpp)) { return nullptr; } - if (pal_8bpp) - pClone->SetPalette(pal_8bpp.get()); + if (!pal_8bpp.empty()) + pClone->SetPalette(pal_8bpp.data()); return pClone; } @@ -1226,7 +1225,7 @@ const RetainPtr<CFX_DIBBase>& pSrcBitmap, int src_left, int src_top, - std::unique_ptr<uint32_t, FxFreeDeleter>* p_pal) { + std::vector<uint32_t, FxAllocAllocator<uint32_t>>* pal) { FXDIB_Format src_format = pSrcBitmap->GetFormat(); const int bpp = GetBppFromFormat(src_format); switch (dest_format) { @@ -1239,17 +1238,17 @@ const bool bpp_1_or_8 = (bpp == 1 || bpp == 8); if (bpp_1_or_8 && !pSrcBitmap->HasPalette()) { return ConvertBuffer(FXDIB_8bppMask, dest_buf, dest_pitch, width, - height, pSrcBitmap, src_left, src_top, p_pal); + height, pSrcBitmap, src_left, src_top, pal); } - p_pal->reset(FX_Alloc(uint32_t, 256)); + pal->resize(256); if (bpp_1_or_8 && pSrcBitmap->HasPalette()) { ConvertBuffer_Plt2PltRgb8(dest_buf, dest_pitch, width, height, - pSrcBitmap, src_left, src_top, p_pal->get()); + pSrcBitmap, src_left, src_top, *pal); return true; } if (bpp >= 24) { ConvertBuffer_Rgb2PltRgb8(dest_buf, dest_pitch, width, height, - pSrcBitmap, src_left, src_top, p_pal->get()); + pSrcBitmap, src_left, src_top, *pal); return true; } return false;
diff --git a/core/fxge/dib/cfx_dibbase.h b/core/fxge/dib/cfx_dibbase.h index 90eada6..e8212b9 100644 --- a/core/fxge/dib/cfx_dibbase.h +++ b/core/fxge/dib/cfx_dibbase.h
@@ -7,7 +7,7 @@ #ifndef CORE_FXGE_DIB_CFX_DIBBASE_H_ #define CORE_FXGE_DIB_CFX_DIBBASE_H_ -#include <memory> +#include <vector> #include "core/fxcrt/fx_coordinates.h" #include "core/fxcrt/fx_memory_wrappers.h" @@ -55,8 +55,8 @@ return static_cast<FXDIB_Format>(m_AlphaFlag * 0x100 + m_bpp); } uint32_t GetPitch() const { return m_Pitch; } - bool HasPalette() const { return !!m_pPalette; } - const uint32_t* GetPaletteData() const { return m_pPalette.get(); } + bool HasPalette() const { return !m_palette.empty(); } + const uint32_t* GetPaletteData() const { return m_palette.data(); } int GetBPP() const { return m_bpp; } bool IsAlphaMask() const { return !!(m_AlphaFlag & 1); } @@ -109,15 +109,16 @@ protected: CFX_DIBBase(); - static bool ConvertBuffer(FXDIB_Format dest_format, - uint8_t* dest_buf, - int dest_pitch, - int width, - int height, - const RetainPtr<CFX_DIBBase>& pSrcBitmap, - int src_left, - int src_top, - std::unique_ptr<uint32_t, FxFreeDeleter>* pal); + static bool ConvertBuffer( + FXDIB_Format dest_format, + uint8_t* dest_buf, + int dest_pitch, + int width, + int height, + const RetainPtr<CFX_DIBBase>& pSrcBitmap, + int src_left, + int src_top, + std::vector<uint32_t, FxAllocAllocator<uint32_t>>* pal); void BuildPalette(); bool BuildAlphaMask(); @@ -129,8 +130,7 @@ int m_bpp; uint32_t m_AlphaFlag; uint32_t m_Pitch; - // TODO(weili): Use std::vector for this. - std::unique_ptr<uint32_t, FxFreeDeleter> m_pPalette; + std::vector<uint32_t, FxAllocAllocator<uint32_t>> m_palette; }; #endif // CORE_FXGE_DIB_CFX_DIBBASE_H_
diff --git a/core/fxge/dib/cfx_dibitmap.cpp b/core/fxge/dib/cfx_dibitmap.cpp index a8aa1bc..f738edc 100644 --- a/core/fxge/dib/cfx_dibitmap.cpp +++ b/core/fxge/dib/cfx_dibitmap.cpp
@@ -104,7 +104,7 @@ void CFX_DIBitmap::TakeOver(RetainPtr<CFX_DIBitmap>&& pSrcBitmap) { m_pBuffer = std::move(pSrcBitmap->m_pBuffer); - m_pPalette = std::move(pSrcBitmap->m_pPalette); + m_palette = std::move(pSrcBitmap->m_palette); m_pAlphaMask = pSrcBitmap->m_pAlphaMask; pSrcBitmap->m_pBuffer = nullptr; pSrcBitmap->m_pAlphaMask = nullptr; @@ -228,12 +228,9 @@ uint8_t* dest_buf = m_pBuffer.Get() + dest_top * m_Pitch + dest_left * GetBPP() / 8; - std::unique_ptr<uint32_t, FxFreeDeleter> d_plt; - if (!ConvertBuffer(dest_format, dest_buf, m_Pitch, width, height, pSrcBitmap, - src_left, src_top, &d_plt)) { - return false; - } - return true; + std::vector<uint32_t, FxAllocAllocator<uint32_t>> d_plt; + return ConvertBuffer(dest_format, dest_buf, m_Pitch, width, height, + pSrcBitmap, src_left, src_top, &d_plt); } void CFX_DIBitmap::TransferWithMultipleBPP( @@ -724,10 +721,9 @@ BuildPalette(); int size = 1 << m_bpp; for (int i = 0; i < size; ++i) { - int gray = FXRGB2GRAY(FXARGB_R(m_pPalette.get()[i]), - FXARGB_G(m_pPalette.get()[i]), - FXARGB_B(m_pPalette.get()[i])); - m_pPalette.get()[i] = + int gray = FXRGB2GRAY(FXARGB_R(m_palette[i]), FXARGB_G(m_palette[i]), + FXARGB_B(m_palette[i])); + m_palette[i] = ArgbEncode(0xff, br + (fr - br) * gray / 255, bg + (fg - bg) * gray / 255, bb + (fb - bb) * gray / 255); } @@ -780,13 +776,11 @@ uint8_t r; uint8_t g; uint8_t b; - std::tie(r, g, b) = - AdobeCMYK_to_sRGB1(FXSYS_GetCValue(m_pPalette.get()[i]), - FXSYS_GetMValue(m_pPalette.get()[i]), - FXSYS_GetYValue(m_pPalette.get()[i]), - FXSYS_GetKValue(m_pPalette.get()[i])); + std::tie(r, g, b) = AdobeCMYK_to_sRGB1( + FXSYS_GetCValue(m_palette[i]), FXSYS_GetMValue(m_palette[i]), + FXSYS_GetYValue(m_palette[i]), FXSYS_GetKValue(m_palette[i])); int gray = 255 - FXRGB2GRAY(r, g, b); - m_pPalette.get()[i] = + m_palette[i] = CmykEncode(bc + (fc - bc) * gray / 255, bm + (fm - bm) * gray / 255, by + (fy - by) * gray / 255, bk + (fk - bk) * gray / 255); } @@ -1267,14 +1261,14 @@ } bool ret = false; RetainPtr<CFX_DIBBase> holder(this); - std::unique_ptr<uint32_t, FxFreeDeleter> pal_8bpp; + std::vector<uint32_t, FxAllocAllocator<uint32_t>> pal_8bpp; ret = ConvertBuffer(dest_format, dest_buf.get(), dest_pitch, m_Width, m_Height, holder, 0, 0, &pal_8bpp); if (!ret) return false; m_pAlphaMask = pAlphaMask; - m_pPalette = std::move(pal_8bpp); + m_palette = std::move(pal_8bpp); m_pBuffer = std::move(dest_buf); m_bpp = GetBppFromFormat(dest_format); m_AlphaFlag = GetAlphaFlagFromFormat(dest_format);