aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar robertphillips@google.com <robertphillips@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2012-10-17 15:23:21 +0000
committerGravatar robertphillips@google.com <robertphillips@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2012-10-17 15:23:21 +0000
commitf6fc3fcadd343fad8d89d34749146d7e3c43d95b (patch)
tree6452e269e59b34cf45845129ba2d1e3f28a178dd
parentb2ad101313cfba9c06a3a4dc06531766bcbec73b (diff)
Add new bench to exercise SkPath::arcTo (arbroundrect)
-rw-r--r--bench/PathBench.cpp89
1 files changed, 89 insertions, 0 deletions
diff --git a/bench/PathBench.cpp b/bench/PathBench.cpp
index 12e456ab06..1bd0d891e9 100644
--- a/bench/PathBench.cpp
+++ b/bench/PathBench.cpp
@@ -671,6 +671,93 @@ private:
typedef SkBenchmark INHERITED;
};
+// Chrome creates its own round rects with each corner possibly being different
+class ArbRoundRectBench : public SkBenchmark {
+protected:
+ SkString fName;
+
+ enum {
+ N = SkBENCHLOOP(100)
+ };
+public:
+ ArbRoundRectBench(void* param) : INHERITED(param) {
+ fName.printf("arbroundrect");
+ }
+
+protected:
+ virtual const char* onGetName() SK_OVERRIDE {
+ return fName.c_str();
+ }
+
+ static void add_corner_arc(SkPath* path, const SkRect& rect,
+ SkScalar xIn, SkScalar yIn,
+ int startAngle)
+ {
+
+ SkScalar rx = SkMinScalar(rect.width(), xIn);
+ SkScalar ry = SkMinScalar(rect.height(), yIn);
+
+ SkRect arcRect;
+ arcRect.set(-rx, -ry, rx, ry);
+ switch (startAngle) {
+ case 0:
+ arcRect.offset(rect.fRight - arcRect.fRight, rect.fBottom - arcRect.fBottom);
+ break;
+ case 90:
+ arcRect.offset(rect.fLeft - arcRect.fLeft, rect.fBottom - arcRect.fBottom);
+ break;
+ case 180:
+ arcRect.offset(rect.fLeft - arcRect.fLeft, rect.fTop - arcRect.fTop);
+ break;
+ case 270:
+ arcRect.offset(rect.fRight - arcRect.fRight, rect.fTop - arcRect.fTop);
+ break;
+ default:
+ break;
+ }
+
+ path->arcTo(arcRect, SkIntToScalar(startAngle), SkIntToScalar(90), false);
+ }
+
+ static void make_arb_round_rect(SkPath* path, const SkRect& r,
+ SkScalar xCorner, SkScalar yCorner) {
+ // we are lazy here and use the same x & y for each corner
+ add_corner_arc(path, r, xCorner, yCorner, 270);
+ add_corner_arc(path, r, xCorner, yCorner, 0);
+ add_corner_arc(path, r, xCorner, yCorner, 90);
+ add_corner_arc(path, r, xCorner, yCorner, 180);
+
+ // TODO: re-enable once arcTo convexity issue is resolved
+ //SkASSERT(path->isConvex());
+ }
+
+ virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
+ SkRandom rand;
+ SkRect r;
+
+ for (int i = 0; i < 5000; ++i) {
+ SkPaint paint;
+ paint.setColor(0xff000000 | rand.nextU());
+ paint.setAntiAlias(true);
+
+ SkScalar radius = rand.nextUScalar1() * 30;
+ r.fLeft = rand.nextUScalar1() * 300;
+ r.fTop = rand.nextUScalar1() * 300;
+ r.fRight = r.fLeft + 2 * radius;
+ r.fBottom = r.fTop + 2 * radius;
+
+ SkPath temp;
+
+ make_arb_round_rect(&temp, r, r.width() / 10, r.height() / 15);
+
+ canvas->drawPath(temp, paint);
+ }
+ }
+
+private:
+ typedef SkBenchmark INHERITED;
+};
+
static SkBenchmark* FactT00(void* p) { return new TrianglePathBench(p, FLAGS00); }
static SkBenchmark* FactT01(void* p) { return new TrianglePathBench(p, FLAGS01); }
static SkBenchmark* FactT10(void* p) { return new TrianglePathBench(p, FLAGS10); }
@@ -770,3 +857,5 @@ static BenchRegistry gRegReverseTo(FactReverseTo);
static SkBenchmark* CirclesTest(void* p) { return new CirclesBench(p); }
static BenchRegistry gRegCirclesTest(CirclesTest);
+static SkBenchmark* ArbRoundRectTest(void* p) { return new ArbRoundRectBench(p); }
+static BenchRegistry gRegArbRoundRectTest(ArbRoundRectTest);