126 {
127
128
129 const size_t headerSize = signatureSize + signaturePadding + 2 * bytesInIndex;
130
131
132 std::vector<sk_sp<SkData>>
parts;
133
134
135 size_t partsTotalSize = 0;
136
137
138 uint32_t foundPartCount = 0;
139
140
141 uint32_t expectedPartCount = 0;
142
143
144 for (
const auto&
marker : markerList) {
145
147 continue;
148 }
149
150
151 const size_t dataLength =
marker.fData->size();
152 if (dataLength <= headerSize) {
153 continue;
154 }
155
156
157
159 uint32_t partIndex = 0;
160 uint32_t partCount = 0;
161 if (bytesInIndex == 0) {
162 partIndex = 1;
163 partCount = 1;
164 } else {
165 for (size_t i = 0; i < bytesInIndex; ++i) {
166 const size_t offset = signatureSize + signaturePadding;
167 partIndex = (partIndex << 8) + data[
offset + i];
168 partCount = (partCount << 8) + data[
offset + bytesInIndex + i];
169 }
170 }
171
172
173 if (!partCount) {
175 return nullptr;
176 }
177
178
179 if (partIndex <= 0 || partIndex > partCount) {
180 SkCodecPrintf(
"Invalid marker index %u for count %u\n", partIndex, partCount);
181 return nullptr;
182 }
183
184
185 if (expectedPartCount == 0) {
186 expectedPartCount = partCount;
187 parts.resize(expectedPartCount);
188 }
189
190
191 if (partCount != expectedPartCount) {
192 SkCodecPrintf(
"Conflicting marker counts %u vs %u\n", partCount, expectedPartCount);
193 return nullptr;
194 }
195
196
198
199
200 if (parts[partIndex-1]) {
201 SkCodecPrintf(
"Duplicate parts for index %u of %u\n", partIndex, expectedPartCount);
202 return nullptr;
203 }
204
205
206 partsTotalSize += partData->size();
207 parts[partIndex-1] = std::move(partData);
208 foundPartCount += 1;
209
210
211 if (foundPartCount == expectedPartCount) {
212 break;
213 }
214 }
215
216
217 if (expectedPartCount == 0) {
218 return nullptr;
219 }
220
221
222 if (foundPartCount != expectedPartCount) {
223 SkCodecPrintf(
"Incomplete set of markers (expected %u got %u)\n",
224 expectedPartCount,
225 foundPartCount);
226 return nullptr;
227 }
228
229
230 if (!alwaysCopyData && expectedPartCount == 1) {
231 return std::move(parts[0]);
232 }
233
234
236 void* copyDest =
result->writable_data();
237 for (
const auto& part :
parts) {
238 memcpy(copyDest, part->data(), part->size());
239 copyDest = SkTAddOffset<void>(copyDest, part->size());
240 }
242}
#define SkCodecPrintf(...)
static bool marker_has_signature(const SkJpegMarker &marker, const uint32_t targetMarker, const uint8_t *signature, size_t signatureSize)
static sk_sp< SkData > MakeUninitialized(size_t length)
DEF_SWITCHES_START aot vmservice shared library Name of the *so containing AOT compiled Dart assets for launching the service isolate vm snapshot data