diff options
author | reed <reed@google.com> | 2016-09-13 08:09:45 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-09-13 08:09:45 -0700 |
commit | 54dc4878b02765efea39e68b218df1e4bfff4b88 (patch) | |
tree | 296347d73c08b8b1d0a0b244ca062434ac48caa1 /dm | |
parent | 5f1d0f61ea182829826d9d76cb85346d3e23305d (diff) |
add pipecanvas
BUG=skia:
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2201323003
Review-Url: https://codereview.chromium.org/2201323003
Diffstat (limited to 'dm')
-rw-r--r-- | dm/DM.cpp | 2 | ||||
-rw-r--r-- | dm/DMSrcSink.cpp | 26 | ||||
-rw-r--r-- | dm/DMSrcSink.h | 15 |
3 files changed, 43 insertions, 0 deletions
@@ -868,6 +868,7 @@ static Sink* create_sink(const SkCommandLineConfig* config) { SINK("f16", RasterSink, kRGBA_F16_SkColorType, srgbColorSpace->makeLinearGamma()); SINK("pdf", PDFSink); SINK("skp", SKPSink); + SINK("pipe", PipeSink); SINK("svg", SVGSink); SINK("null", NullSink); SINK("xps", XPSSink); @@ -880,6 +881,7 @@ static Sink* create_sink(const SkCommandLineConfig* config) { static Sink* create_via(const SkString& tag, Sink* wrapped) { #define VIA(t, via, ...) if (tag.equals(t)) { return new via(__VA_ARGS__); } VIA("lite", ViaLite, wrapped); + VIA("pipe", ViaPipe, wrapped); VIA("twice", ViaTwice, wrapped); VIA("serialize", ViaSerialization, wrapped); VIA("pic", ViaPicture, wrapped); diff --git a/dm/DMSrcSink.cpp b/dm/DMSrcSink.cpp index c3c8a7bc6e..6b330231d2 100644 --- a/dm/DMSrcSink.cpp +++ b/dm/DMSrcSink.cpp @@ -30,6 +30,7 @@ #include "SkOpts.h" #include "SkPictureData.h" #include "SkPictureRecorder.h" +#include "SkPipe.h" #include "SkRandom.h" #include "SkRecordDraw.h" #include "SkRecorder.h" @@ -1241,6 +1242,15 @@ Error XPSSink::draw(const Src& src, SkBitmap*, SkWStream* dst, SkString*) const } return draw_skdocument(src, doc.get(), dst); } + +/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +PipeSink::PipeSink() {} + +Error PipeSink::draw(const Src& src, SkBitmap*, SkWStream* dst, SkString*) const { + return src.draw(SkPipeSerializer().beginWrite(SkRect::Make(src.size()), dst)); +} + /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ SKPSink::SKPSink() {} @@ -1511,6 +1521,22 @@ Error ViaDefer::draw(const Src& src, SkBitmap* bitmap, SkWStream* stream, SkStri /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ +Error ViaPipe::draw(const Src& src, SkBitmap* bitmap, SkWStream* stream, SkString* log) const { + auto size = src.size(); + return draw_to_canvas(fSink, bitmap, stream, log, size, [&](SkCanvas* canvas) -> Error { + SkDynamicMemoryWStream tmpStream; + Error err = src.draw(SkPipeSerializer().beginWrite(SkRect::Make(size), &tmpStream)); + if (!err.isEmpty()) { + return err; + } + sk_sp<SkData> data = tmpStream.detachAsData(); + SkPipeDeserializer().playback(data->data(), data->size(), canvas); + return check_against_reference(bitmap, src, fSink); + }); +} + +/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + // Draw the Src into two pictures, then draw the second picture into the wrapped Sink. // This tests that any shortcuts we may take while recording that second picture are legal. Error ViaSecondPicture::draw( diff --git a/dm/DMSrcSink.h b/dm/DMSrcSink.h index 0e11633b18..dfc4955b5a 100644 --- a/dm/DMSrcSink.h +++ b/dm/DMSrcSink.h @@ -333,6 +333,15 @@ public: SinkFlags flags() const override { return SinkFlags{ SinkFlags::kVector, SinkFlags::kDirect }; } }; +class PipeSink : public Sink { +public: + PipeSink(); + + Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override; + const char* fileExtension() const override { return "skpipe"; } + SinkFlags flags() const override { return SinkFlags{ SinkFlags::kVector, SinkFlags::kDirect }; } +}; + class RasterSink : public Sink { public: explicit RasterSink(SkColorType, sk_sp<SkColorSpace> = nullptr); @@ -408,6 +417,12 @@ public: Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override; }; +class ViaPipe : public Via { +public: + explicit ViaPipe(Sink* sink) : Via(sink) {} + Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override; +}; + class ViaDefer : public Via { public: explicit ViaDefer(Sink* sink) : Via(sink) {} |