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;