81 std::array<std::unique_ptr<CPDF_Function>, 3> pFuncs;
84 if (pArray->size() < 3)
87 for (uint32_t i = 0; i < 3; ++i) {
88 pFuncs[2 - i] = CPDF_Function::Load(pArray->GetDirectObjectAt(i));
94 pFuncs[0] = CPDF_Function::Load(pObj);
99 float output[kMaxOutputs];
100 std::fill(
std::begin(output),
std::end(output), 0.0f);
102 bool bIdentity =
true;
103 auto samples_r = FixedSizeDataVector<uint8_t>::Uninit(
104 CPDF_TransferFunc::kChannelSampleSize);
105 auto samples_g = FixedSizeDataVector<uint8_t>::Uninit(
106 CPDF_TransferFunc::kChannelSampleSize);
107 auto samples_b = FixedSizeDataVector<uint8_t>::Uninit(
108 CPDF_TransferFunc::kChannelSampleSize);
110 std::array<pdfium::span<uint8_t>, 3> samples = {
111 samples_r.span(), samples_g.span(), samples_b.span()};
113 for (size_t v = 0; v < CPDF_TransferFunc::kChannelSampleSize; ++v) {
114 float input =
static_cast<
float>(v) / 255.0f;
115 for (
int i = 0; i < 3; ++i) {
116 if (pFuncs[i]->OutputCount() > kMaxOutputs) {
120 pFuncs[i]->Call(
pdfium::span_from_ref(input), output);
128 for (size_t v = 0; v < CPDF_TransferFunc::kChannelSampleSize; ++v) {
129 float input =
static_cast<
float>(v) / 255.0f;
130 if (pFuncs[0]->OutputCount() <= kMaxOutputs) {
131 pFuncs[0]->Call(
pdfium::span_from_ref(input), output);
136 for (
auto& channel : samples)
141 return pdfium::MakeRetain<CPDF_TransferFunc>(bIdentity,
std::move(samples_r),
142 std::move(samples_g),
143 std::move(samples_b));