diff options
author | reed <reed@google.com> | 2016-09-15 14:24:53 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-09-15 14:24:53 -0700 |
commit | 262052c9261a567f937ae05ade11ea7a3d280f4c (patch) | |
tree | c15137376759bec2e064d9ce1146a96c5e69a3eb /src/pipe | |
parent | 7bffcd2673015f04fd3e20785746be38dd81b566 (diff) |
test/fix/tweak writePicture/readPicture
BUG=skia:
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2347593004
Review-Url: https://codereview.chromium.org/2347593004
Diffstat (limited to 'src/pipe')
-rw-r--r-- | src/pipe/SkPipeCanvas.cpp | 29 | ||||
-rw-r--r-- | src/pipe/SkPipeCanvas.h | 1 | ||||
-rw-r--r-- | src/pipe/SkPipeFormat.h | 1 | ||||
-rw-r--r-- | src/pipe/SkPipeReader.cpp | 49 |
4 files changed, 54 insertions, 26 deletions
diff --git a/src/pipe/SkPipeCanvas.cpp b/src/pipe/SkPipeCanvas.cpp index 97c31ce57e..224451f2ca 100644 --- a/src/pipe/SkPipeCanvas.cpp +++ b/src/pipe/SkPipeCanvas.cpp @@ -1028,15 +1028,30 @@ void SkPipeSerializer::resetCache() { fImpl->fDeduper.resetCaches(); } -void SkPipeSerializer::write(SkPicture* picture, SkWStream* stream) { - stream->write32(kDefinePicture_ExtPipeVerb); - SkRect cull = picture->cullRect(); - stream->write(&cull.fLeft, sizeof(SkRect)); - picture->playback(this->beginWrite(cull, stream)); - this->endWrite(); +sk_sp<SkData> SkPipeSerializer::writeImage(SkImage* image) { + SkDynamicMemoryWStream stream; + this->writeImage(image, &stream); + return stream.detachAsData(); +} + +sk_sp<SkData> SkPipeSerializer::writePicture(SkPicture* picture) { + SkDynamicMemoryWStream stream; + this->writePicture(picture, &stream); + return stream.detachAsData(); +} + +void SkPipeSerializer::writePicture(SkPicture* picture, SkWStream* stream) { + int index = fImpl->fDeduper.findPicture(picture); + if (0 == index) { + // Try to define the picture + this->beginWrite(picture->cullRect(), stream); + index = fImpl->fDeduper.findOrDefinePicture(picture); + this->endWrite(); + } + stream->write32(pack_verb(SkPipeVerb::kWritePicture, index)); } -void SkPipeSerializer::write(SkImage* image, SkWStream* stream) { +void SkPipeSerializer::writeImage(SkImage* image, SkWStream* stream) { int index = fImpl->fDeduper.findImage(image); if (0 == index) { // Try to define the image diff --git a/src/pipe/SkPipeCanvas.h b/src/pipe/SkPipeCanvas.h index 8dbb83fe20..82e54fc131 100644 --- a/src/pipe/SkPipeCanvas.h +++ b/src/pipe/SkPipeCanvas.h @@ -66,6 +66,7 @@ public: // returns 0 if not found int findImage(SkImage* image) const { return fImages.find(image->uniqueID()); } + int findPicture(SkPicture* picture) const { return fPictures.find(picture->uniqueID()); } int findOrDefineImage(SkImage*) override; int findOrDefinePicture(SkPicture*) override; diff --git a/src/pipe/SkPipeFormat.h b/src/pipe/SkPipeFormat.h index 539d385fab..8f5c8282e4 100644 --- a/src/pipe/SkPipeFormat.h +++ b/src/pipe/SkPipeFormat.h @@ -57,6 +57,7 @@ enum class SkPipeVerb : uint8_t { kDefinePicture, // extra == 0 or forget_index + 1 (0 means we're defining a new picture) kEndPicture, // extra == picture_index kWriteImage, // extra == image_index + kWritePicture, // extra == picture_index }; enum PaintUsage { diff --git a/src/pipe/SkPipeReader.cpp b/src/pipe/SkPipeReader.cpp index 2edc2dff20..e0ca3733a2 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; |