diff options
author | 2015-12-07 12:42:24 -0800 | |
---|---|---|
committer | 2015-12-07 12:42:24 -0800 | |
commit | 6b28017781b47ebd9c9c3f3a52561f05702d5e8a (patch) | |
tree | 889c60091de4879ac45d8986a000f9567d9e891b /src | |
parent | a6f30479711942c4836923041863194864493634 (diff) |
SkPixelSerializer: support indexed pixels
By taking a SkPixmap, SkPixelSerializer::encode() can now handle colortables.
Review URL: https://codereview.chromium.org/1501303002
Diffstat (limited to 'src')
-rw-r--r-- | src/core/SkWriteBuffer.cpp | 5 | ||||
-rw-r--r-- | src/image/SkImage.cpp | 16 |
2 files changed, 12 insertions, 9 deletions
diff --git a/src/core/SkWriteBuffer.cpp b/src/core/SkWriteBuffer.cpp index 1dfe0b3972..f8b3195403 100644 --- a/src/core/SkWriteBuffer.cpp +++ b/src/core/SkWriteBuffer.cpp @@ -200,11 +200,8 @@ void SkWriteBuffer::writeBitmap(const SkBitmap& bitmap) { // see if the caller wants to manually encode SkAutoPixmapUnlock result; if (fPixelSerializer && bitmap.requestLock(&result)) { - const SkPixmap& pmap = result.pixmap(); SkASSERT(nullptr == fBitmapHeap); - SkAutoDataUnref data(fPixelSerializer->encodePixels(pmap.info(), - pmap.addr(), - pmap.rowBytes())); + 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 diff --git a/src/image/SkImage.cpp b/src/image/SkImage.cpp index be837f28a8..7db5b4e0a8 100644 --- a/src/image/SkImage.cpp +++ b/src/image/SkImage.cpp @@ -185,9 +185,16 @@ protected: bool onUseEncodedData(const void *data, size_t len) override { return true; } - - SkData* onEncodePixels(const SkImageInfo& info, const void* pixels, size_t rowBytes) override { - return SkImageEncoder::EncodeData(info, pixels, rowBytes, SkImageEncoder::kPNG_Type, 100); + SkData* onEncode(const SkPixmap& pixmap) override { + SkBitmap bm; + if (!bm.installPixels(pixmap.info(), + const_cast<void*>(pixmap.addr()), + pixmap.rowBytes(), + pixmap.ctable(), + nullptr, nullptr)) { + return nullptr; + } + return SkImageEncoder::EncodeData(bm, SkImageEncoder::kPNG_Type, 100); } }; @@ -205,8 +212,7 @@ SkData* SkImage::encode(SkPixelSerializer* serializer) const { SkBitmap bm; SkAutoPixmapUnlock apu; if (as_IB(this)->getROPixels(&bm) && bm.requestLock(&apu)) { - const SkPixmap& pmap = apu.pixmap(); - return effectiveSerializer->encodePixels(pmap.info(), pmap.addr(), pmap.rowBytes()); + return effectiveSerializer->encode(apu.pixmap()); } return nullptr; |