| Index: src/core/SkWriteBuffer.cpp
|
| diff --git a/src/core/SkWriteBuffer.cpp b/src/core/SkWriteBuffer.cpp
|
| index c79d2758c763e8fa2c1170e4206ac4133ec058dd..6048c9f5c2c3ea8717b0222c070f3bb1b063d002 100644
|
| --- a/src/core/SkWriteBuffer.cpp
|
| +++ b/src/core/SkWriteBuffer.cpp
|
| @@ -20,8 +20,7 @@ SkWriteBuffer::SkWriteBuffer(uint32_t flags)
|
| , fFactorySet(NULL)
|
| , fNamedFactorySet(NULL)
|
| , fBitmapHeap(NULL)
|
| - , fTFSet(NULL)
|
| - , fBitmapEncoder(NULL) {
|
| + , fTFSet(NULL) {
|
| }
|
|
|
| SkWriteBuffer::SkWriteBuffer(void* storage, size_t storageSize, uint32_t flags)
|
| @@ -30,8 +29,7 @@ SkWriteBuffer::SkWriteBuffer(void* storage, size_t storageSize, uint32_t flags)
|
| , fNamedFactorySet(NULL)
|
| , fWriter(storage, storageSize)
|
| , fBitmapHeap(NULL)
|
| - , fTFSet(NULL)
|
| - , fBitmapEncoder(NULL) {
|
| + , fTFSet(NULL) {
|
| }
|
|
|
| SkWriteBuffer::~SkWriteBuffer() {
|
| @@ -172,7 +170,7 @@ void SkWriteBuffer::writeBitmap(const SkBitmap& bitmap) {
|
| // SkBitmapHeapReader to read the SkBitmap. False if the bitmap was serialized another way.
|
| this->writeBool(useBitmapHeap);
|
| if (useBitmapHeap) {
|
| - SkASSERT(NULL == fBitmapEncoder);
|
| + SkASSERT(NULL == fPixelSerializer);
|
| int32_t slot = fBitmapHeap->insert(bitmap);
|
| fWriter.write32(slot);
|
| // crbug.com/155875
|
| @@ -185,25 +183,33 @@ void SkWriteBuffer::writeBitmap(const SkBitmap& bitmap) {
|
| return;
|
| }
|
|
|
| - // see if the pixelref already has an encoded version
|
| - if (bitmap.pixelRef()) {
|
| - SkAutoDataUnref data(bitmap.pixelRef()->refEncodedData());
|
| - if (data.get() != NULL) {
|
| - write_encoded_bitmap(this, data, bitmap.pixelRefOrigin());
|
| - 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
|
| - if (fBitmapEncoder != NULL) {
|
| - SkASSERT(NULL == fBitmapHeap);
|
| - size_t offset = 0; // this parameter is deprecated/ignored
|
| - // if we have to "encode" the bitmap, then we assume there is no
|
| - // offset to share, since we are effectively creating a new pixelref
|
| - SkAutoDataUnref data(fBitmapEncoder(&offset, bitmap));
|
| - if (data.get() != NULL) {
|
| - write_encoded_bitmap(this, data, SkIPoint::Make(0, 0));
|
| - return;
|
| + // see if the caller wants to manually encode
|
| + if (fPixelSerializer) {
|
| + SkASSERT(NULL == fBitmapHeap);
|
| + SkAutoLockPixels alp(bitmap);
|
| + SkAutoDataUnref data(fPixelSerializer->encodePixels(bitmap.info(),
|
| + bitmap.getPixels(),
|
| + bitmap.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;
|
| + }
|
| }
|
| }
|
|
|
| @@ -245,14 +251,15 @@ SkRefCntSet* SkWriteBuffer::setTypefaceRecorder(SkRefCntSet* rec) {
|
| void SkWriteBuffer::setBitmapHeap(SkBitmapHeap* bitmapHeap) {
|
| SkRefCnt_SafeAssign(fBitmapHeap, bitmapHeap);
|
| if (bitmapHeap != NULL) {
|
| - SkASSERT(NULL == fBitmapEncoder);
|
| - fBitmapEncoder = NULL;
|
| + SkASSERT(NULL == fPixelSerializer);
|
| + fPixelSerializer.reset(NULL);
|
| }
|
| }
|
|
|
| -void SkWriteBuffer::setBitmapEncoder(SkPicture::EncodeBitmap bitmapEncoder) {
|
| - fBitmapEncoder = bitmapEncoder;
|
| - if (bitmapEncoder != NULL) {
|
| +void SkWriteBuffer::setPixelSerializer(SkPixelSerializer* serializer) {
|
| + fPixelSerializer.reset(serializer);
|
| + if (serializer) {
|
| + serializer->ref();
|
| SkASSERT(NULL == fBitmapHeap);
|
| SkSafeUnref(fBitmapHeap);
|
| fBitmapHeap = NULL;
|
|
|