| Index: src/pipe/SkPipeReader.cpp
|
| diff --git a/src/pipe/SkPipeReader.cpp b/src/pipe/SkPipeReader.cpp
|
| index 2edc2dff20924f8913cd50b1726aeb6364196a15..e0ca3733a2b0505568c3c9b0e2c37e230ab4715e 100644
|
| --- a/src/pipe/SkPipeReader.cpp
|
| +++ b/src/pipe/SkPipeReader.cpp
|
| @@ -846,25 +846,6 @@ void SkPipeDeserializer::setTypefaceDeserializer(SkTypefaceDeserializer* tfd) {
|
| fImpl->fTFDeserializer = tfd;
|
| }
|
|
|
| -sk_sp<SkPicture> SkPipeDeserializer::readPicture(const void* data, size_t size) {
|
| - if (size < sizeof(uint32_t) + sizeof(SkRect)) {
|
| - return nullptr;
|
| - }
|
| -
|
| - uint32_t header;
|
| - memcpy(&header, data, 4); size -= 4; data = (const char*)data + 4;
|
| - if (kDefinePicture_ExtPipeVerb != header) {
|
| - return nullptr;
|
| - }
|
| - SkRect cull;
|
| - memcpy(&cull, data, sizeof(SkRect));
|
| - size -= sizeof(SkRect); data = (const char*)data + sizeof(SkRect);
|
| -
|
| - SkPictureRecorder recorder;
|
| - this->playback(data, size, recorder.beginRecording(cull));
|
| - return recorder.finishRecordingAsPicture();
|
| -}
|
| -
|
| 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);
|
| @@ -895,6 +876,36 @@ sk_sp<SkImage> SkPipeDeserializer::readImage(const void* data, size_t size) {
|
| return sk_ref_sp(fImpl->fImages.get(index - 1));
|
| }
|
|
|
| +sk_sp<SkPicture> SkPipeDeserializer::readPicture(const void* data, size_t size) {
|
| + if (size < sizeof(uint32_t)) {
|
| + SkDebugf("-------- data length too short for readPicture %d\n", size);
|
| + return nullptr;
|
| + }
|
| +
|
| + const uint32_t* ptr = (const uint32_t*)data;
|
| + uint32_t packedVerb = *ptr++;
|
| + size -= 4;
|
| +
|
| + if (SkPipeVerb::kDefinePicture == unpack_verb(packedVerb)) {
|
| + SkPipeInflator inflator(&fImpl->fImages, &fImpl->fPictures,
|
| + &fImpl->fTypefaces, &fImpl->fFactories,
|
| + fImpl->fTFDeserializer);
|
| + SkPipeReader reader(this, ptr, size);
|
| + reader.setInflator(&inflator);
|
| + definePicture_handler(reader, packedVerb, nullptr);
|
| + packedVerb = reader.read32(); // read the next verb
|
| + }
|
| + if (SkPipeVerb::kWritePicture != unpack_verb(packedVerb)) {
|
| + SkDebugf("-------- unexpected verb for readPicture %d\n", unpack_verb(packedVerb));
|
| + return nullptr;
|
| + }
|
| + int index = unpack_verb_extra(packedVerb);
|
| + if (0 == index) {
|
| + return nullptr; // writer failed
|
| + }
|
| + return sk_ref_sp(fImpl->fPictures.get(index - 1));
|
| +}
|
| +
|
| static bool do_playback(SkPipeReader& reader, SkCanvas* canvas, int* endPictureIndex) {
|
| int indent = 0;
|
|
|
|
|