void SkBinaryWriteBuffer::writeBitmap(const SkBitmap& bitmap) { // Record the width and height. This way if readBitmap fails a dummy bitmap can be drawn at the // right size. this->writeInt(bitmap.width()); this->writeInt(bitmap.height()); // Record information about the bitmap in one of two ways, in order of priority: // 1. If there is a function for encoding bitmaps, use it to write an encoded version of the // bitmap. After writing a boolean value of false, signifying that a heap was not used, write // the size of the encoded data. A non-zero size signifies that encoded data was written. // 2. Call SkBitmap::flatten. After writing a boolean value of false, signifying that a heap was // not used, write a zero to signify that the data was not encoded. // Write a bool to indicate that we did not use an SkBitmapHeap. That feature is deprecated. this->writeBool(false); SkPixelRef* pixelRef = bitmap.pixelRef(); if (pixelRef) { // see if the pixelref already has an encoded version SkAutoDataUnref existingData(pixelRef->refEncodedData()); if (existingData.get() != nullptr) { // Assumes that if the client did not set a serializer, they are // happy to get the encoded data. if (!fPixelSerializer || fPixelSerializer->useEncodedData(existingData->data(), existingData->size())) { write_encoded_bitmap(this, existingData, bitmap.pixelRefOrigin()); return; } } // see if the caller wants to manually encode SkAutoPixmapUnlock result; if (fPixelSerializer && bitmap.requestLock(&result)) { SkAutoDataUnref data(fPixelSerializer->encode(result.pixmap())); if (data.get() != nullptr) { // if we have to "encode" the bitmap, then we assume there is no // offset to share, since we are effectively creating a new pixelref write_encoded_bitmap(this, data, SkIPoint::Make(0, 0)); return; } } } this->writeUInt(0); // signal raw pixels SkBitmap::WriteRawPixels(this, bitmap); }
void SkWriteBuffer::writeBitmap(const SkBitmap& bitmap) { // Record the width and height. This way if readBitmap fails a dummy bitmap can be drawn at the // right size. this->writeInt(bitmap.width()); this->writeInt(bitmap.height()); // Record information about the bitmap in one of three ways, in order of priority: // 1. If there is an SkBitmapHeap, store it in the heap. The client can avoid serializing the // bitmap entirely or serialize it later as desired. A boolean value of true will be written // to the stream to signify that a heap was used. // 2. If there is a function for encoding bitmaps, use it to write an encoded version of the // bitmap. After writing a boolean value of false, signifying that a heap was not used, write // the size of the encoded data. A non-zero size signifies that encoded data was written. // 3. Call SkBitmap::flatten. After writing a boolean value of false, signifying that a heap was // not used, write a zero to signify that the data was not encoded. bool useBitmapHeap = fBitmapHeap != NULL; // Write a bool: true if the SkBitmapHeap is to be used, in which case the reader must use an // SkBitmapHeapReader to read the SkBitmap. False if the bitmap was serialized another way. this->writeBool(useBitmapHeap); if (useBitmapHeap) { SkASSERT(NULL == fPixelSerializer); 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()); return; } SkPixelRef* pixelRef = bitmap.pixelRef(); if (pixelRef) { // see if the pixelref already has an encoded version SkAutoDataUnref existingData(pixelRef->refEncodedData()); if (existingData.get() != NULL) { // Assumes that if the client did not set a serializer, they are // happy to get the encoded data. if (!fPixelSerializer || fPixelSerializer->useEncodedData(existingData->data(), existingData->size())) { write_encoded_bitmap(this, existingData, bitmap.pixelRefOrigin()); return; } } // see if the caller wants to manually encode SkAutoPixmapUnlock result; if (fPixelSerializer && bitmap.requestLock(&result)) { const SkPixmap& pmap = result.pixmap(); SkASSERT(NULL == fBitmapHeap); SkAutoDataUnref data(fPixelSerializer->encodePixels(pmap.info(), pmap.addr(), pmap.rowBytes())); if (data.get() != NULL) { // if we have to "encode" the bitmap, then we assume there is no // offset to share, since we are effectively creating a new pixelref write_encoded_bitmap(this, data, SkIPoint::Make(0, 0)); return; } } } this->writeUInt(0); // signal raw pixels SkBitmap::WriteRawPixels(this, bitmap); }