Index: bench/BezierBench.cpp |
diff --git a/bench/BezierBench.cpp b/bench/BezierBench.cpp |
new file mode 100755 |
index 0000000000000000000000000000000000000000..ec83d958bbd5920088cdff0f770826d4ff051261 |
--- /dev/null |
+++ b/bench/BezierBench.cpp |
@@ -0,0 +1,101 @@ |
+/* |
+ * 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 "SkPaint.h" |
+#include "SkString.h" |
+ |
+struct BezierRec { |
+ SkCanvas* fCanvas; |
+ SkPaint fPaint; |
+ SkPath fQuad; |
+ SkPath fCubic; |
+}; |
+ |
+typedef const char* (*DrawProc)(const BezierRec*, int); |
+ |
+static const char* draw_quad(const BezierRec* rec, int count) { |
+ if (rec) { |
+ SkCanvas* canvas = rec->fCanvas; |
+ const SkPaint& paint = rec->fPaint; |
+ const SkPath& path = rec->fQuad; |
+ for (int i = 0; i < count; ++i) { |
+ canvas->drawPath(path, paint); |
+ } |
+ } |
+ return "quad"; |
+} |
+ |
+static const char* draw_cubic(const BezierRec* rec, int count) { |
+ if (rec) { |
+ SkCanvas* canvas = rec->fCanvas; |
+ const SkPaint& paint = rec->fPaint; |
+ const SkPath& path = rec->fCubic; |
+ for (int i = 0; i < count; ++i) { |
+ canvas->drawPath(path, paint); |
+ } |
+ } |
+ return "cubic"; |
+} |
+ |
+class BezierBench : public Benchmark { |
+ SkString fName; |
+ SkPaint::Cap fCap; |
+ SkPaint::Join fJoin; |
+ BezierRec fRec; |
+ DrawProc fProc; |
+ SkScalar fWidth; |
+public: |
+ BezierBench(SkPaint::Cap c, SkPaint::Join j, SkScalar w, DrawProc proc) { |
+ static const char* gCapName[] = { |
+ "butt", "round", "square" |
+ }; |
+ static const char* gJoinName[] = { |
+ "miter", "round", "bevel" |
+ }; |
+ |
+ fCap = c; |
+ fJoin = j; |
+ fProc = proc; |
+ fWidth = SkIntToScalar(w); |
+ fName.printf("draw_stroke_bezier_%s_%s_%s_%g", proc(NULL, 0), gCapName[c], gJoinName[j], w); |
+ |
+ fRec.fQuad.moveTo(20, 20); |
+ fRec.fQuad.quadTo(60, 20, 60, 60); |
+ fRec.fQuad.quadTo(20, 60, 20, 100); |
+ fRec.fCubic.moveTo(20, 20); |
+ fRec.fCubic.cubicTo(40, 20, 60, 40, 60, 60); |
+ fRec.fCubic.cubicTo(40, 60, 20, 80, 20, 100); |
+ } |
+ |
+protected: |
+ virtual const char* onGetName() { |
+ return fName.c_str(); |
+ } |
+ |
+ virtual void onDraw(const int loops, SkCanvas* canvas) { |
+ fRec.fCanvas = canvas; |
+ this->setupPaint(&fRec.fPaint); |
+ fRec.fPaint.setStyle(SkPaint::kStroke_Style); |
+ fRec.fPaint.setStrokeCap(fCap); |
+ fRec.fPaint.setStrokeJoin(fJoin); |
+ fRec.fPaint.setStrokeWidth(fWidth); |
+ fProc(&fRec, loops); |
+ } |
+ |
+private: |
+ typedef Benchmark INHERITED; |
+}; |
+ |
+DEF_BENCH( return new BezierBench(SkPaint::kButt_Cap, SkPaint::kRound_Join, 2, draw_quad); ) |
+DEF_BENCH( return new BezierBench(SkPaint::kSquare_Cap, SkPaint::kBevel_Join, 10, draw_quad); ) |
+DEF_BENCH( return new BezierBench(SkPaint::kRound_Cap, SkPaint::kMiter_Join, 50, draw_quad); ) |
+ |
+DEF_BENCH( return new BezierBench(SkPaint::kButt_Cap, SkPaint::kRound_Join, 2, draw_cubic); ) |
+DEF_BENCH( return new BezierBench(SkPaint::kSquare_Cap, SkPaint::kBevel_Join, 10, draw_cubic); ) |
+DEF_BENCH( return new BezierBench(SkPaint::kRound_Cap, SkPaint::kMiter_Join, 50, draw_cubic); ) |