diff options
author | 2015-12-10 12:46:42 -0800 | |
---|---|---|
committer | 2015-12-10 12:46:42 -0800 | |
commit | 6bce4177cb72faac9c10d01d57e17168ae7ecadf (patch) | |
tree | 48935ded47606489c1ee8cb134383c384f55f8bd | |
parent | f2848b60358deb23eca38a4587247c1d2e335d30 (diff) |
DM: fix `--config $VIA-pdf` to not crash
Review URL: https://codereview.chromium.org/1513323002
-rw-r--r-- | dm/DM.cpp | 2 | ||||
-rw-r--r-- | dm/DMSrcSink.cpp | 42 | ||||
-rw-r--r-- | dm/DMSrcSink.h | 24 |
3 files changed, 41 insertions, 27 deletions
@@ -643,7 +643,7 @@ static Sink* create_sink(const char* tag) { } static Sink* create_via(const char* tag, Sink* wrapped) { -#define VIA(t, via, ...) if (0 == strcmp(t, tag)) { return new via(__VA_ARGS__); } +#define VIA(t, via, ...) if (0 == strcmp(t, tag)) { return new via(t, __VA_ARGS__); } VIA("twice", ViaTwice, wrapped); VIA("pipe", ViaPipe, wrapped); VIA("serialize", ViaSerialization, wrapped); diff --git a/dm/DMSrcSink.cpp b/dm/DMSrcSink.cpp index 2503dc35ce..1728ea8bc2 100644 --- a/dm/DMSrcSink.cpp +++ b/dm/DMSrcSink.cpp @@ -992,19 +992,21 @@ Error RasterSink::draw(const Src& src, SkBitmap* dst, SkWStream*, SkString*) con // passing the Sink draw() arguments, a size, and a function draws into an SkCanvas. // Several examples below. -static Error draw_to_canvas(Sink* sink, SkBitmap* bitmap, SkWStream* stream, SkString* log, +static Error draw_to_canvas(Name name, Sink* sink, SkBitmap* bitmap, SkWStream* stream, SkString* log, SkISize size, std::function<Error(SkCanvas*)> draw) { class ProxySrc : public Src { public: - ProxySrc(SkISize size, std::function<Error(SkCanvas*)> draw) : fSize(size), fDraw(draw) {} + ProxySrc(SkISize size, Name name, std::function<Error(SkCanvas*)> draw) + : fSize(size), fName(name), fDraw(draw) {} Error draw(SkCanvas* canvas) const override { return fDraw(canvas); } - Name name() const override { sk_throw(); return ""; } // Won't be called. + Name name() const override { return fName; } SkISize size() const override { return fSize; } private: SkISize fSize; + Name fName; std::function<Error(SkCanvas*)> fDraw; }; - return sink->draw(ProxySrc(size, draw), bitmap, stream, log); + return sink->draw(ProxySrc(size, name, draw), bitmap, stream, log); } /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ @@ -1016,12 +1018,13 @@ static SkISize auto_compute_translate(SkMatrix* matrix, int srcW, int srcH) { return SkISize::Make(SkScalarRoundToInt(bounds.width()), SkScalarRoundToInt(bounds.height())); } -ViaMatrix::ViaMatrix(SkMatrix matrix, Sink* sink) : Via(sink), fMatrix(matrix) {} +ViaMatrix::ViaMatrix(Name name, SkMatrix matrix, Sink* sink) : Via(name, sink), fMatrix(matrix) {} Error ViaMatrix::draw(const Src& src, SkBitmap* bitmap, SkWStream* stream, SkString* log) const { SkMatrix matrix = fMatrix; SkISize size = auto_compute_translate(&matrix, src.size().width(), src.size().height()); - return draw_to_canvas(fSink, bitmap, stream, log, size, [&](SkCanvas* canvas) { + Name name = this->decorateName(src); + return draw_to_canvas(name, fSink, bitmap, stream, log, size, [&](SkCanvas* canvas) { canvas->concat(matrix); return src.draw(canvas); }); @@ -1029,7 +1032,7 @@ Error ViaMatrix::draw(const Src& src, SkBitmap* bitmap, SkWStream* stream, SkStr // Undoes any flip or 90 degree rotate without changing the scale of the bitmap. // This should be pixel-preserving. -ViaUpright::ViaUpright(SkMatrix matrix, Sink* sink) : Via(sink), fMatrix(matrix) {} +ViaUpright::ViaUpright(Name name, SkMatrix matrix, Sink* sink) : Via(name, sink), fMatrix(matrix) {} Error ViaUpright::draw(const Src& src, SkBitmap* bitmap, SkWStream* stream, SkString* log) const { Error err = fSink->draw(src, bitmap, stream, log); @@ -1066,7 +1069,8 @@ Error ViaUpright::draw(const Src& src, SkBitmap* bitmap, SkWStream* stream, SkSt 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) { + Name name = this->decorateName(src); + return draw_to_canvas(name, fSink, bitmap, stream, log, size, [&](SkCanvas* canvas) { PipeController controller(canvas, &SkImageDecoder::DecodeMemory); SkGPipeWriter pipe; const uint32_t kFlags = 0; @@ -1075,7 +1079,8 @@ Error ViaPipe::draw(const Src& src, SkBitmap* bitmap, SkWStream* stream, SkStrin } Error ViaRemote::draw(const Src& src, SkBitmap* bitmap, SkWStream* stream, SkString* log) const { - return draw_to_canvas(fSink, bitmap, stream, log, src.size(), [&](SkCanvas* target) { + Name name = this->decorateName(src); + return draw_to_canvas(name, fSink, bitmap, stream, log, src.size(), [&](SkCanvas* target) { SkAutoTDelete<SkRemote::Encoder> decoder(SkRemote::NewDecoder(target)); SkAutoTDelete<SkRemote::Encoder> cache(fCache ? SkRemote::NewCachingEncoder(decoder) : nullptr); @@ -1103,8 +1108,9 @@ Error ViaSerialization::draw( pic->serialize(&wStream); SkAutoTDelete<SkStream> rStream(wStream.detachAsStream()); SkAutoTUnref<SkPicture> deserialized(SkPicture::CreateFromStream(rStream, &lazy_decode_bitmap)); + Name name = this->decorateName(src); - return draw_to_canvas(fSink, bitmap, stream, log, size, [&](SkCanvas* canvas) { + return draw_to_canvas(name, fSink, bitmap, stream, log, size, [&](SkCanvas* canvas) { canvas->drawPicture(deserialized); return ""; }); @@ -1112,8 +1118,8 @@ Error ViaSerialization::draw( /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ -ViaTiles::ViaTiles(int w, int h, SkBBHFactory* factory, Sink* sink) - : Via(sink) +ViaTiles::ViaTiles(Name name, int w, int h, SkBBHFactory* factory, Sink* sink) + : Via(name, sink) , fW(w) , fH(h) , fFactory(factory) {} @@ -1128,8 +1134,9 @@ Error ViaTiles::draw(const Src& src, SkBitmap* bitmap, SkWStream* stream, SkStri return err; } SkAutoTUnref<SkPicture> pic(recorder.endRecordingAsPicture()); + Name name = this->decorateName(src); - return draw_to_canvas(fSink, bitmap, stream, log, src.size(), [&](SkCanvas* canvas) { + return draw_to_canvas(name, fSink, bitmap, stream, log, src.size(), [&](SkCanvas* canvas) { const int xTiles = (size.width() + fW - 1) / fW, yTiles = (size.height() + fH - 1) / fH; SkMultiPictureDraw mpd(xTiles*yTiles); @@ -1171,7 +1178,8 @@ Error ViaTiles::draw(const Src& src, SkBitmap* bitmap, SkWStream* stream, SkStri Error ViaSecondPicture::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 { + Name name = this->decorateName(src); + return draw_to_canvas(name, fSink, bitmap, stream, log, size, [&](SkCanvas* canvas) -> Error { SkPictureRecorder recorder; SkAutoTUnref<SkPicture> pic; for (int i = 0; i < 2; i++) { @@ -1191,7 +1199,8 @@ Error ViaSecondPicture::draw( // Draw the Src twice. This can help exercise caching. Error ViaTwice::draw(const Src& src, SkBitmap* bitmap, SkWStream* stream, SkString* log) const { - return draw_to_canvas(fSink, bitmap, stream, log, src.size(), [&](SkCanvas* canvas) -> Error { + Name name = this->decorateName(src); + return draw_to_canvas(name, fSink, bitmap, stream, log, src.size(), [&](SkCanvas* canvas) -> Error { for (int i = 0; i < 2; i++) { SkAutoCanvasRestore acr(canvas, true/*save now*/); canvas->clear(SK_ColorTRANSPARENT); @@ -1243,7 +1252,8 @@ struct DrawsAsSingletonPictures { Error ViaSingletonPictures::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 { + Name name = this->decorateName(src); + return draw_to_canvas(name, fSink, bitmap, stream, log, size, [&](SkCanvas* canvas) -> Error { // Use low-level (Skia-private) recording APIs so we can read the SkRecord. SkRecord skr; SkRecorder recorder(&skr, size.width(), size.height()); diff --git a/dm/DMSrcSink.h b/dm/DMSrcSink.h index 6b644ecdf3..364a814f9d 100644 --- a/dm/DMSrcSink.h +++ b/dm/DMSrcSink.h @@ -289,21 +289,25 @@ public: class Via : public Sink { public: - explicit Via(Sink* sink) : fSink(sink) {} + explicit Via(Name name, Sink* sink) : fName(name), fSink(sink) {} const char* fileExtension() const override { return fSink->fileExtension(); } int enclave() const override { return fSink->enclave(); } + Name decorateName(const Src& src) const { + return SkStringPrintf("%s-%s", src.name().c_str(), fName.c_str()); + } SinkFlags flags() const override { SinkFlags flags = fSink->flags(); flags.approach = SinkFlags::kIndirect; return flags; } protected: + Name fName; SkAutoTDelete<Sink> fSink; }; class ViaMatrix : public Via { public: - ViaMatrix(SkMatrix, Sink*); + ViaMatrix(Name, SkMatrix, Sink*); Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override; private: const SkMatrix fMatrix; @@ -311,7 +315,7 @@ private: class ViaUpright : public Via { public: - ViaUpright(SkMatrix, Sink*); + ViaUpright(Name, SkMatrix, Sink*); Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override; private: const SkMatrix fMatrix; @@ -319,13 +323,13 @@ private: class ViaPipe : public Via { public: - explicit ViaPipe(Sink* sink) : Via(sink) {} + explicit ViaPipe(Name name, Sink* sink) : Via(name, sink) {} Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override; }; class ViaRemote : public Via { public: - ViaRemote(bool cache, Sink* sink) : Via(sink), fCache(cache) {} + ViaRemote(Name name, bool cache, Sink* sink) : Via(name, sink), fCache(cache) {} Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override; private: bool fCache; @@ -333,13 +337,13 @@ private: class ViaSerialization : public Via { public: - explicit ViaSerialization(Sink* sink) : Via(sink) {} + explicit ViaSerialization(Name name, Sink* sink) : Via(name, sink) {} Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override; }; class ViaTiles : public Via { public: - ViaTiles(int w, int h, SkBBHFactory*, Sink*); + ViaTiles(Name, int w, int h, SkBBHFactory*, Sink*); Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override; private: const int fW, fH; @@ -348,19 +352,19 @@ private: class ViaSecondPicture : public Via { public: - explicit ViaSecondPicture(Sink* sink) : Via(sink) {} + explicit ViaSecondPicture(Name name, Sink* sink) : Via(name, sink) {} Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override; }; class ViaSingletonPictures : public Via { public: - explicit ViaSingletonPictures(Sink* sink) : Via(sink) {} + explicit ViaSingletonPictures(Name name, Sink* sink) : Via(name, sink) {} Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override; }; class ViaTwice : public Via { public: - explicit ViaTwice(Sink* sink) : Via(sink) {} + explicit ViaTwice(Name name, Sink* sink) : Via(name, sink) {} Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override; }; |