void SkOrderedWriteBuffer::writeBitmap(const SkBitmap& bitmap) { bool encoded = false; if (fBitmapEncoder != NULL) { SkDynamicMemoryWStream pngStream; if (fBitmapEncoder(&pngStream, bitmap)) { encoded = true; if (encoded) { uint32_t offset = fWriter.bytesWritten(); // Write the length to indicate that the bitmap was encoded successfully. size_t length = pngStream.getOffset(); this->writeUInt(length); // Now write the stream. if (pngStream.read(fWriter.reservePad(length), 0, length)) { // Write the width and height in case the reader does not have a decoder. this->writeInt(bitmap.width()); this->writeInt(bitmap.height()); } else { // Writing the stream failed, so go back to original state to store another way. fWriter.rewindToOffset(offset); encoded = false; } } } } if (!encoded) { // Bitmap was not encoded. Record a zero, implying that the reader need not decode. this->writeUInt(0); if (fBitmapHeap) { int32_t slot = fBitmapHeap->insert(bitmap); fWriter.write32(slot); // crbug.com/155875 // The generation ID is not required information. We write it to prevent collisions // in SkFlatDictionary. It is possible to get a collision when a previously // unflattened (i.e. stale) instance of a similar flattenable is in the dictionary // and the instance currently being written is re-using the same slot from the // bitmap heap. fWriter.write32(bitmap.getGenerationID()); } else { bitmap.flatten(*this); } } }
static void Flatten(SkWriteBuffer& buffer, const SkBitmap& bitmap) { bitmap.flatten(buffer); }