static sk_sp<const SkData> serialize_image(const SkImage* image, SkSerialProcs procs) {
sk_sp<const SkData> data; if (procs.fImageProc) {
data = procs.fImageProc(const_cast<SkImage*>(image), procs.fImageCtx);
} if (data) { return data;
} // Check to see if the image's source was an encoded block of data. // If so, just use that.
data = image->refEncodedData(); if (data) { return data;
} return nullptr;
}
// This buffer does not need procs because it is just writing SkDatas
SkBinaryWriteBuffer buffer({});
buffer.write32(count); for (int i = 0; i < count; ++i) {
SkMipmap::Level level; if (mipmap->getLevel(i, &level)) {
sk_sp<SkImage> levelImage = SkImages::RasterFromPixmap(level.fPixmap, nullptr, nullptr);
sk_sp<const SkData> levelData = serialize_image(levelImage.get(), procs);
buffer.writeDataAsByteArray(levelData.get());
} else { return nullptr;
}
} return buffer.snapshotAsData();
}
if (obj == nullptr) {
fWriter.write32(0);
} elseif (fProcs.fTypefaceProc) { auto data = fProcs.fTypefaceProc(obj, fProcs.fTypefaceCtx); if (data) {
size_t size = data->size(); if (!SkTFitsIn<int32_t>(size)) {
size = 0; // fall back to default font
}
int32_t ssize = SkToS32(size);
fWriter.write32(-ssize); // negative to signal custom if (size) {
this->writePad32(data->data(), size);
} return;
} // no data means fall through for std behavior
}
fWriter.write32(fTFSet ? fTFSet->add(obj) : 0);
}
if (uint32_t* indexPtr = fFlattenableDict.find(name)) { // We will write the index as a 32-bit int. We want the first byte // that we send to be zero - this will act as a sentinel that we // have an index (not a string). This means that we will send the // the index shifted left by 8. The remaining 24-bits should be // plenty to store the index. Note that this strategy depends on // being little endian, and type names being non-empty.
SkASSERT(0 == *indexPtr >> 24);
this->write32(*indexPtr << 8);
} else {
this->writeString(name);
fFlattenableDict.set(name, fFlattenableDict.count() + 1);
}
}
// make room for the size of the flattened object
(void)fWriter.reserve(sizeof(uint32_t)); // record the current size, so we can subtract after the object writes.
size_t offset = fWriter.bytesWritten(); // now flatten the object
flattenable->flatten(*this);
size_t objSize = fWriter.bytesWritten() - offset; // record the obj's size
fWriter.overwriteTAt(offset - sizeof(uint32_t), SkToU32(objSize));
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.