diff options
author | Mike Reed <reed@google.com> | 2016-10-18 19:34:08 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2016-10-18 23:55:04 +0000 |
commit | 3ac64b427af596e4e8341857ce5f214bf0b49efb (patch) | |
tree | 09c15234a67f7e85fa42de8d0e029281ed3250ad /src/pipe/SkPipeReader.cpp | |
parent | 0290620b605a560c78508b58fdb8c8cef251d398 (diff) |
image serialize/deserialize callbacks in pipe
BUG=skia:
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=3607
Change-Id: I403fec72cacfc6a821f676f0afef390c89749a8b
Reviewed-on: https://skia-review.googlesource.com/3607
Commit-Queue: Mike Reed <reed@google.com>
Commit-Queue: Mike Klein <mtklein@google.com>
Reviewed-by: Mike Klein <mtklein@google.com>
Diffstat (limited to 'src/pipe/SkPipeReader.cpp')
-rw-r--r-- | src/pipe/SkPipeReader.cpp | 30 |
1 files changed, 23 insertions, 7 deletions
diff --git a/src/pipe/SkPipeReader.cpp b/src/pipe/SkPipeReader.cpp index 47d4072d06..8fa539e64d 100644 --- a/src/pipe/SkPipeReader.cpp +++ b/src/pipe/SkPipeReader.cpp @@ -27,12 +27,13 @@ class SkPipeInflator : public SkInflator { public: SkPipeInflator(SkRefSet<SkImage>* images, SkRefSet<SkPicture>* pictures, SkRefSet<SkTypeface>* typefaces, SkTDArray<SkFlattenable::Factory>* factories, - SkTypefaceDeserializer* tfd) + SkTypefaceDeserializer* tfd, SkImageDeserializer* imd) : fImages(images) , fPictures(pictures) , fTypefaces(typefaces) , fFactories(factories) , fTFDeserializer(tfd) + , fIMDeserializer(imd) {} SkImage* getImage(int index) override { @@ -76,8 +77,13 @@ public: void setTypefaceDeserializer(SkTypefaceDeserializer* tfd) { fTFDeserializer = tfd; } - + + void setImageDeserializer(SkImageDeserializer* imd) { + fIMDeserializer = imd; + } + sk_sp<SkTypeface> makeTypeface(const void* data, size_t size); + sk_sp<SkImage> makeImage(const sk_sp<SkData>&); private: SkRefSet<SkImage>* fImages; @@ -86,6 +92,7 @@ private: SkTDArray<SkFlattenable::Factory>* fFactories; SkTypefaceDeserializer* fTFDeserializer; + SkImageDeserializer* fIMDeserializer; }; /////////////////////////////////////////////////////////////////////////////////////////////////// @@ -677,7 +684,10 @@ static sk_sp<SkImage> make_from_skiaimageformat(const void* encoded, size_t enco return SkImage::MakeRasterData(info, pixels, width); } -static sk_sp<SkImage> make_from_encoded(const sk_sp<SkData>& data) { +sk_sp<SkImage> SkPipeInflator::makeImage(const sk_sp<SkData>& data) { + if (fIMDeserializer) { + return fIMDeserializer->deserialize(data->data(), data->size()); + } sk_sp<SkImage> image = make_from_skiaimageformat(data->data(), data->size()); if (!image) { image = SkImage::MakeFromEncoded(data); @@ -685,6 +695,7 @@ static sk_sp<SkImage> make_from_encoded(const sk_sp<SkData>& data) { return image; } + static void defineImage_handler(SkPipeReader& reader, uint32_t packedVerb, SkCanvas*) { SkASSERT(SkPipeVerb::kDefineImage == unpack_verb(packedVerb)); SkPipeInflator* inflator = (SkPipeInflator*)reader.getInflator(); @@ -697,7 +708,7 @@ static void defineImage_handler(SkPipeReader& reader, uint32_t packedVerb, SkCan } else { // we are defining a new image sk_sp<SkData> data = reader.readByteArrayAsData(); - sk_sp<SkImage> image = make_from_encoded(data); + sk_sp<SkImage> image = inflator->makeImage(data); if (!image) { SkDebugf("-- failed to decode\n"); } @@ -833,6 +844,7 @@ public: SkTDArray<SkFlattenable::Factory> fFactories; SkTypefaceDeserializer* fTFDeserializer = nullptr; + SkImageDeserializer* fIMDeserializer = nullptr; }; SkPipeDeserializer::SkPipeDeserializer() : fImpl(new Impl) {} @@ -842,6 +854,10 @@ void SkPipeDeserializer::setTypefaceDeserializer(SkTypefaceDeserializer* tfd) { fImpl->fTFDeserializer = tfd; } +void SkPipeDeserializer::setImageDeserializer(SkImageDeserializer* imd) { + fImpl->fIMDeserializer = imd; +} + sk_sp<SkImage> SkPipeDeserializer::readImage(const void* data, size_t size) { if (size < sizeof(uint32_t)) { SkDebugf("-------- data length too short for readImage %d\n", size); @@ -855,7 +871,7 @@ sk_sp<SkImage> SkPipeDeserializer::readImage(const void* data, size_t size) { if (SkPipeVerb::kDefineImage == unpack_verb(packedVerb)) { SkPipeInflator inflator(&fImpl->fImages, &fImpl->fPictures, &fImpl->fTypefaces, &fImpl->fFactories, - fImpl->fTFDeserializer); + fImpl->fTFDeserializer, fImpl->fIMDeserializer); SkPipeReader reader(this, ptr, size); reader.setInflator(&inflator); defineImage_handler(reader, packedVerb, nullptr); @@ -885,7 +901,7 @@ sk_sp<SkPicture> SkPipeDeserializer::readPicture(const void* data, size_t size) if (SkPipeVerb::kDefinePicture == unpack_verb(packedVerb)) { SkPipeInflator inflator(&fImpl->fImages, &fImpl->fPictures, &fImpl->fTypefaces, &fImpl->fFactories, - fImpl->fTFDeserializer); + fImpl->fTFDeserializer, fImpl->fIMDeserializer); SkPipeReader reader(this, ptr, size); reader.setInflator(&inflator); definePicture_handler(reader, packedVerb, nullptr); @@ -954,7 +970,7 @@ static bool do_playback(SkPipeReader& reader, SkCanvas* canvas, int* endPictureI bool SkPipeDeserializer::playback(const void* data, size_t size, SkCanvas* canvas) { SkPipeInflator inflator(&fImpl->fImages, &fImpl->fPictures, &fImpl->fTypefaces, &fImpl->fFactories, - fImpl->fTFDeserializer); + fImpl->fTFDeserializer, fImpl->fIMDeserializer); SkPipeReader reader(this, data, size); reader.setInflator(&inflator); return do_playback(reader, canvas); |