Index: bench/PictureNestingBench.cpp |
diff --git a/bench/PictureNestingBench.cpp b/bench/PictureNestingBench.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..aecd7ed34503125a25af2a78f1e7edeffa72a2df |
--- /dev/null |
+++ b/bench/PictureNestingBench.cpp |
@@ -0,0 +1,163 @@ |
+/* |
+ * Copyright 2014 Google Inc. |
+ * |
+ * Use of this source code is governed by a BSD-style license that can be |
+ * found in the LICENSE file. |
+ */ |
+ |
+#include "Benchmark.h" |
+#include "SkCanvas.h" |
+#include "SkColor.h" |
+#include "SkNullCanvas.h" |
+#include "SkPaint.h" |
+#include "SkPicture.h" |
+#include "SkPictureRecorder.h" |
+#include "SkString.h" |
+ |
+class PictureNesting : public Benchmark { |
+public: |
+ PictureNesting(const char* name, int maxLevel, int maxPictureLevel) |
+ : fMaxLevel(maxLevel) |
+ , fMaxPictureLevel(maxPictureLevel) { |
+ |
+ fPaint.setColor(SK_ColorRED); |
+ fPaint.setAntiAlias(true); |
+ fPaint.setStyle(SkPaint::kStroke_Style); |
+ fName.printf("picture_nesting_%s_%d", name, |
+ this->sierpinsky(SkCreateNullCanvas(), 0, fPaint)); |
+ } |
+ |
+protected: |
+ virtual const char* onGetName() SK_OVERRIDE { |
+ return fName.c_str(); |
+ } |
+ |
+ void doDraw(SkCanvas* canvas) { |
+ SkIPoint canvasSize = onGetSize(); |
+ canvas->save(); |
+ canvas->scale(SkIntToScalar(canvasSize.x()), SkIntToScalar(canvasSize.y())); |
+ |
+ this->sierpinsky(canvas, 0, fPaint); |
+ |
+ canvas->restore(); |
+ } |
+ |
+ int sierpinsky(SkCanvas* canvas, int lvl, const SkPaint& paint) { |
+ if (++lvl > fMaxLevel) { |
+ return 0; |
+ } |
+ |
+ int pics = 0; |
+ bool recordPicture = lvl <= fMaxPictureLevel; |
+ SkPictureRecorder recorder; |
+ SkCanvas* c = canvas; |
+ |
+ if (recordPicture) { |
+ c = recorder.beginRecording(1, 1); |
+ pics++; |
+ } |
+ |
+ c->drawLine(0.5, 0, 0, 1, paint); |
+ c->drawLine(0.5, 0, 1, 1, paint); |
+ c->drawLine(0, 1, 1, 1, paint); |
+ |
+ c->save(); |
+ c->scale(0.5, 0.5); |
+ |
+ c->translate(0, 1); |
+ pics += this->sierpinsky(c, lvl, paint); |
+ |
+ c->translate(1, 0); |
+ pics += this->sierpinsky(c, lvl, paint); |
+ |
+ c->translate(-0.5, -1); |
+ pics += this->sierpinsky(c, lvl, paint); |
+ c->restore(); |
+ |
+ if (recordPicture) { |
+ SkAutoTUnref<SkPicture> picture(recorder.endRecording()); |
+ canvas->drawPicture(picture); |
+ } |
+ |
+ return pics; |
+ } |
+ |
+ int fMaxLevel; |
+ int fMaxPictureLevel; |
+ |
+private: |
+ SkString fName; |
+ SkPaint fPaint; |
+ |
+ typedef Benchmark INHERITED; |
+}; |
+ |
+class PictureNestingRecording : public PictureNesting { |
+public: |
+ PictureNestingRecording(int maxLevel, int maxPictureLevel) |
+ : INHERITED("recording", maxLevel, maxPictureLevel) { |
+ } |
+ |
+protected: |
+ virtual void onDraw(const int loops, SkCanvas* canvas) { |
+ SkIPoint canvasSize = onGetSize(); |
+ SkPictureRecorder recorder; |
+ |
+ for (int i = 0; i < loops; i++) { |
+ SkCanvas* c = recorder.beginRecording(SkIntToScalar(canvasSize.x()), |
+ SkIntToScalar(canvasSize.y())); |
+ this->doDraw(c); |
+ SkAutoTUnref<SkPicture> picture(recorder.endRecording()); |
+ } |
+ } |
+ |
+private: |
+ typedef PictureNesting INHERITED; |
+}; |
+ |
+class PictureNestingPlayback : public PictureNesting { |
+public: |
+ PictureNestingPlayback(int maxLevel, int maxPictureLevel) |
+ : INHERITED("playback", maxLevel, maxPictureLevel) { |
+ |
+ SkIPoint canvasSize = onGetSize(); |
+ SkPictureRecorder recorder; |
+ SkCanvas* c = recorder.beginRecording(SkIntToScalar(canvasSize.x()), |
+ SkIntToScalar(canvasSize.y())); |
+ |
+ this->doDraw(c); |
+ fPicture.reset(recorder.endRecording()); |
+ } |
+ |
+protected: |
+ virtual void onDraw(const int loops, SkCanvas* canvas) { |
+ for (int i = 0; i < loops; i++) { |
+ canvas->drawPicture(fPicture); |
+ } |
+ } |
+ |
+private: |
+ SkAutoTUnref<SkPicture> fPicture; |
+ |
+ typedef PictureNesting INHERITED; |
+}; |
+ |
+DEF_BENCH( return new PictureNestingRecording(8, 0); ) |
+DEF_BENCH( return new PictureNestingRecording(8, 1); ) |
+DEF_BENCH( return new PictureNestingRecording(8, 2); ) |
+DEF_BENCH( return new PictureNestingRecording(8, 3); ) |
+DEF_BENCH( return new PictureNestingRecording(8, 4); ) |
+DEF_BENCH( return new PictureNestingRecording(8, 5); ) |
+DEF_BENCH( return new PictureNestingRecording(8, 6); ) |
+DEF_BENCH( return new PictureNestingRecording(8, 7); ) |
+DEF_BENCH( return new PictureNestingRecording(8, 8); ) |
+ |
+DEF_BENCH( return new PictureNestingPlayback(8, 0); ) |
+DEF_BENCH( return new PictureNestingPlayback(8, 1); ) |
+DEF_BENCH( return new PictureNestingPlayback(8, 2); ) |
+DEF_BENCH( return new PictureNestingPlayback(8, 3); ) |
+DEF_BENCH( return new PictureNestingPlayback(8, 4); ) |
+DEF_BENCH( return new PictureNestingPlayback(8, 5); ) |
+DEF_BENCH( return new PictureNestingPlayback(8, 6); ) |
+DEF_BENCH( return new PictureNestingPlayback(8, 7); ) |
+DEF_BENCH( return new PictureNestingPlayback(8, 8); ) |