diff options
author | 2015-09-28 08:58:53 -0700 | |
---|---|---|
committer | 2015-09-28 08:58:53 -0700 | |
commit | 13f48dc85aa68a60da66aaf39c93d527d11d1278 (patch) | |
tree | 38fdaad81ebc61ca125f7e1be4c97d39bdeb5fab /src/image | |
parent | 209c1624addaa7f7e63b79d286bd350342740a00 (diff) |
change pixel-serializer to support reencoding existing data
Trying to evolve this interface so it can
- support rich set of backend-encoders (including ones like ETC1 that can cheaply convert to KXT
- allow for encoding images as well as bitmaps (e.g. for picture serialization)
- perhaps replace SkImageEncoder as an API (assuming we create a factory that returns a serializer given a format)
BUG=skia:
Review URL: https://codereview.chromium.org/1373683003
Diffstat (limited to 'src/image')
-rw-r--r-- | src/image/SkImage.cpp | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/src/image/SkImage.cpp b/src/image/SkImage.cpp index ee76a7ea39..240c06e63b 100644 --- a/src/image/SkImage.cpp +++ b/src/image/SkImage.cpp @@ -74,6 +74,14 @@ SkShader* SkImage::newShader(SkShader::TileMode tileX, } SkData* SkImage::encode(SkImageEncoder::Type type, int quality) const { + SkAutoDataUnref encoded(this->refEncoded()); + if (encoded) { + SkAutoDataUnref reencoded(SkImageEncoder::ReencodeData(encoded, type)); + if (reencoded) { + return reencoded.detach(); + } + } + SkBitmap bm; if (as_IB(this)->getROPixels(&bm)) { return SkImageEncoder::EncodeData(bm, type, quality); @@ -85,10 +93,6 @@ namespace { class DefaultSerializer : public SkPixelSerializer { 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); } @@ -101,15 +105,17 @@ SkData* SkImage::encode(SkPixelSerializer* serializer) const { SkPixelSerializer* effectiveSerializer = serializer ? serializer : &defaultSerializer; SkAutoTUnref<SkData> encoded(this->refEncoded()); - if (encoded && effectiveSerializer->useEncodedData(encoded->data(), encoded->size())) { - return encoded.detach(); + if (encoded) { + encoded.reset(effectiveSerializer->reencodeData(encoded)); + if (encoded) { + return encoded.detach(); + } } 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->encodePixels(apu.pixmap()); } return nullptr; |