Index: bench/HairlinePathBench.cpp |
diff --git a/bench/HairlinePathBench.cpp b/bench/HairlinePathBench.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..b9fe584b1aa6756df80d269131548b283c38dce3 |
--- /dev/null |
+++ b/bench/HairlinePathBench.cpp |
@@ -0,0 +1,238 @@ |
+/* |
+ * Copyright 2013 Google Inc. |
+ * |
+ * Use of this source code is governed by a BSD-style license that can be |
+ * found in the LICENSE file. |
+ */ |
+#include "SkBenchmark.h" |
+#include "SkCanvas.h" |
+#include "SkPaint.h" |
+#include "SkRandom.h" |
+#include "SkShader.h" |
+#include "SkString.h" |
+ |
+enum Flags { |
+ kBig_Flag = 1 << 0, |
+ kAA_Flag = 1 << 1 |
+}; |
+ |
+#define FLAGS00 Flags(0) |
+#define FLAGS01 Flags(kBig_Flag) |
+#define FLAGS10 Flags(kAA_Flag) |
+#define FLAGS11 Flags(kBig_Flag | kAA_Flag) |
+ |
+static const int points[] = { |
+ 10, 10, 15, 5, 20, 20, |
+ 30, 5, 25, 20, 15, 12, |
+ 21, 21, 30, 30, 12, 4, |
+ 32, 28, 20, 18, 12, 10 |
+}; |
+ |
+static const int kMaxPathSize = 10; |
+ |
+class HairlinePathBench : public SkBenchmark { |
+public: |
+ HairlinePathBench(void* param, Flags flags) : INHERITED(param), fFlags(flags) { |
+ fPaint.setStyle(SkPaint::kStroke_Style); |
+ fPaint.setStrokeWidth(SkIntToScalar(0)); |
+ } |
+ |
+ virtual void appendName(SkString*) = 0; |
+ virtual void makePath(SkPath*) = 0; |
+ |
+protected: |
+ virtual const char* onGetName() SK_OVERRIDE { |
+ fName.printf("path_hairline_%s_%s_", |
+ fFlags & kBig_Flag ? "big" : "small", |
+ fFlags & kAA_Flag ? "AA" : "noAA"); |
+ this->appendName(&fName); |
+ return fName.c_str(); |
+ } |
+ |
+ virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE { |
+ SkPaint paint(fPaint); |
+ this->setupPaint(&paint); |
+ |
+ paint.setAntiAlias(fFlags & kAA_Flag ? true : false); |
+ |
+ SkPath path; |
+ this->makePath(&path); |
+ if (fFlags & kBig_Flag) { |
+ SkMatrix m; |
+ m.setScale(SkIntToScalar(3), SkIntToScalar(3)); |
+ path.transform(m); |
+ } |
+ |
+ int count = N; |
+ for (int i = 0; i < count; i++) { |
+ canvas->drawPath(path, paint); |
+ } |
+ } |
+ |
+private: |
+ SkPaint fPaint; |
+ SkString fName; |
+ Flags fFlags; |
+ enum { N = SkBENCHLOOP(200) }; |
+ typedef SkBenchmark INHERITED; |
+}; |
+ |
+class LinePathBench : public HairlinePathBench { |
+public: |
+ LinePathBench(void* param, Flags flags) : INHERITED(param, flags) {} |
+ |
+ virtual void appendName(SkString* name) SK_OVERRIDE { |
+ name->append("line"); |
+ } |
+ virtual void makePath(SkPath* path) SK_OVERRIDE { |
+ SkRandom rand; |
+ int size = SK_ARRAY_COUNT(points); |
+ int hSize = size / 2; |
+ for (int i = 0; i < kMaxPathSize; ++i) { |
+ int xTrans = 10 + 40 * (i%(kMaxPathSize/2)); |
+ int yTrans = 0; |
+ if (i > kMaxPathSize/2 - 1) { |
+ yTrans = 40; |
+ } |
+ int base1 = 2 * rand.nextULessThan(hSize); |
+ int base2 = 2 * rand.nextULessThan(hSize); |
+ int base3 = 2 * rand.nextULessThan(hSize); |
+ path->moveTo(SkIntToScalar(points[base1] + xTrans), |
+ SkIntToScalar(points[base1+1] + yTrans)); |
+ path->lineTo(SkIntToScalar(points[base2] + xTrans), |
+ SkIntToScalar(points[base2+1] + yTrans)); |
+ path->lineTo(SkIntToScalar(points[base3] + xTrans), |
+ SkIntToScalar(points[base3+1] + yTrans)); |
+ } |
+ } |
+private: |
+ typedef HairlinePathBench INHERITED; |
+}; |
+ |
+class QuadPathBench : public HairlinePathBench { |
+public: |
+ QuadPathBench(void* param, Flags flags) : INHERITED(param, flags) {} |
+ |
+ virtual void appendName(SkString* name) SK_OVERRIDE { |
+ name->append("quad"); |
+ } |
+ virtual void makePath(SkPath* path) SK_OVERRIDE { |
+ SkRandom rand; |
+ int size = SK_ARRAY_COUNT(points); |
+ int hSize = size / 2; |
+ for (int i = 0; i < kMaxPathSize; ++i) { |
+ int xTrans = 10 + 40 * (i%(kMaxPathSize/2)); |
+ int yTrans = 0; |
+ if (i > kMaxPathSize/2 - 1) { |
+ yTrans = 40; |
+ } |
+ int base1 = 2 * rand.nextULessThan(hSize); |
+ int base2 = 2 * rand.nextULessThan(hSize); |
+ int base3 = 2 * rand.nextULessThan(hSize); |
+ path->moveTo(SkIntToScalar(points[base1] + xTrans), |
+ SkIntToScalar(points[base1+1] + yTrans)); |
+ path->quadTo(SkIntToScalar(points[base2] + xTrans), |
+ SkIntToScalar(points[base2+1] + yTrans), |
+ SkIntToScalar(points[base3] + xTrans), |
+ SkIntToScalar(points[base3+1] + yTrans)); |
+ } |
+ } |
+private: |
+ typedef HairlinePathBench INHERITED; |
+}; |
+ |
+class ConicPathBench : public HairlinePathBench { |
+public: |
+ ConicPathBench(void* param, Flags flags) : INHERITED(param, flags) {} |
+ |
+ virtual void appendName(SkString* name) SK_OVERRIDE { |
+ name->append("conic"); |
+ } |
+ virtual void makePath(SkPath* path) SK_OVERRIDE { |
+ SkRandom rand; |
+ SkRandom randWeight; |
+ int size = SK_ARRAY_COUNT(points); |
+ int hSize = size / 2; |
+ for (int i = 0; i < kMaxPathSize; ++i) { |
+ int xTrans = 10 + 40 * (i%(kMaxPathSize/2)); |
+ int yTrans = 0; |
+ if (i > kMaxPathSize/2 - 1) { |
+ yTrans = 40; |
+ } |
+ int base1 = 2 * rand.nextULessThan(hSize); |
+ int base2 = 2 * rand.nextULessThan(hSize); |
+ int base3 = 2 * rand.nextULessThan(hSize); |
+ float weight = randWeight.nextRangeF(0.0f, 2.0f); |
+ path->moveTo(SkIntToScalar(points[base1] + xTrans), |
+ SkIntToScalar(points[base1+1] + yTrans)); |
+ path->conicTo(SkIntToScalar(points[base2] + xTrans), |
+ SkIntToScalar(points[base2+1] + yTrans), |
+ SkIntToScalar(points[base3] + xTrans), |
+ SkIntToScalar(points[base3+1] + yTrans), |
+ weight); |
+ } |
+ } |
+private: |
+ typedef HairlinePathBench INHERITED; |
+}; |
+ |
+class CubicPathBench : public HairlinePathBench { |
+public: |
+ CubicPathBench(void* param, Flags flags) : INHERITED(param, flags) {} |
+ |
+ virtual void appendName(SkString* name) SK_OVERRIDE { |
+ name->append("cubic"); |
+ } |
+ virtual void makePath(SkPath* path) SK_OVERRIDE { |
+ SkRandom rand; |
+ int size = SK_ARRAY_COUNT(points); |
+ int hSize = size / 2; |
+ for (int i = 0; i < kMaxPathSize; ++i) { |
+ int xTrans = 10 + 40 * (i%(kMaxPathSize/2)); |
+ int yTrans = 0; |
+ if (i > kMaxPathSize/2 - 1) { |
+ yTrans = 40; |
+ } |
+ int base1 = 2 * rand.nextULessThan(hSize); |
+ int base2 = 2 * rand.nextULessThan(hSize); |
+ int base3 = 2 * rand.nextULessThan(hSize); |
+ int base4 = 2 * rand.nextULessThan(hSize); |
+ path->moveTo(SkIntToScalar(points[base1] + xTrans), |
+ SkIntToScalar(points[base1+1] + yTrans)); |
+ path->cubicTo(SkIntToScalar(points[base2] + xTrans), |
+ SkIntToScalar(points[base2+1] + yTrans), |
+ SkIntToScalar(points[base3] + xTrans), |
+ SkIntToScalar(points[base3+1] + yTrans), |
+ SkIntToScalar(points[base4] + xTrans), |
+ SkIntToScalar(points[base4+1] + yTrans)); |
+ } |
+ } |
+private: |
+ typedef HairlinePathBench INHERITED; |
+}; |
+ |
+// FLAG00 - no AA, small |
+// FLAG01 - no AA, small |
+// FLAG10 - AA, big |
+// FLAG11 - AA, big |
+ |
+DEF_BENCH( return new LinePathBench(p, FLAGS00); ) |
+DEF_BENCH( return new LinePathBench(p, FLAGS01); ) |
+DEF_BENCH( return new LinePathBench(p, FLAGS10); ) |
+DEF_BENCH( return new LinePathBench(p, FLAGS11); ) |
+ |
+DEF_BENCH( return new QuadPathBench(p, FLAGS00); ) |
+DEF_BENCH( return new QuadPathBench(p, FLAGS01); ) |
+DEF_BENCH( return new QuadPathBench(p, FLAGS10); ) |
+DEF_BENCH( return new QuadPathBench(p, FLAGS11); ) |
+ |
+// Don't have default path renderer for conics yet on GPU, so must use AA |
+// DEF_BENCH( return new ConicPathBench(p, FLAGS00); ) |
+// DEF_BENCH( return new ConicPathBench(p, FLAGS01); ) |
+DEF_BENCH( return new ConicPathBench(p, FLAGS10); ) |
+DEF_BENCH( return new ConicPathBench(p, FLAGS11); ) |
+ |
+DEF_BENCH( return new CubicPathBench(p, FLAGS00); ) |
+DEF_BENCH( return new CubicPathBench(p, FLAGS01); ) |
+DEF_BENCH( return new CubicPathBench(p, FLAGS10); ) |
+DEF_BENCH( return new CubicPathBench(p, FLAGS11); ) |