aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/pipe
diff options
context:
space:
mode:
authorGravatar reed <reed@google.com>2016-09-15 14:24:53 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2016-09-15 14:24:53 -0700
commit262052c9261a567f937ae05ade11ea7a3d280f4c (patch)
treec15137376759bec2e064d9ce1146a96c5e69a3eb /src/pipe
parent7bffcd2673015f04fd3e20785746be38dd81b566 (diff)
test/fix/tweak writePicture/readPicture
Diffstat (limited to 'src/pipe')
-rw-r--r--src/pipe/SkPipeCanvas.cpp29
-rw-r--r--src/pipe/SkPipeCanvas.h1
-rw-r--r--src/pipe/SkPipeFormat.h1
-rw-r--r--src/pipe/SkPipeReader.cpp49
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;