diff options
author | Herb Derby <herb@google.com> | 2017-03-17 15:51:53 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-03-20 15:15:33 +0000 |
commit | 1a3c4b8cce9b6b4024bca8814be61c94cebabc19 (patch) | |
tree | 2e13080d4907317da2480737d1a66aa57e9c08fd | |
parent | 0dbf042fa50cc01b7447fbecbc3a98d8f3670026 (diff) |
Eager or Lazy evaluation of sub-drawings for SkDeferredCanvas.
Allow evaluation choice of Lazy or Eager evaluation for SkDeferredCanvas.
Eager is used for drawing to a non-recording canvas to reduce the number of
all operations.
Lazy is used for drawing to a recording canvas to reduce the amount decode/encode
that happens.
R=reed@google.com
Change-Id: I7837c4f6e5911c153e0796162e1170edbc34839e
Reviewed-on: https://skia-review.googlesource.com/9839
Commit-Queue: Herb Derby <herb@google.com>
Reviewed-by: Mike Reed <reed@google.com>
-rw-r--r-- | dm/DMSrcSink.cpp | 2 | ||||
-rw-r--r-- | samplecode/SampleApp.cpp | 2 | ||||
-rw-r--r-- | src/utils/SkDeferredCanvas.cpp | 36 | ||||
-rw-r--r-- | src/utils/SkDeferredCanvas.h | 17 | ||||
-rw-r--r-- | tests/CanvasTest.cpp | 2 | ||||
-rw-r--r-- | tools/dump_record.cpp | 3 |
6 files changed, 38 insertions, 24 deletions
diff --git a/dm/DMSrcSink.cpp b/dm/DMSrcSink.cpp index 14d5552789..eb9ba41d96 100644 --- a/dm/DMSrcSink.cpp +++ b/dm/DMSrcSink.cpp @@ -1661,7 +1661,7 @@ Error ViaPicture::draw(const Src& src, SkBitmap* bitmap, SkWStream* stream, SkSt Error ViaDefer::draw(const Src& src, SkBitmap* bitmap, SkWStream* stream, SkString* log) const { auto size = src.size(); return draw_to_canvas(fSink.get(), bitmap, stream, log, size, [&](SkCanvas* canvas) -> Error { - SkDeferredCanvas deferred(canvas); + SkDeferredCanvas deferred(canvas, SkDeferredCanvas::kEager); return src.draw(&deferred); }); } diff --git a/samplecode/SampleApp.cpp b/samplecode/SampleApp.cpp index 9d5ea0bf5e..79023a0b99 100644 --- a/samplecode/SampleApp.cpp +++ b/samplecode/SampleApp.cpp @@ -1088,7 +1088,7 @@ void SampleWindow::draw(SkCanvas* canvas) { if (kNo_Tiling == fTilingMode) { SkDebugfDumper dumper; SkDumpCanvas dump(&dumper); - SkDeferredCanvas deferred(canvas); + SkDeferredCanvas deferred(canvas, SkDeferredCanvas::kEager); SkCanvas* c = fUseDeferredCanvas ? &deferred : canvas; this->INHERITED::draw(c); // no looping or surfaces needed } else { diff --git a/src/utils/SkDeferredCanvas.cpp b/src/utils/SkDeferredCanvas.cpp index ecd5495e8f..975f496d3b 100644 --- a/src/utils/SkDeferredCanvas.cpp +++ b/src/utils/SkDeferredCanvas.cpp @@ -8,6 +8,7 @@ #include "SkDeferredCanvas.h" #include "SkDrawable.h" #include "SkPath.h" +#include "SkRSXform.h" #include "SkRRect.h" #include "SkSurface.h" #include "SkTextBlob.h" @@ -45,8 +46,11 @@ void SkDeferredCanvas::Rec::setConcat(const SkMatrix& m) { /////////////////////////////////////////////////////////////////////////////////////////////////// -SkDeferredCanvas::SkDeferredCanvas(SkCanvas* canvas) - : INHERITED(canvas->getBaseLayerSize().width(), canvas->getBaseLayerSize().height()) { +SkDeferredCanvas::SkDeferredCanvas(SkCanvas* canvas, EvalType evalType) + : INHERITED(canvas->getBaseLayerSize().width(), canvas->getBaseLayerSize().height()) + , fCanvas(nullptr) // must be here for reset to work. + , fEvalType(evalType) +{ this->reset(canvas); } @@ -493,23 +497,23 @@ void SkDeferredCanvas::onDrawTextBlob(const SkTextBlob* blob, SkScalar x, SkScal #include "SkCanvasPriv.h" void SkDeferredCanvas::onDrawPicture(const SkPicture* picture, const SkMatrix* matrix, const SkPaint* paint) { -#if 0 - SkAutoCanvasMatrixPaint acmp(this, matrix, paint, picture->cullRect()); - picture->playback(this); -#else - this->flush_before_saves(); - fCanvas->drawPicture(picture, matrix, paint); -#endif + if (kEager == fEvalType) { + SkAutoCanvasMatrixPaint acmp(this, matrix, paint, picture->cullRect()); + picture->playback(this); + } else { + this->flush_before_saves(); + fCanvas->drawPicture(picture, matrix, paint); + } } void SkDeferredCanvas::onDrawDrawable(SkDrawable* drawable, const SkMatrix* matrix) { - // TODO: investigate culling and applying concat to the matrix -#if 0 - drawable->draw(this, matrix); -#else - this->flush_before_saves(); - fCanvas->drawDrawable(drawable, matrix); -#endif + if (kEager == fEvalType) { + // TODO: investigate culling and applying concat to the matrix + drawable->draw(this, matrix); + } else { + this->flush_before_saves(); + fCanvas->drawDrawable(drawable, matrix); + } } void SkDeferredCanvas::onDrawAtlas(const SkImage* image, const SkRSXform xform[], diff --git a/src/utils/SkDeferredCanvas.h b/src/utils/SkDeferredCanvas.h index b2bae1b943..eb07965799 100644 --- a/src/utils/SkDeferredCanvas.h +++ b/src/utils/SkDeferredCanvas.h @@ -13,7 +13,15 @@ class SK_API SkDeferredCanvas : public SkNoDrawCanvas { public: - SkDeferredCanvas(SkCanvas* = nullptr); + enum EvalType {kEager, kLazy}; + // There are two strategies for evaluating of sub-drawings (pictures and drawables). + // * kEager - a sub-drawing is expanded using the using the SkDeferredCanvas. This has + // the advantage of optimizing the sub drawing, and is used when the underlying + // SkCanvas is drawing and not recording. + // * kLazy - a sub-drawing is not expanded, but passed directly to the underlying SkCanvas. + // This has the advantage of not expanding the sub drawing and then immediately + // re-encoding it, and is used for recording canvases. + SkDeferredCanvas(SkCanvas*, EvalType); ~SkDeferredCanvas() override; void reset(SkCanvas*); @@ -101,8 +109,6 @@ protected: class Iter; private: - SkCanvas* fCanvas{nullptr}; - enum Type { kSave_Type, kClipRect_Type, @@ -127,7 +133,6 @@ private: } void setConcat(const SkMatrix&); }; - SkTDArray<Rec> fRecs; void push_save(); void push_cliprect(const SkRect&); @@ -144,6 +149,10 @@ private: void internal_flush_translate(SkScalar* x, SkScalar* y, const SkRect* boundsOrNull); + SkTDArray<Rec> fRecs; + SkCanvas* fCanvas; + const EvalType fEvalType; + typedef SkNoDrawCanvas INHERITED; }; diff --git a/tests/CanvasTest.cpp b/tests/CanvasTest.cpp index f6b275fccc..cfdce628ca 100644 --- a/tests/CanvasTest.cpp +++ b/tests/CanvasTest.cpp @@ -741,7 +741,7 @@ DEF_TEST(DeferredCanvas, r) { SkDebugfDumper dumper; SkDumpCanvas dumpC(&dumper); - SkDeferredCanvas canvas(&dumpC); + SkDeferredCanvas canvas(&dumpC, SkDeferredCanvas::kEager); SkPaint paint; // paint.setShader(SkShader::MakeColorShader(SK_ColorRED)); diff --git a/tools/dump_record.cpp b/tools/dump_record.cpp index 98845e56ce..c1b87e7535 100644 --- a/tools/dump_record.cpp +++ b/tools/dump_record.cpp @@ -57,7 +57,8 @@ int main(int argc, char** argv) { } if (FLAGS_defer) { SkPictureRecorder recorder; - SkDeferredCanvas deferred(recorder.beginRecording(src->cullRect())); + SkDeferredCanvas deferred(recorder.beginRecording(src->cullRect()), + SkDeferredCanvas::kEager); src->playback(&deferred); src = recorder.finishRecordingAsPicture(); } |