139 {
140 size_t srcLen = srcStream ? srcStream->getLength() : 0;
142 if (!srcLen) {
143 return nullptr;
144 }
145
146
148 (void)srcStream->read(sourceBuffer.get(), srcLen);
149 sourceBuffer[
SkToInt(srcLen)] = 0;
150 const uint8_t*
src = sourceBuffer.get();
151
152 if (
parsePFB(src, srcLen, headerLen, dataLen, trailerLen)) {
153 static const int kPFBSectionHeaderLength = 6;
154 const size_t length = *headerLen + *dataLen + *trailerLen;
157
159
160 const uint8_t*
const srcHeader =
src + kPFBSectionHeaderLength;
161
162
163 const uint8_t* const srcData = srcHeader + *headerLen + kPFBSectionHeaderLength;
164 const uint8_t* const srcTrailer = srcData + *headerLen;
165
166 uint8_t*
const resultHeader = (uint8_t*)
data->writable_data();
167 uint8_t* const resultData = resultHeader + *headerLen;
168 uint8_t* const resultTrailer = resultData + *dataLen;
169
171
172 memcpy(resultHeader, srcHeader, *headerLen);
173 memcpy(resultData, srcData, *dataLen);
174 memcpy(resultTrailer, srcTrailer, *trailerLen);
175
177 }
178
179
180 size_t hexDataLen;
181 if (!
parsePFA((
const char*)src, srcLen, headerLen, &hexDataLen, dataLen,
182 trailerLen)) {
183 return nullptr;
184 }
185 const size_t length = *headerLen + *dataLen + *trailerLen;
188 uint8_t*
buffer = (uint8_t*)
data->writable_data();
189
190 memcpy(
buffer, src, *headerLen);
191 uint8_t*
const resultData = &(
buffer[*headerLen]);
192
193 const uint8_t* hexData =
src + *headerLen;
194 const uint8_t* trailer = hexData + hexDataLen;
195 size_t outputOffset = 0;
196 uint8_t dataByte = 0;
197 bool highNibble = true;
198 for (; hexData < trailer; hexData++) {
199 int8_t curNibble =
hexToBin(*hexData);
200 if (curNibble < 0) {
201 continue;
202 }
203 if (highNibble) {
204 dataByte = curNibble << 4;
205 highNibble = false;
206 } else {
207 dataByte |= curNibble;
208 highNibble = true;
209 resultData[outputOffset++] = dataByte;
210 }
211 }
212 if (!highNibble) {
213 resultData[outputOffset++] = dataByte;
214 }
216
217 uint8_t*
const resultTrailer = &(
buffer[
SkToInt(*headerLen + outputOffset)]);
218 memcpy(resultTrailer, src + *headerLen + hexDataLen, *trailerLen);
220}
static bool parsePFB(const uint8_t *src, size_t size, size_t *headerLen, size_t *dataLen, size_t *trailerLen)
static bool parsePFA(const char *src, size_t size, size_t *headerLen, size_t *hexDataLen, size_t *dataLen, size_t *trailerLen)
static int8_t hexToBin(uint8_t c)
constexpr int SkToInt(S x)
static sk_sp< SkData > MakeUninitialized(size_t length)
static const uint8_t buffer[]
DEF_SWITCHES_START aot vmservice shared library Name of the *so containing AOT compiled Dart assets for launching the service isolate vm snapshot data