static sk_sp<SkData> serialize_image(const SkImage* image, SkSerialProcs procs) {
sk_sp<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;
} #if !defined(SK_DISABLE_LEGACY_PNG_WRITEBUFFER)
SkBitmap bm; auto ib = as_IB(image); if (!ib->getROPixels(ib->directContext(), &bm)) { return nullptr;
}
SkDynamicMemoryWStream stream; if (SkPngEncoder::Encode(&stream, bm.pixmap(), SkPngEncoder::Options())) { return stream.detachAsData();
} #endif return nullptr;
}
static sk_sp<SkData> serialize_mipmap(const SkMipmap* mipmap, SkSerialProcs procs) { /* Format count_levels:32 for each level, starting with the biggest (index 0 in our iterator) encoded_size:32 encoded_data (padded)
*/ constint count = mipmap->countLevels();
// 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<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);
}
/* * We can write 1 of 2 versions of the flattenable: * * 1. index into fFactorySet: This assumes the writer will later resolve the function-ptrs * into strings for its reader. SkPicture does exactly this, by writing a table of names * (matching the indices) up front in its serialized form. * * 2. string name of the flattenable or index into fFlattenableDict: We store the string to * allow the reader to specify its own factories after write time. In order to improve * compression, if we have already written the string, we write its index instead.
*/
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));
}
Messung V0.5
¤ Dauer der Verarbeitung: 0.1 Sekunden
(vorverarbeitet)
¤
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.