Clean up CPDF_TransferFunc.
- Prepare samples in the ctor caller and std::move() the samples in.
- Make members all const.
- Use spans.
Change-Id: I5a819fcc9d46328eb5aa2e79f2eaedde29bb84e1
Reviewed-on: https://pdfium-review.googlesource.com/c/45290
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/core/fpdfapi/render/cpdf_dibtransferfunc.cpp b/core/fpdfapi/render/cpdf_dibtransferfunc.cpp
index b73fc77..ee27378 100644
--- a/core/fpdfapi/render/cpdf_dibtransferfunc.cpp
+++ b/core/fpdfapi/render/cpdf_dibtransferfunc.cpp
@@ -14,13 +14,12 @@
CPDF_DIBTransferFunc::CPDF_DIBTransferFunc(
const RetainPtr<CPDF_TransferFunc>& pTransferFunc)
- : m_pTransferFunc(pTransferFunc) {
- m_RampR = pTransferFunc->GetSamples();
- m_RampG = &pTransferFunc->GetSamples()[256];
- m_RampB = &pTransferFunc->GetSamples()[512];
-}
+ : m_pTransferFunc(pTransferFunc),
+ m_RampR(pTransferFunc->GetSamplesR()),
+ m_RampG(pTransferFunc->GetSamplesG()),
+ m_RampB(pTransferFunc->GetSamplesB()) {}
-CPDF_DIBTransferFunc::~CPDF_DIBTransferFunc() {}
+CPDF_DIBTransferFunc::~CPDF_DIBTransferFunc() = default;
FXDIB_Format CPDF_DIBTransferFunc::GetDestFormat() {
if (m_pSrc->IsAlphaMask())
diff --git a/core/fpdfapi/render/cpdf_dibtransferfunc.h b/core/fpdfapi/render/cpdf_dibtransferfunc.h
index 9db97f1..3ad9023 100644
--- a/core/fpdfapi/render/cpdf_dibtransferfunc.h
+++ b/core/fpdfapi/render/cpdf_dibtransferfunc.h
@@ -11,6 +11,7 @@
#include "core/fxge/dib/cfx_filtereddib.h"
#include "core/fxge/fx_dib.h"
+#include "third_party/base/span.h"
class CPDF_TransferFunc;
@@ -35,9 +36,9 @@
~CPDF_DIBTransferFunc() override;
RetainPtr<CPDF_TransferFunc> m_pTransferFunc;
- const uint8_t* m_RampR;
- const uint8_t* m_RampG;
- const uint8_t* m_RampB;
+ const pdfium::span<const uint8_t> m_RampR;
+ const pdfium::span<const uint8_t> m_RampG;
+ const pdfium::span<const uint8_t> m_RampB;
};
#endif // CORE_FPDFAPI_RENDER_CPDF_DIBTRANSFERFUNC_H_
diff --git a/core/fpdfapi/render/cpdf_docrenderdata.cpp b/core/fpdfapi/render/cpdf_docrenderdata.cpp
index fb54e14..e713866 100644
--- a/core/fpdfapi/render/cpdf_docrenderdata.cpp
+++ b/core/fpdfapi/render/cpdf_docrenderdata.cpp
@@ -6,7 +6,10 @@
#include "core/fpdfapi/render/cpdf_docrenderdata.h"
+#include <array>
#include <memory>
+#include <utility>
+#include <vector>
#include "core/fpdfapi/font/cpdf_type3font.h"
#include "core/fpdfapi/page/cpdf_function.h"
@@ -88,39 +91,46 @@
if (!pFuncs[0])
return nullptr;
}
- auto pTransfer = pdfium::MakeRetain<CPDF_TransferFunc>(m_pPDFDoc.Get());
- m_TransferFuncMap[pObj] = pTransfer;
float input;
int noutput;
float output[kMaxOutputs];
memset(output, 0, sizeof(output));
- for (int v = 0; v < 256; ++v) {
- input = (float)v / 255.0f;
+
+ std::vector<uint8_t> samples_r(CPDF_TransferFunc::kChannelSampleSize);
+ std::vector<uint8_t> samples_g(CPDF_TransferFunc::kChannelSampleSize);
+ std::vector<uint8_t> samples_b(CPDF_TransferFunc::kChannelSampleSize);
+ std::array<pdfium::span<uint8_t>, 3> samples = {samples_r, samples_g,
+ samples_b};
+ for (size_t v = 0; v < CPDF_TransferFunc::kChannelSampleSize; ++v) {
+ input = static_cast<float>(v) / 255.0f;
if (bUniTransfer) {
if (pFuncs[0] && pFuncs[0]->CountOutputs() <= kMaxOutputs)
pFuncs[0]->Call(&input, 1, output, &noutput);
- int o = FXSYS_round(output[0] * 255);
+ size_t o = FXSYS_round(output[0] * 255);
if (o != v)
bIdentity = false;
- for (int i = 0; i < 3; ++i)
- pTransfer->GetSamples()[i * 256 + v] = o;
+ for (auto& channel : samples)
+ channel[v] = o;
continue;
}
for (int i = 0; i < 3; ++i) {
if (!pFuncs[i] || pFuncs[i]->CountOutputs() > kMaxOutputs) {
- pTransfer->GetSamples()[i * 256 + v] = v;
+ samples[i][v] = v;
continue;
}
pFuncs[i]->Call(&input, 1, output, &noutput);
- int o = FXSYS_round(output[0] * 255);
+ size_t o = FXSYS_round(output[0] * 255);
if (o != v)
bIdentity = false;
- pTransfer->GetSamples()[i * 256 + v] = o;
+ samples[i][v] = o;
}
}
- pTransfer->SetIdentity(bIdentity);
+ auto pTransfer = pdfium::MakeRetain<CPDF_TransferFunc>(
+ m_pPDFDoc.Get(), bIdentity, std::move(samples_r), std::move(samples_g),
+ std::move(samples_b));
+ m_TransferFuncMap[pObj] = pTransfer;
return pTransfer;
}
diff --git a/core/fpdfapi/render/cpdf_docrenderdata.h b/core/fpdfapi/render/cpdf_docrenderdata.h
index e4e3548..71ca9f4 100644
--- a/core/fpdfapi/render/cpdf_docrenderdata.h
+++ b/core/fpdfapi/render/cpdf_docrenderdata.h
@@ -10,13 +10,14 @@
#include <map>
#include "core/fpdfapi/page/cpdf_countedobject.h"
-#include "core/fpdfapi/render/cpdf_transferfunc.h"
#include "core/fxcrt/fx_system.h"
+#include "core/fxcrt/retain_ptr.h"
#include "core/fxcrt/unowned_ptr.h"
class CPDF_Document;
class CPDF_Font;
class CPDF_Object;
+class CPDF_TransferFunc;
class CPDF_Type3Cache;
class CPDF_Type3Font;
diff --git a/core/fpdfapi/render/cpdf_transferfunc.cpp b/core/fpdfapi/render/cpdf_transferfunc.cpp
index f67f508..9f7a029 100644
--- a/core/fpdfapi/render/cpdf_transferfunc.cpp
+++ b/core/fpdfapi/render/cpdf_transferfunc.cpp
@@ -6,18 +6,33 @@
#include "core/fpdfapi/render/cpdf_transferfunc.h"
+#include <utility>
+
#include "core/fpdfapi/parser/cpdf_document.h"
#include "core/fpdfapi/render/cpdf_dibtransferfunc.h"
#include "core/fxge/dib/cfx_dibbase.h"
-CPDF_TransferFunc::CPDF_TransferFunc(CPDF_Document* pDoc) : m_pPDFDoc(pDoc) {}
+CPDF_TransferFunc::CPDF_TransferFunc(CPDF_Document* pDoc,
+ bool bIdentify,
+ std::vector<uint8_t> samples_r,
+ std::vector<uint8_t> samples_g,
+ std::vector<uint8_t> samples_b)
+ : m_pPDFDoc(pDoc),
+ m_bIdentity(bIdentify),
+ m_SamplesR(std::move(samples_r)),
+ m_SamplesG(std::move(samples_g)),
+ m_SamplesB(std::move(samples_b)) {
+ ASSERT(m_SamplesR.size() == kChannelSampleSize);
+ ASSERT(m_SamplesG.size() == kChannelSampleSize);
+ ASSERT(m_SamplesB.size() == kChannelSampleSize);
+}
-CPDF_TransferFunc::~CPDF_TransferFunc() {}
+CPDF_TransferFunc::~CPDF_TransferFunc() = default;
FX_COLORREF CPDF_TransferFunc::TranslateColor(FX_COLORREF colorref) const {
- return FXSYS_BGR(m_Samples[512 + FXSYS_GetBValue(colorref)],
- m_Samples[256 + FXSYS_GetGValue(colorref)],
- m_Samples[FXSYS_GetRValue(colorref)]);
+ return FXSYS_BGR(m_SamplesB[FXSYS_GetBValue(colorref)],
+ m_SamplesG[FXSYS_GetGValue(colorref)],
+ m_SamplesR[FXSYS_GetRValue(colorref)]);
}
RetainPtr<CFX_DIBBase> CPDF_TransferFunc::TranslateImage(
@@ -27,3 +42,15 @@
pDest->LoadSrc(pSrc);
return pDest;
}
+
+pdfium::span<const uint8_t> CPDF_TransferFunc::GetSamplesR() const {
+ return m_SamplesR;
+}
+
+pdfium::span<const uint8_t> CPDF_TransferFunc::GetSamplesG() const {
+ return m_SamplesG;
+}
+
+pdfium::span<const uint8_t> CPDF_TransferFunc::GetSamplesB() const {
+ return m_SamplesB;
+}
diff --git a/core/fpdfapi/render/cpdf_transferfunc.h b/core/fpdfapi/render/cpdf_transferfunc.h
index d45184e..74fc01d 100644
--- a/core/fpdfapi/render/cpdf_transferfunc.h
+++ b/core/fpdfapi/render/cpdf_transferfunc.h
@@ -7,9 +7,12 @@
#ifndef CORE_FPDFAPI_RENDER_CPDF_TRANSFERFUNC_H_
#define CORE_FPDFAPI_RENDER_CPDF_TRANSFERFUNC_H_
+#include <vector>
+
#include "core/fxcrt/retain_ptr.h"
#include "core/fxcrt/unowned_ptr.h"
#include "core/fxge/fx_dib.h"
+#include "third_party/base/span.h"
class CPDF_Document;
class CFX_DIBBase;
@@ -19,24 +22,33 @@
template <typename T, typename... Args>
friend RetainPtr<T> pdfium::MakeRetain(Args&&... args);
+ static constexpr size_t kChannelSampleSize = 256;
+
FX_COLORREF TranslateColor(FX_COLORREF colorref) const;
RetainPtr<CFX_DIBBase> TranslateImage(const RetainPtr<CFX_DIBBase>& pSrc);
const CPDF_Document* GetDocument() const { return m_pPDFDoc.Get(); }
- const uint8_t* GetSamples() const { return m_Samples; }
- uint8_t* GetSamples() { return m_Samples; }
+ // Spans are |kChannelSampleSize| in size.
+ pdfium::span<const uint8_t> GetSamplesR() const;
+ pdfium::span<const uint8_t> GetSamplesG() const;
+ pdfium::span<const uint8_t> GetSamplesB() const;
bool GetIdentity() const { return m_bIdentity; }
- void SetIdentity(bool identity) { m_bIdentity = identity; }
private:
- explicit CPDF_TransferFunc(CPDF_Document* pDoc);
+ CPDF_TransferFunc(CPDF_Document* pDoc,
+ bool bIdentify,
+ std::vector<uint8_t> samples_r,
+ std::vector<uint8_t> samples_g,
+ std::vector<uint8_t> samples_b);
~CPDF_TransferFunc() override;
UnownedPtr<CPDF_Document> const m_pPDFDoc;
- bool m_bIdentity;
- uint8_t m_Samples[256 * 3];
+ const bool m_bIdentity;
+ const std::vector<uint8_t> m_SamplesR;
+ const std::vector<uint8_t> m_SamplesG;
+ const std::vector<uint8_t> m_SamplesB;
};
#endif // CORE_FPDFAPI_RENDER_CPDF_TRANSFERFUNC_H_