115 m_pStream->LoadAllDataFiltered();
116 m_BitStream = std::make_unique<CFX_BitStream>(m_pStream->GetSpan());
119 m_nCoordBits = pDict->GetIntegerFor(
"BitsPerCoordinate");
120 m_nComponentBits = pDict->GetIntegerFor(
"BitsPerComponent");
121 if (ShouldCheckBPC(m_type)) {
122 if (!IsValidBitsPerCoordinate(m_nCoordBits))
124 if (!IsValidBitsPerComponent(m_nComponentBits))
128 m_nFlagBits = pDict->GetIntegerFor(
"BitsPerFlag");
129 if (ShouldCheckBitsPerFlag(m_type) && !IsValidBitsPerFlag(m_nFlagBits))
132 uint32_t nComponents = m_pCS->ComponentCount();
133 if (nComponents > kMaxComponents)
136 m_nComponents = m_funcs.empty() ? nComponents : 1;
138 if (!pDecode || pDecode->size() != 4 + m_nComponents * 2)
141 m_xmin = pDecode->GetFloatAt(0);
142 m_xmax = pDecode->GetFloatAt(1);
143 m_ymin = pDecode->GetFloatAt(2);
144 m_ymax = pDecode->GetFloatAt(3);
145 for (uint32_t i = 0; i < m_nComponents; ++i) {
146 m_ColorMin[i] = pDecode->GetFloatAt(i * 2 + 4);
147 m_ColorMax[i] = pDecode->GetFloatAt(i * 2 + 5);
149 if (ShouldCheckBPC(m_type)) {
150 m_CoordMax = m_nCoordBits == 32 ? -1 : (1 << m_nCoordBits) - 1;
151 m_ComponentMax = (1 << m_nComponentBits) - 1;
186 DCHECK(ShouldCheckBPC(m_type));
189 if (m_nCoordBits == 32) {
190 pos.x = m_xmin + m_BitStream->GetBits(m_nCoordBits) * (m_xmax - m_xmin) /
191 static_cast<
double>(m_CoordMax);
192 pos.y = m_ymin + m_BitStream->GetBits(m_nCoordBits) * (m_ymax - m_ymin) /
193 static_cast<
double>(m_CoordMax);
196 m_BitStream->GetBits(m_nCoordBits) * (m_xmax - m_xmin) / m_CoordMax;
198 m_BitStream->GetBits(m_nCoordBits) * (m_ymax - m_ymin) / m_CoordMax;
204 DCHECK(ShouldCheckBPC(m_type));
206 std::array<
float, kMaxComponents> color_value;
207 for (uint32_t i = 0; i < m_nComponents; ++i) {
208 color_value[i] = m_ColorMin[i] + m_BitStream->GetBits(m_nComponentBits) *
209 (m_ColorMax[i] - m_ColorMin[i]) /
212 if (m_funcs.empty()) {
213 return m_pCS->GetRGBOrZerosOnError(color_value);
215 float result[kMaxComponents] = {};
216 for (
const auto& func : m_funcs) {
217 if (func && func->OutputCount() <= kMaxComponents) {
218 func->Call(pdfium::make_span(color_value).first<1u>(), result);
221 return m_pCS->GetRGBOrZerosOnError(result);
245 std::vector<CPDF_MeshVertex> vertices;
246 for (
int i = 0; i < count; ++i) {
247 if (m_BitStream->IsEOF() || !CanReadCoords())
248 return std::vector<CPDF_MeshVertex>();
250 vertices.emplace_back();
252 vertex.position = pObject2Bitmap.Transform(ReadCoords());
254 return std::vector<CPDF_MeshVertex>();
256 vertex.rgb = ReadColor();
257 m_BitStream->ByteAlign();