Use FixedUninitDataVectors in CPDF_TransferFunc.
The data that CPDF_TransferFunc holds can be written into
FixedUninitDataVectors. So use that container type instead of DataVector
to avoid initialization.
Change-Id: I5d50213a8b70f2f5e40ad928c460ca8662daa376
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/98151
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/core/fpdfapi/page/cpdf_transferfunc.cpp b/core/fpdfapi/page/cpdf_transferfunc.cpp
index f1a0a5b..a9e0663 100644
--- a/core/fpdfapi/page/cpdf_transferfunc.cpp
+++ b/core/fpdfapi/page/cpdf_transferfunc.cpp
@@ -12,14 +12,14 @@
#include "core/fpdfapi/page/cpdf_transferfuncdib.h"
#include "core/fpdfapi/parser/cpdf_document.h"
-#include "core/fxcrt/data_vector.h"
+#include "core/fxcrt/fixed_uninit_data_vector.h"
#include "core/fxge/dib/cfx_dibbase.h"
#include "third_party/base/check_op.h"
CPDF_TransferFunc::CPDF_TransferFunc(bool bIdentify,
- DataVector<uint8_t> samples_r,
- DataVector<uint8_t> samples_g,
- DataVector<uint8_t> samples_b)
+ FixedUninitDataVector<uint8_t> samples_r,
+ FixedUninitDataVector<uint8_t> samples_g,
+ FixedUninitDataVector<uint8_t> samples_b)
: m_bIdentity(bIdentify),
m_SamplesR(std::move(samples_r)),
m_SamplesG(std::move(samples_g)),
@@ -32,9 +32,9 @@
CPDF_TransferFunc::~CPDF_TransferFunc() = default;
FX_COLORREF CPDF_TransferFunc::TranslateColor(FX_COLORREF colorref) const {
- return FXSYS_BGR(m_SamplesB[FXSYS_GetBValue(colorref)],
- m_SamplesG[FXSYS_GetGValue(colorref)],
- m_SamplesR[FXSYS_GetRValue(colorref)]);
+ return FXSYS_BGR(m_SamplesB.span()[FXSYS_GetBValue(colorref)],
+ m_SamplesG.span()[FXSYS_GetGValue(colorref)],
+ m_SamplesR.span()[FXSYS_GetRValue(colorref)]);
}
RetainPtr<CFX_DIBBase> CPDF_TransferFunc::TranslateImage(
diff --git a/core/fpdfapi/page/cpdf_transferfunc.h b/core/fpdfapi/page/cpdf_transferfunc.h
index b558559..d240510 100644
--- a/core/fpdfapi/page/cpdf_transferfunc.h
+++ b/core/fpdfapi/page/cpdf_transferfunc.h
@@ -9,7 +9,7 @@
#include <stdint.h>
-#include "core/fxcrt/data_vector.h"
+#include "core/fxcrt/fixed_uninit_data_vector.h"
#include "core/fxcrt/observed_ptr.h"
#include "core/fxcrt/retain_ptr.h"
#include "core/fxge/dib/fx_dib.h"
@@ -35,15 +35,15 @@
private:
CPDF_TransferFunc(bool bIdentify,
- DataVector<uint8_t> samples_r,
- DataVector<uint8_t> samples_g,
- DataVector<uint8_t> samples_b);
+ FixedUninitDataVector<uint8_t> samples_r,
+ FixedUninitDataVector<uint8_t> samples_g,
+ FixedUninitDataVector<uint8_t> samples_b);
~CPDF_TransferFunc() override;
const bool m_bIdentity;
- const DataVector<uint8_t> m_SamplesR;
- const DataVector<uint8_t> m_SamplesG;
- const DataVector<uint8_t> m_SamplesB;
+ const FixedUninitDataVector<uint8_t> m_SamplesR;
+ const FixedUninitDataVector<uint8_t> m_SamplesG;
+ const FixedUninitDataVector<uint8_t> m_SamplesB;
};
#endif // CORE_FPDFAPI_PAGE_CPDF_TRANSFERFUNC_H_
diff --git a/core/fpdfapi/render/cpdf_docrenderdata.cpp b/core/fpdfapi/render/cpdf_docrenderdata.cpp
index 02c9803..a2e0654 100644
--- a/core/fpdfapi/render/cpdf_docrenderdata.cpp
+++ b/core/fpdfapi/render/cpdf_docrenderdata.cpp
@@ -20,7 +20,7 @@
#include "core/fpdfapi/parser/cpdf_array.h"
#include "core/fpdfapi/parser/cpdf_document.h"
#include "core/fpdfapi/render/cpdf_type3cache.h"
-#include "core/fxcrt/data_vector.h"
+#include "core/fxcrt/fixed_uninit_data_vector.h"
#if BUILDFLAG(IS_WIN)
#include "core/fxge/win32/cfx_psfonttracker.h"
@@ -99,11 +99,15 @@
std::fill(std::begin(output), std::end(output), 0.0f);
bool bIdentity = true;
- DataVector<uint8_t> samples_r(CPDF_TransferFunc::kChannelSampleSize);
- DataVector<uint8_t> samples_g(CPDF_TransferFunc::kChannelSampleSize);
- DataVector<uint8_t> samples_b(CPDF_TransferFunc::kChannelSampleSize);
- std::array<pdfium::span<uint8_t>, 3> samples = {samples_r, samples_g,
- samples_b};
+ FixedUninitDataVector<uint8_t> samples_r(
+ CPDF_TransferFunc::kChannelSampleSize);
+ FixedUninitDataVector<uint8_t> samples_g(
+ CPDF_TransferFunc::kChannelSampleSize);
+ FixedUninitDataVector<uint8_t> samples_b(
+ CPDF_TransferFunc::kChannelSampleSize);
+ std::array<pdfium::span<uint8_t>, 3> samples = {samples_r.writable_span(),
+ samples_g.writable_span(),
+ samples_b.writable_span()};
if (pArray) {
for (size_t v = 0; v < CPDF_TransferFunc::kChannelSampleSize; ++v) {
float input = static_cast<float>(v) / 255.0f;