1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc.
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */
8f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina#include "Benchmark.h"
9d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com#include "SkBitmap.h"
10d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com#include "SkCanvas.h"
11d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com#include "SkColorPriv.h"
12d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com#include "SkPaint.h"
136e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com#include "SkRandom.h"
14d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com#include "SkShader.h"
15d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com#include "SkString.h"
1630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com#include "SkTArray.h"
1730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
18d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.comenum Flags {
19d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com    kStroke_Flag = 1 << 0,
20d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com    kBig_Flag    = 1 << 1
21d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com};
22d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com
23d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com#define FLAGS00  Flags(0)
24d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com#define FLAGS01  Flags(kStroke_Flag)
25d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com#define FLAGS10  Flags(kBig_Flag)
26d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com#define FLAGS11  Flags(kStroke_Flag | kBig_Flag)
27d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com
28f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass PathBench : public Benchmark {
29d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com    SkPaint     fPaint;
30d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com    SkString    fName;
31d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com    Flags       fFlags;
32d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.compublic:
33410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    PathBench(Flags flags) : fFlags(flags) {
34d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        fPaint.setStyle(flags & kStroke_Flag ? SkPaint::kStroke_Style :
35d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com                        SkPaint::kFill_Style);
36d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        fPaint.setStrokeWidth(SkIntToScalar(5));
37d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        fPaint.setStrokeJoin(SkPaint::kBevel_Join);
38d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com    }
39d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com
40d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com    virtual void appendName(SkString*) = 0;
41d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com    virtual void makePath(SkPath*) = 0;
426e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com    virtual int complexity() { return 0; }
43d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com
44d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.comprotected:
4536352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    const char* onGetName() override {
46d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        fName.printf("path_%s_%s_",
47d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com                     fFlags & kStroke_Flag ? "stroke" : "fill",
48d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com                     fFlags & kBig_Flag ? "big" : "small");
49d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        this->appendName(&fName);
50d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        return fName.c_str();
51d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com    }
52d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com
5336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onDraw(const int loops, SkCanvas* canvas) override {
54d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        SkPaint paint(fPaint);
55d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        this->setupPaint(&paint);
56d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com
57d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        SkPath path;
58d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        this->makePath(&path);
59d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        if (fFlags & kBig_Flag) {
601d24b8dfe9aac9cadaf3914b8574a4ff6e9bc19drobertphillips            const SkMatrix m = SkMatrix::MakeScale(SkIntToScalar(10), SkIntToScalar(10));
61d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com            path.transform(m);
62d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        }
63d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com
643361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        int count = loops;
65d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        if (fFlags & kBig_Flag) {
66d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com            count >>= 2;
67d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        }
686e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com        count >>= (3 * complexity());
69d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com
70d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        for (int i = 0; i < count; i++) {
71d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com            canvas->drawPath(path, paint);
72d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        }
73d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com    }
74d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com
75d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.comprivate:
76f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina    typedef Benchmark INHERITED;
77d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com};
78d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com
79d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.comclass TrianglePathBench : public PathBench {
80d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.compublic:
81410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    TrianglePathBench(Flags flags) : INHERITED(flags) {}
82fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
8336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void appendName(SkString* name) override {
84d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        name->append("triangle");
85d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com    }
8636352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void makePath(SkPath* path) override {
87d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        static const int gCoord[] = {
88d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com            10, 10, 15, 5, 20, 20
89d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        };
90d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        path->moveTo(SkIntToScalar(gCoord[0]), SkIntToScalar(gCoord[1]));
91d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        path->lineTo(SkIntToScalar(gCoord[2]), SkIntToScalar(gCoord[3]));
92d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        path->lineTo(SkIntToScalar(gCoord[4]), SkIntToScalar(gCoord[5]));
93d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        path->close();
94d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com    }
95d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.comprivate:
96d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com    typedef PathBench INHERITED;
97d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com};
98d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com
99d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.comclass RectPathBench : public PathBench {
100d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.compublic:
101410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    RectPathBench(Flags flags) : INHERITED(flags) {}
102fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
10336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void appendName(SkString* name) override {
104d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        name->append("rect");
105d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com    }
10636352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void makePath(SkPath* path) override {
107d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        SkRect r = { 10, 10, 20, 20 };
108d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        path->addRect(r);
109d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com    }
110d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.comprivate:
111d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com    typedef PathBench INHERITED;
112d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com};
113d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com
114d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.comclass OvalPathBench : public PathBench {
115d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.compublic:
116410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    OvalPathBench(Flags flags) : INHERITED(flags) {}
117fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
11836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void appendName(SkString* name) override {
119d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        name->append("oval");
120d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com    }
12136352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void makePath(SkPath* path) override {
122e2bfd8b7b17c7a66728883d6fb5f7b7639c73b90jvanverth@google.com        SkRect r = { 10, 10, 23, 20 };
123d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        path->addOval(r);
124d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com    }
125d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.comprivate:
126d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com    typedef PathBench INHERITED;
127d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com};
128d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com
1291647a1955fa44654102ae36df7af683bb8874175bsalomon@google.comclass CirclePathBench: public PathBench {
1301647a1955fa44654102ae36df7af683bb8874175bsalomon@google.compublic:
131410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    CirclePathBench(Flags flags) : INHERITED(flags) {}
1321647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com
13336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void appendName(SkString* name) override {
1341647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com        name->append("circle");
1351647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com    }
13636352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void makePath(SkPath* path) override {
1371647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com        path->addCircle(SkIntToScalar(20), SkIntToScalar(20),
1381647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com                        SkIntToScalar(10));
1391647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com    }
1401647a1955fa44654102ae36df7af683bb8874175bsalomon@google.comprivate:
1411647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com    typedef PathBench INHERITED;
1421647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com};
1431647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com
144d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.comclass SawToothPathBench : public PathBench {
145d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.compublic:
146410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    SawToothPathBench(Flags flags) : INHERITED(flags) {}
147fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
14836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void appendName(SkString* name) override {
149d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        name->append("sawtooth");
150d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com    }
151d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com    virtual void makePath(SkPath* path) {
152d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        SkScalar x = SkIntToScalar(20);
153d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        SkScalar y = SkIntToScalar(20);
154d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        const SkScalar x0 = x;
155d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        const SkScalar dx = SK_Scalar1 * 5;
156d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        const SkScalar dy = SK_Scalar1 * 10;
157d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com
158d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        path->moveTo(x, y);
159d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        for (int i = 0; i < 32; i++) {
160d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com            x += dx;
161d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com            path->lineTo(x, y - dy);
162d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com            x += dx;
163d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com            path->lineTo(x, y + dy);
164d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        }
165d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        path->lineTo(x, y + 2 * dy);
166d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        path->lineTo(x0, y + 2 * dy);
167d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        path->close();
168d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com    }
16936352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    int complexity() override { return 1; }
1706e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.comprivate:
1716e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com    typedef PathBench INHERITED;
1726e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com};
1736e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com
1746e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.comclass LongCurvedPathBench : public PathBench {
1756e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.compublic:
176410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    LongCurvedPathBench(Flags flags) : INHERITED(flags) {}
1776e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com
17836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void appendName(SkString* name) override {
1796e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com        name->append("long_curved");
1806e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com    }
18136352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void makePath(SkPath* path) override {
182e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org        SkRandom rand (12);
1836e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com        int i;
1846e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com        for (i = 0; i < 100; i++) {
1856e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com            path->quadTo(SkScalarMul(rand.nextUScalar1(), SkIntToScalar(640)),
1866e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com                         SkScalarMul(rand.nextUScalar1(), SkIntToScalar(480)),
1876e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com                         SkScalarMul(rand.nextUScalar1(), SkIntToScalar(640)),
1886e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com                         SkScalarMul(rand.nextUScalar1(), SkIntToScalar(480)));
1896e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com        }
1906e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com        path->close();
1916e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com    }
19236352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    int complexity() override { return 2; }
193d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.comprivate:
194d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com    typedef PathBench INHERITED;
195d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com};
196d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com
197e50f7361b4ee9fc8968e0e8a511379b3bf5f5123senorblanco@chromium.orgclass LongLinePathBench : public PathBench {
198e50f7361b4ee9fc8968e0e8a511379b3bf5f5123senorblanco@chromium.orgpublic:
199410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    LongLinePathBench(Flags flags) : INHERITED(flags) {}
200e50f7361b4ee9fc8968e0e8a511379b3bf5f5123senorblanco@chromium.org
20136352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void appendName(SkString* name) override {
202e50f7361b4ee9fc8968e0e8a511379b3bf5f5123senorblanco@chromium.org        name->append("long_line");
203e50f7361b4ee9fc8968e0e8a511379b3bf5f5123senorblanco@chromium.org    }
20436352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void makePath(SkPath* path) override {
205e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org        SkRandom rand;
206e50f7361b4ee9fc8968e0e8a511379b3bf5f5123senorblanco@chromium.org        path->moveTo(rand.nextUScalar1() * 640, rand.nextUScalar1() * 480);
207e50f7361b4ee9fc8968e0e8a511379b3bf5f5123senorblanco@chromium.org        for (size_t i = 1; i < 100; i++) {
208e50f7361b4ee9fc8968e0e8a511379b3bf5f5123senorblanco@chromium.org            path->lineTo(rand.nextUScalar1() * 640, rand.nextUScalar1() * 480);
209e50f7361b4ee9fc8968e0e8a511379b3bf5f5123senorblanco@chromium.org        }
210e50f7361b4ee9fc8968e0e8a511379b3bf5f5123senorblanco@chromium.org    }
21136352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    int complexity() override { return 2; }
212e50f7361b4ee9fc8968e0e8a511379b3bf5f5123senorblanco@chromium.orgprivate:
213e50f7361b4ee9fc8968e0e8a511379b3bf5f5123senorblanco@chromium.org    typedef PathBench INHERITED;
214e50f7361b4ee9fc8968e0e8a511379b3bf5f5123senorblanco@chromium.org};
2156e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com
216f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass RandomPathBench : public Benchmark {
21730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.compublic:
21836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    bool isSuitableFor(Backend backend) override {
219644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org        return backend == kNonRendering_Backend;
22030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    }
22130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
22230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comprotected:
22330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    void createData(int minVerbs,
22430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                    int maxVerbs,
22530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                    bool allowMoves = true,
22630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                    SkRect* bounds = NULL) {
22730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        SkRect tempBounds;
22830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        if (NULL == bounds) {
22930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com            tempBounds.setXYWH(0, 0, SK_Scalar1, SK_Scalar1);
23030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com            bounds = &tempBounds;
23130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        }
2326d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com        fVerbCnts.reset(kNumVerbCnts);
2336d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com        for (int i = 0; i < kNumVerbCnts; ++i) {
2346d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com            fVerbCnts[i] = fRandom.nextRangeU(minVerbs, maxVerbs + 1);
2356d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com        }
2366d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com        fVerbs.reset(kNumVerbs);
2376d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com        for (int i = 0; i < kNumVerbs; ++i) {
2386d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com            do {
2396d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com                fVerbs[i] = static_cast<SkPath::Verb>(fRandom.nextULessThan(SkPath::kDone_Verb));
2406d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com            } while (!allowMoves && SkPath::kMove_Verb == fVerbs[i]);
2416d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com        }
2426d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com        fPoints.reset(kNumPoints);
2436d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com        for (int i = 0; i < kNumPoints; ++i) {
2446d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com            fPoints[i].set(fRandom.nextRangeScalar(bounds->fLeft, bounds->fRight),
2456d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com                           fRandom.nextRangeScalar(bounds->fTop, bounds->fBottom));
24630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        }
24730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        this->restartMakingPaths();
24830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    }
24930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
25030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    void restartMakingPaths() {
25130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        fCurrPath = 0;
25230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        fCurrVerb = 0;
25330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        fCurrPoint = 0;
25430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    }
25530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
25630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    void makePath(SkPath* path) {
2576d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com        int vCount = fVerbCnts[(fCurrPath++) & (kNumVerbCnts - 1)];
25830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        for (int v = 0; v < vCount; ++v) {
2596d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com            int verb = fVerbs[(fCurrVerb++) & (kNumVerbs - 1)];
2606d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com            switch (verb) {
26130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                case SkPath::kMove_Verb:
2626d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com                    path->moveTo(fPoints[(fCurrPoint++) & (kNumPoints - 1)]);
26330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                    break;
26430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                case SkPath::kLine_Verb:
2656d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com                    path->lineTo(fPoints[(fCurrPoint++) & (kNumPoints - 1)]);
26630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                    break;
26730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                case SkPath::kQuad_Verb:
268373ebc634573364c27b1ebd35bb537ef1285cba4bsalomon@google.com                    path->quadTo(fPoints[(fCurrPoint + 0) & (kNumPoints - 1)],
269373ebc634573364c27b1ebd35bb537ef1285cba4bsalomon@google.com                                 fPoints[(fCurrPoint + 1) & (kNumPoints - 1)]);
270373ebc634573364c27b1ebd35bb537ef1285cba4bsalomon@google.com                    fCurrPoint += 2;
27130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                    break;
272277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com                case SkPath::kConic_Verb:
273277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com                    path->conicTo(fPoints[(fCurrPoint + 0) & (kNumPoints - 1)],
274277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com                                  fPoints[(fCurrPoint + 1) & (kNumPoints - 1)],
275277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com                                  SK_ScalarHalf);
276277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com                    fCurrPoint += 2;
277277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com                    break;
27830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                case SkPath::kCubic_Verb:
279373ebc634573364c27b1ebd35bb537ef1285cba4bsalomon@google.com                    path->cubicTo(fPoints[(fCurrPoint + 0) & (kNumPoints - 1)],
280373ebc634573364c27b1ebd35bb537ef1285cba4bsalomon@google.com                                  fPoints[(fCurrPoint + 1) & (kNumPoints - 1)],
281373ebc634573364c27b1ebd35bb537ef1285cba4bsalomon@google.com                                  fPoints[(fCurrPoint + 2) & (kNumPoints - 1)]);
282373ebc634573364c27b1ebd35bb537ef1285cba4bsalomon@google.com                    fCurrPoint += 3;
28330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                    break;
28430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                case SkPath::kClose_Verb:
28530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                    path->close();
28630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                    break;
28730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                default:
28830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                    SkDEBUGFAIL("Unexpected path verb");
28930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                    break;
29030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com            }
29130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        }
29230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    }
29330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
29430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    void finishedMakingPaths() {
2956d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com        fVerbCnts.reset(0);
2966d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com        fVerbs.reset(0);
2976d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com        fPoints.reset(0);
29830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    }
29930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
30030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comprivate:
3016d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com    enum {
3026d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com        // these should all be pow 2
303b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com        kNumVerbCnts = 1 << 5,
304b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com        kNumVerbs    = 1 << 5,
305b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com        kNumPoints   = 1 << 5,
3066d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com    };
3076d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com    SkAutoTArray<int>           fVerbCnts;
3086d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com    SkAutoTArray<SkPath::Verb>  fVerbs;
3096d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com    SkAutoTArray<SkPoint>       fPoints;
3106d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com    int                         fCurrPath;
3116d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com    int                         fCurrVerb;
3126d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com    int                         fCurrPoint;
313e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org    SkRandom                    fRandom;
314f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina    typedef Benchmark INHERITED;
31530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com};
31630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
31730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comclass PathCreateBench : public RandomPathBench {
31830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.compublic:
319410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    PathCreateBench()  {
32030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    }
32130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
32230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comprotected:
32336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    const char* onGetName() override {
32430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        return "path_create";
32530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    }
32630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
32736352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onPreDraw() override {
3286d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com        this->createData(10, 100);
32930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    }
33030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
33136352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onDraw(const int loops, SkCanvas*) override {
3323361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int i = 0; i < loops; ++i) {
3338f88117940ebb0a7f514194a4ad3384073c1f145commit-bot@chromium.org            if (i % 1000 == 0) {
3348f88117940ebb0a7f514194a4ad3384073c1f145commit-bot@chromium.org                fPath.reset();  // PathRef memory can grow without bound otherwise.
3358f88117940ebb0a7f514194a4ad3384073c1f145commit-bot@chromium.org            }
3368f88117940ebb0a7f514194a4ad3384073c1f145commit-bot@chromium.org            this->makePath(&fPath);
33730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        }
33830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        this->restartMakingPaths();
33930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    }
34030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
34130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comprivate:
3428f88117940ebb0a7f514194a4ad3384073c1f145commit-bot@chromium.org    SkPath fPath;
34330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
34430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    typedef RandomPathBench INHERITED;
34530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com};
34630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
34730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comclass PathCopyBench : public RandomPathBench {
34830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.compublic:
349410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    PathCopyBench()  {
35030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    }
35130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
35230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comprotected:
35336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    const char* onGetName() override {
35430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        return "path_copy";
35530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    }
35636352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onPreDraw() override {
3576d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com        this->createData(10, 100);
358b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com        fPaths.reset(kPathCnt);
359b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com        fCopies.reset(kPathCnt);
360b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com        for (int i = 0; i < kPathCnt; ++i) {
36130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com            this->makePath(&fPaths[i]);
36230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        }
36330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        this->finishedMakingPaths();
36430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    }
36536352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onDraw(const int loops, SkCanvas*) override {
3663361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int i = 0; i < loops; ++i) {
367b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com            int idx = i & (kPathCnt - 1);
368b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com            fCopies[idx] = fPaths[idx];
36930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        }
37030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    }
37130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
37230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comprivate:
373b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com    enum {
374b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com        // must be a pow 2
375b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com        kPathCnt = 1 << 5,
376b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com    };
377b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com    SkAutoTArray<SkPath> fPaths;
378b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com    SkAutoTArray<SkPath> fCopies;
37930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
38030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    typedef RandomPathBench INHERITED;
38130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com};
38230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
38330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comclass PathTransformBench : public RandomPathBench {
38430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.compublic:
385410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    PathTransformBench(bool inPlace) : fInPlace(inPlace) {}
38630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
38730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comprotected:
38836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    const char* onGetName() override {
38930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        return fInPlace ? "path_transform_in_place" : "path_transform_copy";
39030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    }
39130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
39236352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onPreDraw() override {
39330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        fMatrix.setScale(5 * SK_Scalar1, 6 * SK_Scalar1);
3946d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com        this->createData(10, 100);
395b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com        fPaths.reset(kPathCnt);
396b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com        for (int i = 0; i < kPathCnt; ++i) {
39730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com            this->makePath(&fPaths[i]);
39830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        }
399b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com        this->finishedMakingPaths();
40030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        if (!fInPlace) {
401b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com            fTransformed.reset(kPathCnt);
40230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        }
40330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    }
40430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
40536352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onDraw(const int loops, SkCanvas*) override {
40630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        if (fInPlace) {
4073361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org            for (int i = 0; i < loops; ++i) {
408b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com                fPaths[i & (kPathCnt - 1)].transform(fMatrix);
40930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com            }
41030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        } else {
4113361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org            for (int i = 0; i < loops; ++i) {
412b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com                int idx = i & (kPathCnt - 1);
413b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com                fPaths[idx].transform(fMatrix, &fTransformed[idx]);
41430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com            }
41530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        }
41630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    }
41730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
41830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comprivate:
419b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com    enum {
420b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com        // must be a pow 2
421b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com        kPathCnt = 1 << 5,
422b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com    };
423b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com    SkAutoTArray<SkPath> fPaths;
424b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com    SkAutoTArray<SkPath> fTransformed;
425b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com
42630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    SkMatrix fMatrix;
42730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    bool fInPlace;
42830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    typedef RandomPathBench INHERITED;
42930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com};
43030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
43130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comclass PathEqualityBench : public RandomPathBench {
43230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.compublic:
433410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    PathEqualityBench() { }
43430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
43530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comprotected:
43636352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    const char* onGetName() override {
43730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        return "path_equality_50%";
43830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    }
43930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
44036352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onPreDraw() override {
44130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        fParity = 0;
4426d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com        this->createData(10, 100);
443b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com        fPaths.reset(kPathCnt);
444b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com        fCopies.reset(kPathCnt);
445b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com        for (int i = 0; i < kPathCnt; ++i) {
44630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com            this->makePath(&fPaths[i]);
44730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com            fCopies[i] = fPaths[i];
44830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        }
44930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        this->finishedMakingPaths();
45030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    }
45130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
45236352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onDraw(const int loops, SkCanvas*) override {
4533361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int i = 0; i < loops; ++i) {
454b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com            int idx = i & (kPathCnt - 1);
455b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com            fParity ^= (fPaths[idx] == fCopies[idx & ~0x1]);
45630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        }
45730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    }
45830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
45930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comprivate:
46030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    bool fParity; // attempt to keep compiler from optimizing out the ==
461b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com    enum {
462b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com        // must be a pow 2
463b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com        kPathCnt = 1 << 5,
464b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com    };
465b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com    SkAutoTArray<SkPath> fPaths;
466b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com    SkAutoTArray<SkPath> fCopies;
46730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    typedef RandomPathBench INHERITED;
46830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com};
46930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
47030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comclass SkBench_AddPathTest : public RandomPathBench {
47130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.compublic:
47230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    enum AddType {
47330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        kAdd_AddType,
47430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        kAddTrans_AddType,
47530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        kAddMatrix_AddType,
47630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        kReverseAdd_AddType,
47730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        kReversePathTo_AddType,
47830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    };
47930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
480410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    SkBench_AddPathTest(AddType type) : fType(type) {
48130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        fMatrix.setRotate(60 * SK_Scalar1);
48230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    }
48330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
48430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comprotected:
48536352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    const char* onGetName() override {
48630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        switch (fType) {
48730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com            case kAdd_AddType:
48830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                return "path_add_path";
48930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com            case kAddTrans_AddType:
49030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                return "path_add_path_trans";
49130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com            case kAddMatrix_AddType:
49230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                return "path_add_path_matrix";
49330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com            case kReverseAdd_AddType:
49430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                return "path_reverse_add_path";
49530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com            case kReversePathTo_AddType:
49630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                return "path_reverse_path_to";
49730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com            default:
49830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                SkDEBUGFAIL("Bad add type");
49930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                return "";
50030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        }
50130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    }
50230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
50336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onPreDraw() override {
504a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org        // reversePathTo assumes a single contour path.
505a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org        bool allowMoves = kReversePathTo_AddType != fType;
5066d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com        this->createData(10, 100, allowMoves);
507b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com        fPaths0.reset(kPathCnt);
508b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com        fPaths1.reset(kPathCnt);
509b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com        for (int i = 0; i < kPathCnt; ++i) {
51030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com            this->makePath(&fPaths0[i]);
51130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com            this->makePath(&fPaths1[i]);
51230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        }
51330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        this->finishedMakingPaths();
51430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    }
51530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
51636352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onDraw(const int loops, SkCanvas*) override {
51730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        switch (fType) {
51830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com            case kAdd_AddType:
5193361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org                for (int i = 0; i < loops; ++i) {
520b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com                    int idx = i & (kPathCnt - 1);
521b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com                    SkPath result = fPaths0[idx];
522b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com                    result.addPath(fPaths1[idx]);
52330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                }
52430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                break;
52530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com            case kAddTrans_AddType:
5263361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org                for (int i = 0; i < loops; ++i) {
527b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com                    int idx = i & (kPathCnt - 1);
528b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com                    SkPath result = fPaths0[idx];
529b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com                    result.addPath(fPaths1[idx], 2 * SK_Scalar1, 5 * SK_Scalar1);
53030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                }
53130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                break;
53230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com            case kAddMatrix_AddType:
5333361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org                for (int i = 0; i < loops; ++i) {
534b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com                    int idx = i & (kPathCnt - 1);
535b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com                    SkPath result = fPaths0[idx];
536b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com                    result.addPath(fPaths1[idx], fMatrix);
53730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                }
53830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                break;
53930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com            case kReverseAdd_AddType:
5403361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org                for (int i = 0; i < loops; ++i) {
541b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com                    int idx = i & (kPathCnt - 1);
542b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com                    SkPath result = fPaths0[idx];
543b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com                    result.reverseAddPath(fPaths1[idx]);
54430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                }
54530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                break;
54630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com            case kReversePathTo_AddType:
5473361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org                for (int i = 0; i < loops; ++i) {
548b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com                    int idx = i & (kPathCnt - 1);
549b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com                    SkPath result = fPaths0[idx];
550b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com                    result.reversePathTo(fPaths1[idx]);
55130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                }
55230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                break;
55330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        }
55430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    }
55530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
55630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comprivate:
55730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    AddType fType; // or reverseAddPath
558b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com    enum {
559b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com        // must be a pow 2
560b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com        kPathCnt = 1 << 5,
561b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com    };
562b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com    SkAutoTArray<SkPath> fPaths0;
563b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com    SkAutoTArray<SkPath> fPaths1;
56430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    SkMatrix         fMatrix;
56530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    typedef RandomPathBench INHERITED;
56630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com};
5676e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com
56817bb458fe897411218d8c9781770948d4398b723robertphillips@google.com
569f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass CirclesBench : public Benchmark {
57017bb458fe897411218d8c9781770948d4398b723robertphillips@google.comprotected:
57117bb458fe897411218d8c9781770948d4398b723robertphillips@google.com    SkString            fName;
57246d3d39e65e0b3ea2ad7c91c176ccafb4df0fa24jvanverth@google.com    Flags               fFlags;
57317bb458fe897411218d8c9781770948d4398b723robertphillips@google.com
57417bb458fe897411218d8c9781770948d4398b723robertphillips@google.compublic:
575410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    CirclesBench(Flags flags) : fFlags(flags) {
57646d3d39e65e0b3ea2ad7c91c176ccafb4df0fa24jvanverth@google.com        fName.printf("circles_%s", fFlags & kStroke_Flag ? "stroke" : "fill");
57717bb458fe897411218d8c9781770948d4398b723robertphillips@google.com    }
57817bb458fe897411218d8c9781770948d4398b723robertphillips@google.com
57917bb458fe897411218d8c9781770948d4398b723robertphillips@google.comprotected:
58036352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    const char* onGetName() override {
58117bb458fe897411218d8c9781770948d4398b723robertphillips@google.com        return fName.c_str();
58217bb458fe897411218d8c9781770948d4398b723robertphillips@google.com    }
58317bb458fe897411218d8c9781770948d4398b723robertphillips@google.com
58436352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onDraw(const int loops, SkCanvas* canvas) override {
58517bb458fe897411218d8c9781770948d4398b723robertphillips@google.com        SkPaint paint;
58617bb458fe897411218d8c9781770948d4398b723robertphillips@google.com
58717bb458fe897411218d8c9781770948d4398b723robertphillips@google.com        paint.setColor(SK_ColorBLACK);
58817bb458fe897411218d8c9781770948d4398b723robertphillips@google.com        paint.setAntiAlias(true);
58946d3d39e65e0b3ea2ad7c91c176ccafb4df0fa24jvanverth@google.com        if (fFlags & kStroke_Flag) {
59046d3d39e65e0b3ea2ad7c91c176ccafb4df0fa24jvanverth@google.com            paint.setStyle(SkPaint::kStroke_Style);
59146d3d39e65e0b3ea2ad7c91c176ccafb4df0fa24jvanverth@google.com        }
59217bb458fe897411218d8c9781770948d4398b723robertphillips@google.com
593e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org        SkRandom rand;
59417bb458fe897411218d8c9781770948d4398b723robertphillips@google.com
59517bb458fe897411218d8c9781770948d4398b723robertphillips@google.com        SkRect r;
59617bb458fe897411218d8c9781770948d4398b723robertphillips@google.com
5973361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int i = 0; i < loops; ++i) {
59817bb458fe897411218d8c9781770948d4398b723robertphillips@google.com            SkScalar radius = rand.nextUScalar1() * 3;
59917bb458fe897411218d8c9781770948d4398b723robertphillips@google.com            r.fLeft = rand.nextUScalar1() * 300;
60017bb458fe897411218d8c9781770948d4398b723robertphillips@google.com            r.fTop =  rand.nextUScalar1() * 300;
60117bb458fe897411218d8c9781770948d4398b723robertphillips@google.com            r.fRight =  r.fLeft + 2 * radius;
60217bb458fe897411218d8c9781770948d4398b723robertphillips@google.com            r.fBottom = r.fTop + 2 * radius;
60317bb458fe897411218d8c9781770948d4398b723robertphillips@google.com
60446d3d39e65e0b3ea2ad7c91c176ccafb4df0fa24jvanverth@google.com            if (fFlags & kStroke_Flag) {
60546d3d39e65e0b3ea2ad7c91c176ccafb4df0fa24jvanverth@google.com                paint.setStrokeWidth(rand.nextUScalar1() * 5.0f);
60646d3d39e65e0b3ea2ad7c91c176ccafb4df0fa24jvanverth@google.com            }
60746d3d39e65e0b3ea2ad7c91c176ccafb4df0fa24jvanverth@google.com
60817bb458fe897411218d8c9781770948d4398b723robertphillips@google.com            SkPath temp;
60917bb458fe897411218d8c9781770948d4398b723robertphillips@google.com
61017bb458fe897411218d8c9781770948d4398b723robertphillips@google.com            // mimic how Chrome does circles
61117bb458fe897411218d8c9781770948d4398b723robertphillips@google.com            temp.arcTo(r, 0, 0, false);
61217bb458fe897411218d8c9781770948d4398b723robertphillips@google.com            temp.addOval(r, SkPath::kCCW_Direction);
61317bb458fe897411218d8c9781770948d4398b723robertphillips@google.com            temp.arcTo(r, 360, 0, true);
61417bb458fe897411218d8c9781770948d4398b723robertphillips@google.com            temp.close();
615fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
61617bb458fe897411218d8c9781770948d4398b723robertphillips@google.com            canvas->drawPath(temp, paint);
61717bb458fe897411218d8c9781770948d4398b723robertphillips@google.com        }
61817bb458fe897411218d8c9781770948d4398b723robertphillips@google.com    }
61917bb458fe897411218d8c9781770948d4398b723robertphillips@google.com
62017bb458fe897411218d8c9781770948d4398b723robertphillips@google.comprivate:
621f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina    typedef Benchmark INHERITED;
62217bb458fe897411218d8c9781770948d4398b723robertphillips@google.com};
62317bb458fe897411218d8c9781770948d4398b723robertphillips@google.com
62446d3d39e65e0b3ea2ad7c91c176ccafb4df0fa24jvanverth@google.com
625158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com// Chrome creates its own round rects with each corner possibly being different.
626158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com// In its "zero radius" incarnation it creates degenerate round rects.
6271e34ff7030c95a96c3cd5940de9b4dda4e1cef86skia.committer@gmail.com// Note: PathTest::test_arb_round_rect_is_convex and
628158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com// test_arb_zero_rad_round_rect_is_rect perform almost exactly
629b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com// the same test (but with no drawing)
630f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass ArbRoundRectBench : public Benchmark {
631f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.comprotected:
632f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com    SkString            fName;
633f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com
634f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.compublic:
635410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    ArbRoundRectBench(bool zeroRad) : fZeroRad(zeroRad) {
636158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com        if (zeroRad) {
637158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com            fName.printf("zeroradroundrect");
638158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com        } else {
639158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com            fName.printf("arbroundrect");
640158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com        }
641f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com    }
642f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com
643f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.comprotected:
64436352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    const char* onGetName() override {
645f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com        return fName.c_str();
646f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com    }
647f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com
648989a95ea77230e8347da18876e1bd5f39a78ebb5skia.committer@gmail.com    static void add_corner_arc(SkPath* path, const SkRect& rect,
649989a95ea77230e8347da18876e1bd5f39a78ebb5skia.committer@gmail.com                               SkScalar xIn, SkScalar yIn,
650f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com                               int startAngle)
651f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com    {
652f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com
653f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com        SkScalar rx = SkMinScalar(rect.width(), xIn);
654f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com        SkScalar ry = SkMinScalar(rect.height(), yIn);
655f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com
656f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com        SkRect arcRect;
657f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com        arcRect.set(-rx, -ry, rx, ry);
658f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com        switch (startAngle) {
659f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com        case 0:
660f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com            arcRect.offset(rect.fRight - arcRect.fRight, rect.fBottom - arcRect.fBottom);
661f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com            break;
662f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com        case 90:
663f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com            arcRect.offset(rect.fLeft - arcRect.fLeft, rect.fBottom - arcRect.fBottom);
664f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com            break;
665f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com        case 180:
666f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com            arcRect.offset(rect.fLeft - arcRect.fLeft, rect.fTop - arcRect.fTop);
667f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com            break;
668f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com        case 270:
669f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com            arcRect.offset(rect.fRight - arcRect.fRight, rect.fTop - arcRect.fTop);
670f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com            break;
671f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com        default:
672f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com            break;
673f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com        }
674f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com
675f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com        path->arcTo(arcRect, SkIntToScalar(startAngle), SkIntToScalar(90), false);
676f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com    }
677f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com
678989a95ea77230e8347da18876e1bd5f39a78ebb5skia.committer@gmail.com    static void make_arb_round_rect(SkPath* path, const SkRect& r,
679f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com                                    SkScalar xCorner, SkScalar yCorner) {
680f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com        // we are lazy here and use the same x & y for each corner
681f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com        add_corner_arc(path, r, xCorner, yCorner, 270);
682f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com        add_corner_arc(path, r, xCorner, yCorner, 0);
683f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com        add_corner_arc(path, r, xCorner, yCorner, 90);
684f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com        add_corner_arc(path, r, xCorner, yCorner, 180);
685158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com        path->close();
686f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com
687b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com        SkASSERT(path->isConvex());
688f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com    }
689f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com
69036352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onDraw(const int loops, SkCanvas* canvas) override {
691e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org        SkRandom rand;
692f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com        SkRect r;
693f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com
6943361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int i = 0; i < loops; ++i) {
695f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com            SkPaint paint;
696f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com            paint.setColor(0xff000000 | rand.nextU());
697f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com            paint.setAntiAlias(true);
698f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com
699158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com            SkScalar size = rand.nextUScalar1() * 30;
700158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com            if (size < SK_Scalar1) {
701b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com                continue;
702b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com            }
703f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com            r.fLeft = rand.nextUScalar1() * 300;
704f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com            r.fTop =  rand.nextUScalar1() * 300;
705158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com            r.fRight =  r.fLeft + 2 * size;
706158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com            r.fBottom = r.fTop + 2 * size;
707f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com
708f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com            SkPath temp;
709f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com
710158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com            if (fZeroRad) {
711158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com                make_arb_round_rect(&temp, r, 0, 0);
712158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com
713158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com                SkASSERT(temp.isRect(NULL));
714158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com            } else {
715158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com                make_arb_round_rect(&temp, r, r.width() / 10, r.height() / 15);
716158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com            }
717f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com
718f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com            canvas->drawPath(temp, paint);
719f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com        }
720f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com    }
721f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com
722f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.comprivate:
723158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com    bool fZeroRad;      // should 0 radius rounds rects be tested?
724158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com
725f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina    typedef Benchmark INHERITED;
726f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com};
727f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com
728f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass ConservativelyContainsBench : public Benchmark {
7299bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.compublic:
7309bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com    enum Type {
7319bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com        kRect_Type,
7329bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com        kRoundRect_Type,
7339bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com        kOval_Type,
7349bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com    };
7359bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com
736410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    ConservativelyContainsBench(Type type)  {
7379bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com        fParity = false;
7389bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com        fName = "conservatively_contains_";
7399bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com        switch (type) {
7409bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com            case kRect_Type:
7419bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com                fName.append("rect");
7429bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com                fPath.addRect(kBaseRect);
7439bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com                break;
7449bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com            case kRoundRect_Type:
7459bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com                fName.append("round_rect");
7469bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com                fPath.addRoundRect(kBaseRect, kRRRadii[0], kRRRadii[1]);
7479bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com                break;
7489bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com            case kOval_Type:
7499bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com                fName.append("oval");
7509bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com                fPath.addOval(kBaseRect);
7519bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com                break;
7529bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com        }
7539bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com    }
7549bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com
75536352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    bool isSuitableFor(Backend backend) override {
756644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org        return backend == kNonRendering_Backend;
757644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org    }
758644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org
7599bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.comprivate:
76036352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    const char* onGetName() override {
7619bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com        return fName.c_str();
7629bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com    }
7639bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com
76436352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onDraw(const int loops, SkCanvas*) override {
7653361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int i = 0; i < loops; ++i) {
7669bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com            const SkRect& rect = fQueryRects[i % kQueryRectCnt];
7679bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com            fParity = fParity != fPath.conservativelyContainsRect(rect);
7689bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com        }
7699bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com    }
7709bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com
77136352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onPreDraw() override {
7729bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com        fQueryRects.setCount(kQueryRectCnt);
7739bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com
774e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org        SkRandom rand;
7759bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com        for (int i = 0; i < kQueryRectCnt; ++i) {
7769bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com            SkSize size;
7779bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com            SkPoint xy;
7789bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com            size.fWidth = rand.nextRangeScalar(kQueryMin.fWidth,  kQueryMax.fWidth);
7799bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com            size.fHeight = rand.nextRangeScalar(kQueryMin.fHeight, kQueryMax.fHeight);
7809bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com            xy.fX = rand.nextRangeScalar(kBounds.fLeft, kBounds.fRight - size.fWidth);
7819bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com            xy.fY = rand.nextRangeScalar(kBounds.fTop, kBounds.fBottom - size.fHeight);
7829bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com
7839bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com            fQueryRects[i] = SkRect::MakeXYWH(xy.fX, xy.fY, size.fWidth, size.fHeight);
7849bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com        }
7859bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com    }
7869bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com
7879bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com    enum {
7889bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com        kQueryRectCnt = 400,
7899bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com    };
7909bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com    static const SkRect kBounds;   // bounds for all random query rects
7919bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com    static const SkSize kQueryMin; // minimum query rect size, should be <= kQueryMax
7929bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com    static const SkSize kQueryMax; // max query rect size, should < kBounds
7939bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com    static const SkRect kBaseRect; // rect that is used to construct the path
7949bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com    static const SkScalar kRRRadii[2]; // x and y radii for round rect
7959bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com
7969bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com    SkString            fName;
7979bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com    SkPath              fPath;
7989bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com    bool                fParity;
7999bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com    SkTDArray<SkRect>   fQueryRects;
8009bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com
801f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina    typedef Benchmark INHERITED;
8029bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com};
8039bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com
8048d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org///////////////////////////////////////////////////////////////////////////////
8058d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org
8068d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org#include "SkGeometry.h"
8078d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org
80855011038816a3fc7f0c0a39d482fb85347cc2e78reedclass ConicBench_Chop : public Benchmark {
809b640203cd5733aaf110277e28e22007c5b541565reedprotected:
810b640203cd5733aaf110277e28e22007c5b541565reed    SkConic fRQ, fDst[2];
811b640203cd5733aaf110277e28e22007c5b541565reed    SkString fName;
8128d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.orgpublic:
81355011038816a3fc7f0c0a39d482fb85347cc2e78reed    ConicBench_Chop() : fName("conic-chop") {
8148d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org        fRQ.fPts[0].set(0, 0);
8158d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org        fRQ.fPts[1].set(100, 0);
8168d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org        fRQ.fPts[2].set(100, 100);
8178d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org        fRQ.fW = SkScalarCos(SK_ScalarPI/4);
8188d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org    }
819815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com
82036352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    bool isSuitableFor(Backend backend) override {
821b640203cd5733aaf110277e28e22007c5b541565reed        return backend == kNonRendering_Backend;
8228d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org    }
823815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com
824b640203cd5733aaf110277e28e22007c5b541565reedprivate:
82536352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    const char* onGetName() override { return fName.c_str(); }
826b640203cd5733aaf110277e28e22007c5b541565reed
82736352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onDraw(const int loops, SkCanvas*) override {
82855011038816a3fc7f0c0a39d482fb85347cc2e78reed        for (int i = 0; i < loops; ++i) {
82955011038816a3fc7f0c0a39d482fb85347cc2e78reed            fRQ.chop(fDst);
8308d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org        }
8318d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org    }
832815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com
833f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina    typedef Benchmark INHERITED;
834af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org};
83555011038816a3fc7f0c0a39d482fb85347cc2e78reedDEF_BENCH( return new ConicBench_Chop; )
836b640203cd5733aaf110277e28e22007c5b541565reed
83755011038816a3fc7f0c0a39d482fb85347cc2e78reedclass ConicBench_EvalPos : public ConicBench_Chop {
83855011038816a3fc7f0c0a39d482fb85347cc2e78reed    const bool fUseV2;
839b640203cd5733aaf110277e28e22007c5b541565reedpublic:
84055011038816a3fc7f0c0a39d482fb85347cc2e78reed    ConicBench_EvalPos(bool useV2) : fUseV2(useV2) {
841b640203cd5733aaf110277e28e22007c5b541565reed        fName.printf("conic-eval-pos%d", useV2);
842b640203cd5733aaf110277e28e22007c5b541565reed    }
84336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onDraw(const int loops, SkCanvas*) override {
844b640203cd5733aaf110277e28e22007c5b541565reed        if (fUseV2) {
845b640203cd5733aaf110277e28e22007c5b541565reed            for (int i = 0; i < loops; ++i) {
846b640203cd5733aaf110277e28e22007c5b541565reed                for (int j = 0; j < 1000; ++j) {
847b640203cd5733aaf110277e28e22007c5b541565reed                    fDst[0].fPts[0] = fRQ.evalAt(0.4f);
848b640203cd5733aaf110277e28e22007c5b541565reed                }
849b640203cd5733aaf110277e28e22007c5b541565reed            }
850b640203cd5733aaf110277e28e22007c5b541565reed        } else {
851b640203cd5733aaf110277e28e22007c5b541565reed            for (int i = 0; i < loops; ++i) {
852b640203cd5733aaf110277e28e22007c5b541565reed                for (int j = 0; j < 1000; ++j) {
853b640203cd5733aaf110277e28e22007c5b541565reed                    fRQ.evalAt(0.4f, &fDst[0].fPts[0], NULL);
854b640203cd5733aaf110277e28e22007c5b541565reed                }
855b640203cd5733aaf110277e28e22007c5b541565reed            }
856b640203cd5733aaf110277e28e22007c5b541565reed        }
857b640203cd5733aaf110277e28e22007c5b541565reed    }
858b640203cd5733aaf110277e28e22007c5b541565reed};
859b640203cd5733aaf110277e28e22007c5b541565reedDEF_BENCH( return new ConicBench_EvalPos(false); )
860b640203cd5733aaf110277e28e22007c5b541565reedDEF_BENCH( return new ConicBench_EvalPos(true); )
861b640203cd5733aaf110277e28e22007c5b541565reed
86255011038816a3fc7f0c0a39d482fb85347cc2e78reedclass ConicBench_EvalTan : public ConicBench_Chop {
86355011038816a3fc7f0c0a39d482fb85347cc2e78reed    const bool fUseV2;
864b640203cd5733aaf110277e28e22007c5b541565reedpublic:
86555011038816a3fc7f0c0a39d482fb85347cc2e78reed    ConicBench_EvalTan(bool useV2) : fUseV2(useV2) {
866b640203cd5733aaf110277e28e22007c5b541565reed        fName.printf("conic-eval-tan%d", useV2);
867b640203cd5733aaf110277e28e22007c5b541565reed    }
86836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onDraw(const int loops, SkCanvas*) override {
869b640203cd5733aaf110277e28e22007c5b541565reed        if (fUseV2) {
870b640203cd5733aaf110277e28e22007c5b541565reed            for (int i = 0; i < loops; ++i) {
871b640203cd5733aaf110277e28e22007c5b541565reed                for (int j = 0; j < 1000; ++j) {
872b640203cd5733aaf110277e28e22007c5b541565reed                    fDst[0].fPts[0] = fRQ.evalTangentAt(0.4f);
873b640203cd5733aaf110277e28e22007c5b541565reed                }
874b640203cd5733aaf110277e28e22007c5b541565reed            }
875b640203cd5733aaf110277e28e22007c5b541565reed        } else {
876b640203cd5733aaf110277e28e22007c5b541565reed            for (int i = 0; i < loops; ++i) {
877b640203cd5733aaf110277e28e22007c5b541565reed                for (int j = 0; j < 1000; ++j) {
878b640203cd5733aaf110277e28e22007c5b541565reed                    fRQ.evalAt(0.4f, NULL, &fDst[0].fPts[0]);
879b640203cd5733aaf110277e28e22007c5b541565reed                }
880b640203cd5733aaf110277e28e22007c5b541565reed            }
881b640203cd5733aaf110277e28e22007c5b541565reed        }
882b640203cd5733aaf110277e28e22007c5b541565reed    }
883b640203cd5733aaf110277e28e22007c5b541565reed};
884b640203cd5733aaf110277e28e22007c5b541565reedDEF_BENCH( return new ConicBench_EvalTan(false); )
885b640203cd5733aaf110277e28e22007c5b541565reedDEF_BENCH( return new ConicBench_EvalTan(true); )
886af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org
887af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org///////////////////////////////////////////////////////////////////////////////
888ab38e560e922b554ea9fa98adc4f79aee7eca8baskia.committer@gmail.com
889e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.orgstatic void rand_conic(SkConic* conic, SkRandom& rand) {
890af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org    for (int i = 0; i < 3; ++i) {
891af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org        conic->fPts[i].set(rand.nextUScalar1() * 100, rand.nextUScalar1() * 100);
892af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org    }
893af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org    if (rand.nextUScalar1() > 0.5f) {
894af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org        conic->fW = rand.nextUScalar1();
895af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org    } else {
896af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org        conic->fW = 1 + rand.nextUScalar1() * 4;
897af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org    }
898af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org}
899af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org
900f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass ConicBench : public Benchmark {
901af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgpublic:
902410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    ConicBench()  {
903e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org        SkRandom rand;
904af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org        for (int i = 0; i < CONICS; ++i) {
905af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org            rand_conic(&fConics[i], rand);
906af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org        }
907644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org    }
908644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org
90936352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    bool isSuitableFor(Backend backend) override {
910644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org        return backend == kNonRendering_Backend;
911af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org    }
912815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com
913af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgprotected:
914af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org    enum {
915af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org        CONICS = 100
916af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org    };
917af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org    SkConic fConics[CONICS];
918815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com
919af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgprivate:
920f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina    typedef Benchmark INHERITED;
9218d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org};
9228d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org
923af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgclass ConicBench_ComputeError : public ConicBench {
924af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgpublic:
925410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    ConicBench_ComputeError()  {}
926815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com
927af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgprotected:
92836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    const char* onGetName() override {
929af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org        return "conic-compute-error";
930af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org    }
931815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com
93236352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onDraw(const int loops, SkCanvas*) override {
933af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org        SkVector err;
9343361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int i = 0; i < loops; ++i) {
935af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org            for (int j = 0; j < CONICS; ++j) {
936af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org                fConics[j].computeAsQuadError(&err);
937af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org            }
938af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org        }
939af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org    }
940815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com
941af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgprivate:
942af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org    typedef ConicBench INHERITED;
943af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org};
944af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org
945af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgclass ConicBench_asQuadTol : public ConicBench {
946af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgpublic:
947410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    ConicBench_asQuadTol()  {}
948815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com
949af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgprotected:
95036352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    const char* onGetName() override {
951af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org        return "conic-asQuadTol";
952af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org    }
953815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com
95436352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onDraw(const int loops, SkCanvas*) override {
9553361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int i = 0; i < loops; ++i) {
956af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org            for (int j = 0; j < CONICS; ++j) {
957af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org                fConics[j].asQuadTol(SK_ScalarHalf);
958af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org            }
959af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org        }
960af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org    }
961815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com
962af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgprivate:
963af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org    typedef ConicBench INHERITED;
964af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org};
965af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org
966af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgclass ConicBench_quadPow2 : public ConicBench {
967af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgpublic:
968410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    ConicBench_quadPow2()  {}
969af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org
970af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgprotected:
97136352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    const char* onGetName() override {
972af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org        return "conic-quadPow2";
973af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org    }
974815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com
97536352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onDraw(const int loops, SkCanvas*) override {
9763361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int i = 0; i < loops; ++i) {
977af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org            for (int j = 0; j < CONICS; ++j) {
978af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org                fConics[j].computeQuadPOW2(SK_ScalarHalf);
979af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org            }
980af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org        }
981af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org    }
982815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com
983af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgprivate:
984af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org    typedef ConicBench INHERITED;
985af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org};
986af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org
9878d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org///////////////////////////////////////////////////////////////////////////////
9888d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org
9899bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.comconst SkRect ConservativelyContainsBench::kBounds = SkRect::MakeWH(SkIntToScalar(100), SkIntToScalar(100));
9909bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.comconst SkSize ConservativelyContainsBench::kQueryMin = SkSize::Make(SkIntToScalar(1), SkIntToScalar(1));
9919bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.comconst SkSize ConservativelyContainsBench::kQueryMax = SkSize::Make(SkIntToScalar(40), SkIntToScalar(40));
9929bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.comconst SkRect ConservativelyContainsBench::kBaseRect = SkRect::MakeXYWH(SkIntToScalar(25), SkIntToScalar(25), SkIntToScalar(50), SkIntToScalar(50));
9939bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.comconst SkScalar ConservativelyContainsBench::kRRRadii[2] = {SkIntToScalar(5), SkIntToScalar(10)};
9949bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com
995410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new TrianglePathBench(FLAGS00); )
996410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new TrianglePathBench(FLAGS01); )
997410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new TrianglePathBench(FLAGS10); )
998410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new TrianglePathBench(FLAGS11); )
999410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com
1000410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new RectPathBench(FLAGS00); )
1001410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new RectPathBench(FLAGS01); )
1002410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new RectPathBench(FLAGS10); )
1003410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new RectPathBench(FLAGS11); )
1004410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com
1005410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new OvalPathBench(FLAGS00); )
1006410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new OvalPathBench(FLAGS01); )
1007410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new OvalPathBench(FLAGS10); )
1008410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new OvalPathBench(FLAGS11); )
1009410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com
1010410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new CirclePathBench(FLAGS00); )
1011410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new CirclePathBench(FLAGS01); )
1012410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new CirclePathBench(FLAGS10); )
1013410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new CirclePathBench(FLAGS11); )
1014410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com
1015410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new SawToothPathBench(FLAGS00); )
1016410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new SawToothPathBench(FLAGS01); )
1017410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com
1018410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new LongCurvedPathBench(FLAGS00); )
1019410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new LongCurvedPathBench(FLAGS01); )
1020410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new LongLinePathBench(FLAGS00); )
1021410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new LongLinePathBench(FLAGS01); )
1022410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com
1023410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new PathCreateBench(); )
1024410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new PathCopyBench(); )
1025410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new PathTransformBench(true); )
1026410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new PathTransformBench(false); )
1027410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new PathEqualityBench(); )
1028410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com
1029410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new SkBench_AddPathTest(SkBench_AddPathTest::kAdd_AddType); )
1030410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new SkBench_AddPathTest(SkBench_AddPathTest::kAddTrans_AddType); )
1031410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new SkBench_AddPathTest(SkBench_AddPathTest::kAddMatrix_AddType); )
1032410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new SkBench_AddPathTest(SkBench_AddPathTest::kReverseAdd_AddType); )
1033410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new SkBench_AddPathTest(SkBench_AddPathTest::kReversePathTo_AddType); )
1034410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com
1035410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new CirclesBench(FLAGS00); )
1036410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new CirclesBench(FLAGS01); )
1037410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ArbRoundRectBench(false); )
1038410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ArbRoundRectBench(true); )
1039410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ConservativelyContainsBench(ConservativelyContainsBench::kRect_Type); )
1040410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ConservativelyContainsBench(ConservativelyContainsBench::kRoundRect_Type); )
1041410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ConservativelyContainsBench(ConservativelyContainsBench::kOval_Type); )
1042410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com
1043b640203cd5733aaf110277e28e22007c5b541565reed
10443f376a55002c205aacacc4cb16ed745e3afbad31Mike Klein// These seem to be optimized away, which is troublesome for timing.
10453f376a55002c205aacacc4cb16ed745e3afbad31Mike Klein/*
1046410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ConicBench_Chop5() )
1047410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ConicBench_ComputeError() )
1048410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ConicBench_asQuadTol() )
1049410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ConicBench_quadPow2() )
10503f376a55002c205aacacc4cb16ed745e3afbad31Mike Klein*/
1051