diff options
author | 2015-05-05 08:11:33 -0700 | |
---|---|---|
committer | 2015-05-05 08:11:33 -0700 | |
commit | 06a22f618cd2adbbd33634a701b5cf8353886d63 (patch) | |
tree | fa86461a076666db9fe9c50bfd7224cf5e85d1c6 /dm/DMSrcSink.cpp | |
parent | 876f48b6cdae5a77770304ae77f42aff530fa90d (diff) |
add deferred config to DM
BUG=skia:
Review URL: https://codereview.chromium.org/1113273006
Diffstat (limited to 'dm/DMSrcSink.cpp')
-rw-r--r-- | dm/DMSrcSink.cpp | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/dm/DMSrcSink.cpp b/dm/DMSrcSink.cpp index 9811f9e426..b33ba14b66 100644 --- a/dm/DMSrcSink.cpp +++ b/dm/DMSrcSink.cpp @@ -10,6 +10,7 @@ #include "SkCommonFlags.h" #include "SkCodec.h" #include "SkData.h" +#include "SkDeferredCanvas.h" #include "SkDocument.h" #include "SkError.h" #include "SkImageGenerator.h" @@ -590,6 +591,41 @@ Error ViaPipe::draw(const Src& src, SkBitmap* bitmap, SkWStream* stream, SkStrin } /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +ViaDeferred::ViaDeferred(Sink* sink) : fSink(sink) {} + +Error ViaDeferred::draw(const Src& src, SkBitmap* bitmap, SkWStream* stream, SkString* log) const { + // We turn ourselves into another Src that draws our argument into a deferred canvas, + // via a surface created by the original canvas. We then draw a snapped image from that + // surface back into the original canvas. + struct ProxySrc : public Src { + const Src& fSrc; + ProxySrc(const Src& src) : fSrc(src) {} + + Error draw(SkCanvas* canvas) const override { + SkAutoTUnref<SkSurface> surface(canvas->newSurface(canvas->imageInfo())); + if (!surface.get()) { + return "can't make surface for deferred canvas"; + } + SkAutoTDelete<SkDeferredCanvas> defcan(SkDeferredCanvas::Create(surface)); + Error err = fSrc.draw(defcan); + if (!err.isEmpty()) { + return err; + } + SkAutoTUnref<SkImage> image(defcan->newImageSnapshot()); + if (!image) { + return "failed to create deferred image snapshot"; + } + canvas->drawImage(image, 0, 0, NULL); + return ""; + } + SkISize size() const override { return fSrc.size(); } + Name name() const override { sk_throw(); return ""; } // No one should be calling this. + } proxy(src); + return fSink->draw(proxy, bitmap, stream, log); +} + +/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ ViaSerialization::ViaSerialization(Sink* sink) : fSink(sink) {} |