diff options
author | Mike Reed <reed@google.com> | 2017-12-13 08:22:13 -0500 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-12-13 13:41:32 +0000 |
commit | c8226728541fdd6434a7f1b97678246202b0edc5 (patch) | |
tree | 3443b3f2f2fb5408b3abe999390470ef0c35eff0 /tests | |
parent | 526c39f41f62f9ab82ebbeb30cc8762bb0eaa417 (diff) |
impl SkSerial picture procs
The picture serialization code is a bit of a mess, with duplicated functions for streams and buffers.
Could not see how to fix that and land this at the same time, but I will try to circle back and
simplify if possible afterwards.
Bug: skia:
Change-Id: I9053fdc476c60f483df013d021e248258181c199
Reviewed-on: https://skia-review.googlesource.com/83943
Reviewed-by: Florin Malita <fmalita@chromium.org>
Commit-Queue: Mike Reed <reed@google.com>
Diffstat (limited to 'tests')
-rw-r--r-- | tests/SerialProcsTest.cpp | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/tests/SerialProcsTest.cpp b/tests/SerialProcsTest.cpp index d975abb5db..0d13c035ec 100644 --- a/tests/SerialProcsTest.cpp +++ b/tests/SerialProcsTest.cpp @@ -9,6 +9,7 @@ #include "Resources.h" #include "sk_tool_utils.h" #include "SkCanvas.h" +#include "SkImageSource.h" #include "SkPicture.h" #include "SkPictureRecorder.h" #include "SkSerialProcs.h" @@ -81,3 +82,98 @@ DEF_TEST(serial_procs_image, reporter) { } } +/////////////////////////////////////////////////////////////////////////////////////////////////// + +static sk_sp<SkPicture> make_pic(const std::function<void(SkCanvas*)>& drawer) { + SkPictureRecorder rec; + drawer(rec.beginRecording(128, 128)); + return rec.finishRecordingAsPicture(); +} + +static SkSerialProcs makes(SkSerialPictureProc proc, void* ctx = nullptr) { + SkSerialProcs procs; + procs.fPictureProc = proc; + procs.fPictureCtx = ctx; + return procs; +} + +static SkDeserialProcs maked(SkDeserialPictureProc proc, const void* ctx = nullptr) { + SkDeserialProcs procs; + procs.fPictureProc = proc; + procs.fPictureCtx = const_cast<void*>(ctx); + return procs; +} + +// packages the picture's point in the skdata, and records it in the ctx as an array +struct Context { + SkTDArray<SkPicture*> fArray; + SkPicture* fSkipMe = nullptr; +}; + +static sk_sp<SkData> array_serial_proc(SkPicture* pic, void* ctx) { + Context* c = (Context*)ctx; + if (c->fSkipMe == pic) { + return nullptr; + } + *c->fArray.append() = pic; + return SkData::MakeWithCopy(&pic, sizeof(pic)); +} + +static sk_sp<SkPicture> array_deserial_proc(const void* data, size_t size, void* ctx) { + SkASSERT(sizeof(SkPicture*) == size); + + Context* c = (Context*)ctx; + SkPicture* pic; + memcpy(&pic, data, size); + + int index = c->fArray.find(pic); + SkASSERT(index >= 0); + c->fArray.removeShuffle(index); + + return sk_ref_sp(pic); +} + +static void test_pictures(skiatest::Reporter* reporter, sk_sp<SkPicture> p0, int count, + bool skipRoot) { + Context ctx; + if (skipRoot) { + ctx.fSkipMe = p0.get(); + } + + auto d0 = p0->serialize(makes(array_serial_proc, &ctx)); + REPORTER_ASSERT(reporter, ctx.fArray.count() == count); + p0 = SkPicture::MakeFromData(d0.get(), maked(array_deserial_proc, &ctx)); + REPORTER_ASSERT(reporter, ctx.fArray.count() == 0); +} + +DEF_TEST(serial_procs_picture, reporter) { + + auto p1 = make_pic([](SkCanvas* c) { + // need to be large enough that drawPictures doesn't "unroll" us + for (int i = 0; i < 20; ++i) { + c->drawColor(SK_ColorRED); + } + }); + + // now use custom serialization + auto p0 = make_pic([](SkCanvas* c) { c->drawColor(SK_ColorBLUE); }); + test_pictures(reporter, p0, 1, false); + + // test inside effect + p0 = make_pic([p1](SkCanvas* c) { + SkPaint paint; + SkShader::TileMode tm = SkShader::kClamp_TileMode; + paint.setShader(SkShader::MakePictureShader(p1, tm, tm, nullptr, nullptr)); + c->drawPaint(paint); + }); + test_pictures(reporter, p0, 1, true); + + // test nested picture + p0 = make_pic([p1](SkCanvas* c) { + c->drawColor(SK_ColorRED); + c->drawPicture(p1); + c->drawColor(SK_ColorBLUE); + }); + test_pictures(reporter, p0, 1, true); +} + |