aboutsummaryrefslogtreecommitdiffhomepage
path: root/dm
diff options
context:
space:
mode:
authorGravatar reed <reed@google.com>2016-09-13 08:09:45 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2016-09-13 08:09:45 -0700
commit54dc4878b02765efea39e68b218df1e4bfff4b88 (patch)
tree296347d73c08b8b1d0a0b244ca062434ac48caa1 /dm
parent5f1d0f61ea182829826d9d76cb85346d3e23305d (diff)
add pipecanvas
Diffstat (limited to 'dm')
-rw-r--r--dm/DM.cpp2
-rw-r--r--dm/DMSrcSink.cpp26
-rw-r--r--dm/DMSrcSink.h15
3 files changed, 43 insertions, 0 deletions
diff --git a/dm/DM.cpp b/dm/DM.cpp
index a8fb43b30f..1598bcddea 100644
--- a/dm/DM.cpp
+++ b/dm/DM.cpp
@@ -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) {}