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