Example #1
0
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);
        }
    }
}
Example #2
0
 static void Flatten(SkWriteBuffer& buffer, const SkBitmap& bitmap) {
     bitmap.flatten(buffer);
 }