aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar halcanary <halcanary@google.com>2015-12-07 12:42:24 -0800
committerGravatar Commit bot <commit-bot@chromium.org>2015-12-07 12:42:24 -0800
commit6b28017781b47ebd9c9c3f3a52561f05702d5e8a (patch)
tree889c60091de4879ac45d8986a000f9567d9e891b /src
parenta6f30479711942c4836923041863194864493634 (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.cpp5
-rw-r--r--src/image/SkImage.cpp16
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;