aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/image
diff options
context:
space:
mode:
authorGravatar reed <reed@google.com>2015-09-28 08:58:53 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2015-09-28 08:58:53 -0700
commit13f48dc85aa68a60da66aaf39c93d527d11d1278 (patch)
tree38fdaad81ebc61ca125f7e1be4c97d39bdeb5fab /src/image
parent209c1624addaa7f7e63b79d286bd350342740a00 (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.cpp22
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;