aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Herb Derby <herb@google.com>2017-03-17 15:51:53 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-03-20 15:15:33 +0000
commit1a3c4b8cce9b6b4024bca8814be61c94cebabc19 (patch)
tree2e13080d4907317da2480737d1a66aa57e9c08fd
parent0dbf042fa50cc01b7447fbecbc3a98d8f3670026 (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.cpp2
-rw-r--r--samplecode/SampleApp.cpp2
-rw-r--r--src/utils/SkDeferredCanvas.cpp36
-rw-r--r--src/utils/SkDeferredCanvas.h17
-rw-r--r--tests/CanvasTest.cpp2
-rw-r--r--tools/dump_record.cpp3
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();
}