48 RetainPtr<
const CPDF_Stream> pStream(pObj->AsStream());
54 if (!pSize || pSize->IsEmpty())
57 m_nBitsPerSample = pDict->GetIntegerFor(
"BitsPerSample");
58 if (!IsValidBitsPerSample(m_nBitsPerSample))
64 m_EncodeInfo.resize(m_nInputs);
65 for (uint32_t i = 0; i <
m_nInputs; i++) {
66 int size = pSize->GetIntegerAt(i);
70 m_EncodeInfo[i].sizes = size;
71 nTotalSampleBits *= m_EncodeInfo[i].sizes;
73 m_EncodeInfo[i].encode_min = pEncode->GetFloatAt(i * 2);
74 m_EncodeInfo[i].encode_max = pEncode->GetFloatAt(i * 2 + 1);
76 m_EncodeInfo[i].encode_min = 0;
77 m_EncodeInfo[i].encode_max =
78 m_EncodeInfo[i].sizes == 1 ? 1 : m_EncodeInfo[i].sizes - 1;
82 if (!nTotalSampleBytes.IsValid() || nTotalSampleBytes.ValueOrDie() == 0)
85 m_SampleMax = 0xffffffff >> (32 - m_nBitsPerSample);
86 m_pSampleStream = pdfium::MakeRetain<CPDF_StreamAcc>(std::move(pStream));
87 m_pSampleStream->LoadAllDataFiltered();
88 if (nTotalSampleBytes.ValueOrDie() > m_pSampleStream->GetSize())
92 m_DecodeInfo.resize(m_nOutputs);
95 m_DecodeInfo[i].decode_min = pDecode->GetFloatAt(2 * i);
96 m_DecodeInfo[i].decode_max = pDecode->GetFloatAt(2 * i + 1);
98 m_DecodeInfo[i].decode_min = m_Ranges[i * 2];
99 m_DecodeInfo[i].decode_max = m_Ranges[i * 2 + 1];
105bool CPDF_SampledFunc::
v_Call(pdfium::span<
const float> inputs,
106 pdfium::span<
float> results)
const {
108 absl::InlinedVector<
float, 16, FxAllocAllocator<
float>> encoded_input_buf(
110 absl::InlinedVector<uint32_t, 32, FxAllocAllocator<uint32_t>> int_buf(
113 float* encoded_input = encoded_input_buf.data();
114 uint32_t* index = int_buf.data();
116 for (uint32_t i = 0; i <
m_nInputs; i++) {
120 blocksize[i] = blocksize[i - 1] * m_EncodeInfo[i - 1].sizes;
123 Interpolate(inputs[i], m_Domains[i * 2], m_Domains[i * 2 + 1],
124 m_EncodeInfo[i].encode_min, m_EncodeInfo[i].encode_max);
125 index[i] = std::clamp(
static_cast<uint32_t>(encoded_input[i]), 0U,
126 m_EncodeInfo[i].sizes - 1);
127 pos += index[i] * blocksize[i];
130 bits_to_output *= m_nBitsPerSample;
131 if (!bits_to_output.IsValid()) {
138 bitpos *= bits_to_output.ValueOrDie();
139 bits_to_skip = bitpos.ValueOrDefault(-1);
140 if (bits_to_skip < 0) {
145 range_check += bits_to_output.ValueOrDie();
146 if (!range_check.IsValid()) {
151 pdfium::span<
const uint8_t> pSampleData = m_pSampleStream->GetSpan();
152 if (pSampleData.empty()) {
157 bitstream.SkipBits(bits_to_skip);
159 uint32_t sample = bitstream
.GetBits(m_nBitsPerSample
);
160 float encoded = sample;
161 for (uint32_t j = 0; j <
m_nInputs; ++j) {
162 if (index[j] == m_EncodeInfo[j].sizes - 1) {
164 encoded = encoded_input[j] * sample;
171 bitpos2 *= m_nBitsPerSample;
172 int bits_to_skip2 = bitpos2.ValueOrDefault(-1);
173 if (bits_to_skip2 < 0) {
178 bitstream2.SkipBits(bits_to_skip2);
180 static_cast<
float>(bitstream2
.GetBits(m_nBitsPerSample
));
181 encoded += (encoded_input[j] - index[j]) * (sample2 - sample);
185 Interpolate(encoded, 0, m_SampleMax, m_DecodeInfo[i].decode_min,
186 m_DecodeInfo[i].decode_max);