45 const uint32_t nSubs =
fxcrt::CollectionSize<uint32_t>(*pFunctionsArray);
52 if (pBoundsArray->size() < nSubs - 1)
56 nExpectedEncodeSize *= 2;
57 if (!nExpectedEncodeSize.IsValid())
60 if (pEncodeArray->size() < nExpectedEncodeSize.ValueOrDie())
66 std::optional<uint32_t> nOutputs;
67 for (uint32_t i = 0; i < nSubs; ++i) {
72 std::unique_ptr<CPDF_Function> pFunc =
73 CPDF_Function::Load(
std::move(pSub), pVisited);
79 if (pFunc->InputCount() != kRequiredNumInputs) {
83 uint32_t nFuncOutputs = pFunc->OutputCount();
84 if (nFuncOutputs == 0)
87 if (nOutputs.has_value()) {
88 if (nOutputs != nFuncOutputs)
91 nOutputs = nFuncOutputs;
93 m_pSubFunctions.push_back(std::move(pFunc));
98 m_bounds.reserve(nSubs + 1);
99 m_bounds.push_back(m_Domains[0]);
100 for (uint32_t i = 0; i < nSubs - 1; i++)
101 m_bounds.push_back(pBoundsArray->GetFloatAt(i));
102 m_bounds.push_back(m_Domains[1]);
104 m_encode = ReadArrayElementsToVector(pEncodeArray.Get(), nSubs * 2);
108bool CPDF_StitchFunc::
v_Call(pdfium::span<
const float> inputs,
109 pdfium::span<
float> results)
const {
110 float input = inputs[0];
112 for (i = 0; i + 1 < m_pSubFunctions.size(); i++) {
113 if (input < m_bounds[i + 1])
116 input = Interpolate(input, m_bounds[i], m_bounds[i + 1], m_encode[i * 2],
117 m_encode[i * 2 + 1]);
118 return m_pSubFunctions[i]
119 ->Call(pdfium::span_from_ref(input), results)