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:
451647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com    virtual const char* onGetName() SK_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
533361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org    virtual void onDraw(const int loops, SkCanvas* canvas) SK_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) {
60d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com            SkMatrix m;
61d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com            m.setScale(SkIntToScalar(10), SkIntToScalar(10));
62d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com            path.transform(m);
63d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        }
64d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com
653361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        int count = loops;
66d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        if (fFlags & kBig_Flag) {
67d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com            count >>= 2;
68d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        }
696e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com        count >>= (3 * complexity());
70d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com
71d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        for (int i = 0; i < count; i++) {
72d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com            canvas->drawPath(path, paint);
73d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        }
74d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com    }
75d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com
76d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.comprivate:
77f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina    typedef Benchmark INHERITED;
78d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com};
79d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com
80d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.comclass TrianglePathBench : public PathBench {
81d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.compublic:
82410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    TrianglePathBench(Flags flags) : INHERITED(flags) {}
83fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
841647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com    virtual void appendName(SkString* name) SK_OVERRIDE {
85d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        name->append("triangle");
86d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com    }
871647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com    virtual void makePath(SkPath* path) SK_OVERRIDE {
88d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        static const int gCoord[] = {
89d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com            10, 10, 15, 5, 20, 20
90d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        };
91d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        path->moveTo(SkIntToScalar(gCoord[0]), SkIntToScalar(gCoord[1]));
92d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        path->lineTo(SkIntToScalar(gCoord[2]), SkIntToScalar(gCoord[3]));
93d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        path->lineTo(SkIntToScalar(gCoord[4]), SkIntToScalar(gCoord[5]));
94d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        path->close();
95d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com    }
96d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.comprivate:
97d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com    typedef PathBench INHERITED;
98d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com};
99d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com
100d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.comclass RectPathBench : public PathBench {
101d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.compublic:
102410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    RectPathBench(Flags flags) : INHERITED(flags) {}
103fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
1041647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com    virtual void appendName(SkString* name) SK_OVERRIDE {
105d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        name->append("rect");
106d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com    }
1071647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com    virtual void makePath(SkPath* path) SK_OVERRIDE {
108d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        SkRect r = { 10, 10, 20, 20 };
109d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        path->addRect(r);
110d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com    }
111d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.comprivate:
112d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com    typedef PathBench INHERITED;
113d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com};
114d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com
115d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.comclass OvalPathBench : public PathBench {
116d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.compublic:
117410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    OvalPathBench(Flags flags) : INHERITED(flags) {}
118fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
1191647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com    virtual void appendName(SkString* name) SK_OVERRIDE {
120d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        name->append("oval");
121d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com    }
1221647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com    virtual void makePath(SkPath* path) SK_OVERRIDE {
123e2bfd8b7b17c7a66728883d6fb5f7b7639c73b90jvanverth@google.com        SkRect r = { 10, 10, 23, 20 };
124d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        path->addOval(r);
125d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com    }
126d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.comprivate:
127d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com    typedef PathBench INHERITED;
128d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com};
129d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com
1301647a1955fa44654102ae36df7af683bb8874175bsalomon@google.comclass CirclePathBench: public PathBench {
1311647a1955fa44654102ae36df7af683bb8874175bsalomon@google.compublic:
132410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    CirclePathBench(Flags flags) : INHERITED(flags) {}
1331647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com
1341647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com    virtual void appendName(SkString* name) SK_OVERRIDE {
1351647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com        name->append("circle");
1361647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com    }
1371647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com    virtual void makePath(SkPath* path) SK_OVERRIDE {
1381647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com        path->addCircle(SkIntToScalar(20), SkIntToScalar(20),
1391647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com                        SkIntToScalar(10));
1401647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com    }
1411647a1955fa44654102ae36df7af683bb8874175bsalomon@google.comprivate:
1421647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com    typedef PathBench INHERITED;
1431647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com};
1441647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com
145d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.comclass SawToothPathBench : public PathBench {
146d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.compublic:
147410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    SawToothPathBench(Flags flags) : INHERITED(flags) {}
148fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
1491647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com    virtual void appendName(SkString* name) SK_OVERRIDE {
150d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        name->append("sawtooth");
151d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com    }
152d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com    virtual void makePath(SkPath* path) {
153d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        SkScalar x = SkIntToScalar(20);
154d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        SkScalar y = SkIntToScalar(20);
155d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        const SkScalar x0 = x;
156d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        const SkScalar dx = SK_Scalar1 * 5;
157d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        const SkScalar dy = SK_Scalar1 * 10;
158d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com
159d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        path->moveTo(x, y);
160d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        for (int i = 0; i < 32; i++) {
161d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com            x += dx;
162d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com            path->lineTo(x, y - dy);
163d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com            x += dx;
164d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com            path->lineTo(x, y + dy);
165d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        }
166d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        path->lineTo(x, y + 2 * dy);
167d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        path->lineTo(x0, y + 2 * dy);
168d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        path->close();
169d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com    }
1701647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com    virtual int complexity() SK_OVERRIDE { return 1; }
1716e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.comprivate:
1726e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com    typedef PathBench INHERITED;
1736e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com};
1746e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com
1756e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.comclass LongCurvedPathBench : public PathBench {
1766e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.compublic:
177410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    LongCurvedPathBench(Flags flags) : INHERITED(flags) {}
1786e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com
1791647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com    virtual void appendName(SkString* name) SK_OVERRIDE {
1806e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com        name->append("long_curved");
1816e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com    }
1821647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com    virtual void makePath(SkPath* path) SK_OVERRIDE {
183e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org        SkRandom rand (12);
1846e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com        int i;
1856e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com        for (i = 0; i < 100; i++) {
1866e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com            path->quadTo(SkScalarMul(rand.nextUScalar1(), SkIntToScalar(640)),
1876e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com                         SkScalarMul(rand.nextUScalar1(), SkIntToScalar(480)),
1886e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com                         SkScalarMul(rand.nextUScalar1(), SkIntToScalar(640)),
1896e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com                         SkScalarMul(rand.nextUScalar1(), SkIntToScalar(480)));
1906e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com        }
1916e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com        path->close();
1926e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com    }
1931647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com    virtual int complexity() SK_OVERRIDE { return 2; }
194d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.comprivate:
195d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com    typedef PathBench INHERITED;
196d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com};
197d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com
198e50f7361b4ee9fc8968e0e8a511379b3bf5f5123senorblanco@chromium.orgclass LongLinePathBench : public PathBench {
199e50f7361b4ee9fc8968e0e8a511379b3bf5f5123senorblanco@chromium.orgpublic:
200410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    LongLinePathBench(Flags flags) : INHERITED(flags) {}
201e50f7361b4ee9fc8968e0e8a511379b3bf5f5123senorblanco@chromium.org
2021647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com    virtual void appendName(SkString* name) SK_OVERRIDE {
203e50f7361b4ee9fc8968e0e8a511379b3bf5f5123senorblanco@chromium.org        name->append("long_line");
204e50f7361b4ee9fc8968e0e8a511379b3bf5f5123senorblanco@chromium.org    }
2051647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com    virtual void makePath(SkPath* path) SK_OVERRIDE {
206e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org        SkRandom rand;
207e50f7361b4ee9fc8968e0e8a511379b3bf5f5123senorblanco@chromium.org        path->moveTo(rand.nextUScalar1() * 640, rand.nextUScalar1() * 480);
208e50f7361b4ee9fc8968e0e8a511379b3bf5f5123senorblanco@chromium.org        for (size_t i = 1; i < 100; i++) {
209e50f7361b4ee9fc8968e0e8a511379b3bf5f5123senorblanco@chromium.org            path->lineTo(rand.nextUScalar1() * 640, rand.nextUScalar1() * 480);
210e50f7361b4ee9fc8968e0e8a511379b3bf5f5123senorblanco@chromium.org        }
211e50f7361b4ee9fc8968e0e8a511379b3bf5f5123senorblanco@chromium.org    }
2121647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com    virtual int complexity() SK_OVERRIDE { return 2; }
213e50f7361b4ee9fc8968e0e8a511379b3bf5f5123senorblanco@chromium.orgprivate:
214e50f7361b4ee9fc8968e0e8a511379b3bf5f5123senorblanco@chromium.org    typedef PathBench INHERITED;
215e50f7361b4ee9fc8968e0e8a511379b3bf5f5123senorblanco@chromium.org};
2166e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com
217f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass RandomPathBench : public Benchmark {
21830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.compublic:
219644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org    virtual bool isSuitableFor(Backend backend) SK_OVERRIDE {
220644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org        return backend == kNonRendering_Backend;
22130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    }
22230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
22330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comprotected:
22430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    void createData(int minVerbs,
22530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                    int maxVerbs,
22630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                    bool allowMoves = true,
22730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                    SkRect* bounds = NULL) {
22830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        SkRect tempBounds;
22930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        if (NULL == bounds) {
23030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com            tempBounds.setXYWH(0, 0, SK_Scalar1, SK_Scalar1);
23130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com            bounds = &tempBounds;
23230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        }
2336d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com        fVerbCnts.reset(kNumVerbCnts);
2346d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com        for (int i = 0; i < kNumVerbCnts; ++i) {
2356d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com            fVerbCnts[i] = fRandom.nextRangeU(minVerbs, maxVerbs + 1);
2366d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com        }
2376d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com        fVerbs.reset(kNumVerbs);
2386d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com        for (int i = 0; i < kNumVerbs; ++i) {
2396d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com            do {
2406d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com                fVerbs[i] = static_cast<SkPath::Verb>(fRandom.nextULessThan(SkPath::kDone_Verb));
2416d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com            } while (!allowMoves && SkPath::kMove_Verb == fVerbs[i]);
2426d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com        }
2436d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com        fPoints.reset(kNumPoints);
2446d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com        for (int i = 0; i < kNumPoints; ++i) {
2456d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com            fPoints[i].set(fRandom.nextRangeScalar(bounds->fLeft, bounds->fRight),
2466d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com                           fRandom.nextRangeScalar(bounds->fTop, bounds->fBottom));
24730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        }
24830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        this->restartMakingPaths();
24930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    }
25030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
25130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    void restartMakingPaths() {
25230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        fCurrPath = 0;
25330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        fCurrVerb = 0;
25430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        fCurrPoint = 0;
25530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    }
25630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
25730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    void makePath(SkPath* path) {
2586d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com        int vCount = fVerbCnts[(fCurrPath++) & (kNumVerbCnts - 1)];
25930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        for (int v = 0; v < vCount; ++v) {
2606d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com            int verb = fVerbs[(fCurrVerb++) & (kNumVerbs - 1)];
2616d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com            switch (verb) {
26230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                case SkPath::kMove_Verb:
2636d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com                    path->moveTo(fPoints[(fCurrPoint++) & (kNumPoints - 1)]);
26430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                    break;
26530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                case SkPath::kLine_Verb:
2666d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com                    path->lineTo(fPoints[(fCurrPoint++) & (kNumPoints - 1)]);
26730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                    break;
26830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                case SkPath::kQuad_Verb:
269373ebc634573364c27b1ebd35bb537ef1285cba4bsalomon@google.com                    path->quadTo(fPoints[(fCurrPoint + 0) & (kNumPoints - 1)],
270373ebc634573364c27b1ebd35bb537ef1285cba4bsalomon@google.com                                 fPoints[(fCurrPoint + 1) & (kNumPoints - 1)]);
271373ebc634573364c27b1ebd35bb537ef1285cba4bsalomon@google.com                    fCurrPoint += 2;
27230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                    break;
273277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com                case SkPath::kConic_Verb:
274277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com                    path->conicTo(fPoints[(fCurrPoint + 0) & (kNumPoints - 1)],
275277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com                                  fPoints[(fCurrPoint + 1) & (kNumPoints - 1)],
276277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com                                  SK_ScalarHalf);
277277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com                    fCurrPoint += 2;
278277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com                    break;
27930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                case SkPath::kCubic_Verb:
280373ebc634573364c27b1ebd35bb537ef1285cba4bsalomon@google.com                    path->cubicTo(fPoints[(fCurrPoint + 0) & (kNumPoints - 1)],
281373ebc634573364c27b1ebd35bb537ef1285cba4bsalomon@google.com                                  fPoints[(fCurrPoint + 1) & (kNumPoints - 1)],
282373ebc634573364c27b1ebd35bb537ef1285cba4bsalomon@google.com                                  fPoints[(fCurrPoint + 2) & (kNumPoints - 1)]);
283373ebc634573364c27b1ebd35bb537ef1285cba4bsalomon@google.com                    fCurrPoint += 3;
28430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                    break;
28530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                case SkPath::kClose_Verb:
28630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                    path->close();
28730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                    break;
28830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                default:
28930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                    SkDEBUGFAIL("Unexpected path verb");
29030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                    break;
29130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com            }
29230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        }
29330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    }
29430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
29530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    void finishedMakingPaths() {
2966d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com        fVerbCnts.reset(0);
2976d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com        fVerbs.reset(0);
2986d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com        fPoints.reset(0);
29930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    }
30030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
30130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comprivate:
3026d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com    enum {
3036d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com        // these should all be pow 2
304b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com        kNumVerbCnts = 1 << 5,
305b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com        kNumVerbs    = 1 << 5,
306b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com        kNumPoints   = 1 << 5,
3076d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com    };
3086d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com    SkAutoTArray<int>           fVerbCnts;
3096d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com    SkAutoTArray<SkPath::Verb>  fVerbs;
3106d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com    SkAutoTArray<SkPoint>       fPoints;
3116d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com    int                         fCurrPath;
3126d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com    int                         fCurrVerb;
3136d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com    int                         fCurrPoint;
314e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org    SkRandom                    fRandom;
315f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina    typedef Benchmark INHERITED;
31630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com};
31730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
31830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comclass PathCreateBench : public RandomPathBench {
31930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.compublic:
320410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    PathCreateBench()  {
32130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    }
32230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
32330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comprotected:
32430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    virtual const char* onGetName() SK_OVERRIDE {
32530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        return "path_create";
32630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    }
32730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
32830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    virtual void onPreDraw() SK_OVERRIDE {
3296d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com        this->createData(10, 100);
33030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    }
33130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
3323361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org    virtual void onDraw(const int loops, SkCanvas*) SK_OVERRIDE {
3333361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int i = 0; i < loops; ++i) {
3348f88117940ebb0a7f514194a4ad3384073c1f145commit-bot@chromium.org            if (i % 1000 == 0) {
3358f88117940ebb0a7f514194a4ad3384073c1f145commit-bot@chromium.org                fPath.reset();  // PathRef memory can grow without bound otherwise.
3368f88117940ebb0a7f514194a4ad3384073c1f145commit-bot@chromium.org            }
3378f88117940ebb0a7f514194a4ad3384073c1f145commit-bot@chromium.org            this->makePath(&fPath);
33830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        }
33930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        this->restartMakingPaths();
34030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    }
34130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
34230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comprivate:
3438f88117940ebb0a7f514194a4ad3384073c1f145commit-bot@chromium.org    SkPath fPath;
34430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
34530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    typedef RandomPathBench INHERITED;
34630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com};
34730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
34830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comclass PathCopyBench : public RandomPathBench {
34930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.compublic:
350410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    PathCopyBench()  {
35130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    }
35230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
35330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comprotected:
35430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    virtual const char* onGetName() SK_OVERRIDE {
35530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        return "path_copy";
35630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    }
35730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    virtual void onPreDraw() SK_OVERRIDE {
3586d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com        this->createData(10, 100);
359b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com        fPaths.reset(kPathCnt);
360b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com        fCopies.reset(kPathCnt);
361b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com        for (int i = 0; i < kPathCnt; ++i) {
36230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com            this->makePath(&fPaths[i]);
36330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        }
36430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        this->finishedMakingPaths();
36530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    }
3663361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org    virtual void onDraw(const int loops, SkCanvas*) SK_OVERRIDE {
3673361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int i = 0; i < loops; ++i) {
368b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com            int idx = i & (kPathCnt - 1);
369b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com            fCopies[idx] = fPaths[idx];
37030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        }
37130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    }
37230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
37330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comprivate:
374b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com    enum {
375b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com        // must be a pow 2
376b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com        kPathCnt = 1 << 5,
377b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com    };
378b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com    SkAutoTArray<SkPath> fPaths;
379b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com    SkAutoTArray<SkPath> fCopies;
38030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
38130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    typedef RandomPathBench INHERITED;
38230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com};
38330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
38430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comclass PathTransformBench : public RandomPathBench {
38530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.compublic:
386410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    PathTransformBench(bool inPlace) : fInPlace(inPlace) {}
38730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
38830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comprotected:
38930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    virtual const char* onGetName() SK_OVERRIDE {
39030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        return fInPlace ? "path_transform_in_place" : "path_transform_copy";
39130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    }
39230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
39330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    virtual void onPreDraw() SK_OVERRIDE {
39430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        fMatrix.setScale(5 * SK_Scalar1, 6 * SK_Scalar1);
3956d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com        this->createData(10, 100);
396b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com        fPaths.reset(kPathCnt);
397b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com        for (int i = 0; i < kPathCnt; ++i) {
39830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com            this->makePath(&fPaths[i]);
39930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        }
400b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com        this->finishedMakingPaths();
40130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        if (!fInPlace) {
402b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com            fTransformed.reset(kPathCnt);
40330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        }
40430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    }
40530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
4063361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org    virtual void onDraw(const int loops, SkCanvas*) SK_OVERRIDE {
40730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        if (fInPlace) {
4083361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org            for (int i = 0; i < loops; ++i) {
409b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com                fPaths[i & (kPathCnt - 1)].transform(fMatrix);
41030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com            }
41130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        } else {
4123361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org            for (int i = 0; i < loops; ++i) {
413b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com                int idx = i & (kPathCnt - 1);
414b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com                fPaths[idx].transform(fMatrix, &fTransformed[idx]);
41530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com            }
41630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        }
41730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    }
41830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
41930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comprivate:
420b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com    enum {
421b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com        // must be a pow 2
422b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com        kPathCnt = 1 << 5,
423b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com    };
424b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com    SkAutoTArray<SkPath> fPaths;
425b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com    SkAutoTArray<SkPath> fTransformed;
426b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com
42730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    SkMatrix fMatrix;
42830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    bool fInPlace;
42930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    typedef RandomPathBench INHERITED;
43030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com};
43130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
43230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comclass PathEqualityBench : public RandomPathBench {
43330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.compublic:
434410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    PathEqualityBench() { }
43530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
43630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comprotected:
43730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    virtual const char* onGetName() SK_OVERRIDE {
43830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        return "path_equality_50%";
43930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    }
44030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
44130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    virtual void onPreDraw() SK_OVERRIDE {
44230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        fParity = 0;
4436d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com        this->createData(10, 100);
444b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com        fPaths.reset(kPathCnt);
445b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com        fCopies.reset(kPathCnt);
446b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com        for (int i = 0; i < kPathCnt; ++i) {
44730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com            this->makePath(&fPaths[i]);
44830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com            fCopies[i] = fPaths[i];
44930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        }
45030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        this->finishedMakingPaths();
45130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    }
45230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
4533361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org    virtual void onDraw(const int loops, SkCanvas*) SK_OVERRIDE {
4543361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int i = 0; i < loops; ++i) {
455b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com            int idx = i & (kPathCnt - 1);
456b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com            fParity ^= (fPaths[idx] == fCopies[idx & ~0x1]);
45730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        }
45830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    }
45930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
46030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comprivate:
46130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    bool fParity; // attempt to keep compiler from optimizing out the ==
462b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com    enum {
463b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com        // must be a pow 2
464b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com        kPathCnt = 1 << 5,
465b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com    };
466b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com    SkAutoTArray<SkPath> fPaths;
467b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com    SkAutoTArray<SkPath> fCopies;
46830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    typedef RandomPathBench INHERITED;
46930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com};
47030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
47130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comclass SkBench_AddPathTest : public RandomPathBench {
47230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.compublic:
47330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    enum AddType {
47430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        kAdd_AddType,
47530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        kAddTrans_AddType,
47630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        kAddMatrix_AddType,
47730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        kReverseAdd_AddType,
47830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        kReversePathTo_AddType,
47930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    };
48030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
481410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    SkBench_AddPathTest(AddType type) : fType(type) {
48230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        fMatrix.setRotate(60 * SK_Scalar1);
48330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    }
48430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
48530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comprotected:
48630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    virtual const char* onGetName() SK_OVERRIDE {
48730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        switch (fType) {
48830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com            case kAdd_AddType:
48930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                return "path_add_path";
49030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com            case kAddTrans_AddType:
49130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                return "path_add_path_trans";
49230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com            case kAddMatrix_AddType:
49330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                return "path_add_path_matrix";
49430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com            case kReverseAdd_AddType:
49530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                return "path_reverse_add_path";
49630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com            case kReversePathTo_AddType:
49730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                return "path_reverse_path_to";
49830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com            default:
49930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                SkDEBUGFAIL("Bad add type");
50030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                return "";
50130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        }
50230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    }
50330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
50430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    virtual void onPreDraw() SK_OVERRIDE {
505a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org        // reversePathTo assumes a single contour path.
506a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org        bool allowMoves = kReversePathTo_AddType != fType;
5076d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com        this->createData(10, 100, allowMoves);
508b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com        fPaths0.reset(kPathCnt);
509b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com        fPaths1.reset(kPathCnt);
510b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com        for (int i = 0; i < kPathCnt; ++i) {
51130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com            this->makePath(&fPaths0[i]);
51230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com            this->makePath(&fPaths1[i]);
51330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        }
51430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        this->finishedMakingPaths();
51530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    }
51630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
5173361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org    virtual void onDraw(const int loops, SkCanvas*) SK_OVERRIDE {
51830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        switch (fType) {
51930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com            case kAdd_AddType:
5203361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org                for (int i = 0; i < loops; ++i) {
521b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com                    int idx = i & (kPathCnt - 1);
522b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com                    SkPath result = fPaths0[idx];
523b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com                    result.addPath(fPaths1[idx]);
52430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                }
52530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                break;
52630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com            case kAddTrans_AddType:
5273361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org                for (int i = 0; i < loops; ++i) {
528b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com                    int idx = i & (kPathCnt - 1);
529b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com                    SkPath result = fPaths0[idx];
530b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com                    result.addPath(fPaths1[idx], 2 * SK_Scalar1, 5 * SK_Scalar1);
53130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                }
53230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                break;
53330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com            case kAddMatrix_AddType:
5343361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org                for (int i = 0; i < loops; ++i) {
535b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com                    int idx = i & (kPathCnt - 1);
536b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com                    SkPath result = fPaths0[idx];
537b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com                    result.addPath(fPaths1[idx], fMatrix);
53830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                }
53930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                break;
54030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com            case kReverseAdd_AddType:
5413361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org                for (int i = 0; i < loops; ++i) {
542b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com                    int idx = i & (kPathCnt - 1);
543b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com                    SkPath result = fPaths0[idx];
544b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com                    result.reverseAddPath(fPaths1[idx]);
54530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                }
54630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                break;
54730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com            case kReversePathTo_AddType:
5483361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org                for (int i = 0; i < loops; ++i) {
549b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com                    int idx = i & (kPathCnt - 1);
550b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com                    SkPath result = fPaths0[idx];
551b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com                    result.reversePathTo(fPaths1[idx]);
55230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                }
55330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                break;
55430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        }
55530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    }
55630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
55730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comprivate:
55830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    AddType fType; // or reverseAddPath
559b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com    enum {
560b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com        // must be a pow 2
561b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com        kPathCnt = 1 << 5,
562b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com    };
563b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com    SkAutoTArray<SkPath> fPaths0;
564b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com    SkAutoTArray<SkPath> fPaths1;
56530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    SkMatrix         fMatrix;
56630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    typedef RandomPathBench INHERITED;
56730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com};
5686e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com
56917bb458fe897411218d8c9781770948d4398b723robertphillips@google.com
570f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass CirclesBench : public Benchmark {
57117bb458fe897411218d8c9781770948d4398b723robertphillips@google.comprotected:
57217bb458fe897411218d8c9781770948d4398b723robertphillips@google.com    SkString            fName;
57346d3d39e65e0b3ea2ad7c91c176ccafb4df0fa24jvanverth@google.com    Flags               fFlags;
57417bb458fe897411218d8c9781770948d4398b723robertphillips@google.com
57517bb458fe897411218d8c9781770948d4398b723robertphillips@google.compublic:
576410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    CirclesBench(Flags flags) : fFlags(flags) {
57746d3d39e65e0b3ea2ad7c91c176ccafb4df0fa24jvanverth@google.com        fName.printf("circles_%s", fFlags & kStroke_Flag ? "stroke" : "fill");
57817bb458fe897411218d8c9781770948d4398b723robertphillips@google.com    }
57917bb458fe897411218d8c9781770948d4398b723robertphillips@google.com
58017bb458fe897411218d8c9781770948d4398b723robertphillips@google.comprotected:
58117bb458fe897411218d8c9781770948d4398b723robertphillips@google.com    virtual const char* onGetName() SK_OVERRIDE {
58217bb458fe897411218d8c9781770948d4398b723robertphillips@google.com        return fName.c_str();
58317bb458fe897411218d8c9781770948d4398b723robertphillips@google.com    }
58417bb458fe897411218d8c9781770948d4398b723robertphillips@google.com
5853361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org    virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE {
58617bb458fe897411218d8c9781770948d4398b723robertphillips@google.com        SkPaint paint;
58717bb458fe897411218d8c9781770948d4398b723robertphillips@google.com
58817bb458fe897411218d8c9781770948d4398b723robertphillips@google.com        paint.setColor(SK_ColorBLACK);
58917bb458fe897411218d8c9781770948d4398b723robertphillips@google.com        paint.setAntiAlias(true);
59046d3d39e65e0b3ea2ad7c91c176ccafb4df0fa24jvanverth@google.com        if (fFlags & kStroke_Flag) {
59146d3d39e65e0b3ea2ad7c91c176ccafb4df0fa24jvanverth@google.com            paint.setStyle(SkPaint::kStroke_Style);
59246d3d39e65e0b3ea2ad7c91c176ccafb4df0fa24jvanverth@google.com        }
59317bb458fe897411218d8c9781770948d4398b723robertphillips@google.com
594e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org        SkRandom rand;
59517bb458fe897411218d8c9781770948d4398b723robertphillips@google.com
59617bb458fe897411218d8c9781770948d4398b723robertphillips@google.com        SkRect r;
59717bb458fe897411218d8c9781770948d4398b723robertphillips@google.com
5983361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int i = 0; i < loops; ++i) {
59917bb458fe897411218d8c9781770948d4398b723robertphillips@google.com            SkScalar radius = rand.nextUScalar1() * 3;
60017bb458fe897411218d8c9781770948d4398b723robertphillips@google.com            r.fLeft = rand.nextUScalar1() * 300;
60117bb458fe897411218d8c9781770948d4398b723robertphillips@google.com            r.fTop =  rand.nextUScalar1() * 300;
60217bb458fe897411218d8c9781770948d4398b723robertphillips@google.com            r.fRight =  r.fLeft + 2 * radius;
60317bb458fe897411218d8c9781770948d4398b723robertphillips@google.com            r.fBottom = r.fTop + 2 * radius;
60417bb458fe897411218d8c9781770948d4398b723robertphillips@google.com
60546d3d39e65e0b3ea2ad7c91c176ccafb4df0fa24jvanverth@google.com            if (fFlags & kStroke_Flag) {
60646d3d39e65e0b3ea2ad7c91c176ccafb4df0fa24jvanverth@google.com                paint.setStrokeWidth(rand.nextUScalar1() * 5.0f);
60746d3d39e65e0b3ea2ad7c91c176ccafb4df0fa24jvanverth@google.com            }
60846d3d39e65e0b3ea2ad7c91c176ccafb4df0fa24jvanverth@google.com
60917bb458fe897411218d8c9781770948d4398b723robertphillips@google.com            SkPath temp;
61017bb458fe897411218d8c9781770948d4398b723robertphillips@google.com
61117bb458fe897411218d8c9781770948d4398b723robertphillips@google.com            // mimic how Chrome does circles
61217bb458fe897411218d8c9781770948d4398b723robertphillips@google.com            temp.arcTo(r, 0, 0, false);
61317bb458fe897411218d8c9781770948d4398b723robertphillips@google.com            temp.addOval(r, SkPath::kCCW_Direction);
61417bb458fe897411218d8c9781770948d4398b723robertphillips@google.com            temp.arcTo(r, 360, 0, true);
61517bb458fe897411218d8c9781770948d4398b723robertphillips@google.com            temp.close();
616fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
61717bb458fe897411218d8c9781770948d4398b723robertphillips@google.com            canvas->drawPath(temp, paint);
61817bb458fe897411218d8c9781770948d4398b723robertphillips@google.com        }
61917bb458fe897411218d8c9781770948d4398b723robertphillips@google.com    }
62017bb458fe897411218d8c9781770948d4398b723robertphillips@google.com
62117bb458fe897411218d8c9781770948d4398b723robertphillips@google.comprivate:
622f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina    typedef Benchmark INHERITED;
62317bb458fe897411218d8c9781770948d4398b723robertphillips@google.com};
62417bb458fe897411218d8c9781770948d4398b723robertphillips@google.com
62546d3d39e65e0b3ea2ad7c91c176ccafb4df0fa24jvanverth@google.com
626158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com// Chrome creates its own round rects with each corner possibly being different.
627158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com// In its "zero radius" incarnation it creates degenerate round rects.
6281e34ff7030c95a96c3cd5940de9b4dda4e1cef86skia.committer@gmail.com// Note: PathTest::test_arb_round_rect_is_convex and
629158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com// test_arb_zero_rad_round_rect_is_rect perform almost exactly
630b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com// the same test (but with no drawing)
631f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass ArbRoundRectBench : public Benchmark {
632f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.comprotected:
633f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com    SkString            fName;
634f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com
635f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.compublic:
636410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    ArbRoundRectBench(bool zeroRad) : fZeroRad(zeroRad) {
637158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com        if (zeroRad) {
638158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com            fName.printf("zeroradroundrect");
639158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com        } else {
640158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com            fName.printf("arbroundrect");
641158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com        }
642f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com    }
643f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com
644f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.comprotected:
645f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com    virtual const char* onGetName() SK_OVERRIDE {
646f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com        return fName.c_str();
647f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com    }
648f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com
649989a95ea77230e8347da18876e1bd5f39a78ebb5skia.committer@gmail.com    static void add_corner_arc(SkPath* path, const SkRect& rect,
650989a95ea77230e8347da18876e1bd5f39a78ebb5skia.committer@gmail.com                               SkScalar xIn, SkScalar yIn,
651f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com                               int startAngle)
652f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com    {
653f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com
654f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com        SkScalar rx = SkMinScalar(rect.width(), xIn);
655f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com        SkScalar ry = SkMinScalar(rect.height(), yIn);
656f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com
657f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com        SkRect arcRect;
658f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com        arcRect.set(-rx, -ry, rx, ry);
659f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com        switch (startAngle) {
660f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com        case 0:
661f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com            arcRect.offset(rect.fRight - arcRect.fRight, rect.fBottom - arcRect.fBottom);
662f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com            break;
663f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com        case 90:
664f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com            arcRect.offset(rect.fLeft - arcRect.fLeft, rect.fBottom - arcRect.fBottom);
665f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com            break;
666f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com        case 180:
667f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com            arcRect.offset(rect.fLeft - arcRect.fLeft, rect.fTop - arcRect.fTop);
668f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com            break;
669f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com        case 270:
670f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com            arcRect.offset(rect.fRight - arcRect.fRight, rect.fTop - arcRect.fTop);
671f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com            break;
672f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com        default:
673f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com            break;
674f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com        }
675f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com
676f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com        path->arcTo(arcRect, SkIntToScalar(startAngle), SkIntToScalar(90), false);
677f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com    }
678f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com
679989a95ea77230e8347da18876e1bd5f39a78ebb5skia.committer@gmail.com    static void make_arb_round_rect(SkPath* path, const SkRect& r,
680f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com                                    SkScalar xCorner, SkScalar yCorner) {
681f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com        // we are lazy here and use the same x & y for each corner
682f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com        add_corner_arc(path, r, xCorner, yCorner, 270);
683f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com        add_corner_arc(path, r, xCorner, yCorner, 0);
684f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com        add_corner_arc(path, r, xCorner, yCorner, 90);
685f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com        add_corner_arc(path, r, xCorner, yCorner, 180);
686158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com        path->close();
687f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com
688b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com        SkASSERT(path->isConvex());
689f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com    }
690f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com
6913361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org    virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE {
692e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org        SkRandom rand;
693f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com        SkRect r;
694f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com
6953361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int i = 0; i < loops; ++i) {
696f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com            SkPaint paint;
697f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com            paint.setColor(0xff000000 | rand.nextU());
698f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com            paint.setAntiAlias(true);
699f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com
700158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com            SkScalar size = rand.nextUScalar1() * 30;
701158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com            if (size < SK_Scalar1) {
702b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com                continue;
703b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com            }
704f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com            r.fLeft = rand.nextUScalar1() * 300;
705f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com            r.fTop =  rand.nextUScalar1() * 300;
706158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com            r.fRight =  r.fLeft + 2 * size;
707158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com            r.fBottom = r.fTop + 2 * size;
708f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com
709f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com            SkPath temp;
710f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com
711158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com            if (fZeroRad) {
712158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com                make_arb_round_rect(&temp, r, 0, 0);
713158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com
714158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com                SkASSERT(temp.isRect(NULL));
715158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com            } else {
716158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com                make_arb_round_rect(&temp, r, r.width() / 10, r.height() / 15);
717158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com            }
718f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com
719f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com            canvas->drawPath(temp, paint);
720f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com        }
721f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com    }
722f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com
723f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.comprivate:
724158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com    bool fZeroRad;      // should 0 radius rounds rects be tested?
725158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com
726f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina    typedef Benchmark INHERITED;
727f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com};
728f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com
729f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass ConservativelyContainsBench : public Benchmark {
7309bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.compublic:
7319bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com    enum Type {
7329bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com        kRect_Type,
7339bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com        kRoundRect_Type,
7349bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com        kOval_Type,
7359bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com    };
7369bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com
737410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    ConservativelyContainsBench(Type type)  {
7389bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com        fParity = false;
7399bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com        fName = "conservatively_contains_";
7409bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com        switch (type) {
7419bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com            case kRect_Type:
7429bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com                fName.append("rect");
7439bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com                fPath.addRect(kBaseRect);
7449bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com                break;
7459bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com            case kRoundRect_Type:
7469bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com                fName.append("round_rect");
7479bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com                fPath.addRoundRect(kBaseRect, kRRRadii[0], kRRRadii[1]);
7489bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com                break;
7499bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com            case kOval_Type:
7509bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com                fName.append("oval");
7519bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com                fPath.addOval(kBaseRect);
7529bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com                break;
7539bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com        }
7549bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com    }
7559bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com
756644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org    virtual bool isSuitableFor(Backend backend) SK_OVERRIDE {
757644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org        return backend == kNonRendering_Backend;
758644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org    }
759644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org
7609bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.comprivate:
7619bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com    virtual const char* onGetName() SK_OVERRIDE {
7629bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com        return fName.c_str();
7639bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com    }
7649bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com
7653361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org    virtual void onDraw(const int loops, SkCanvas*) SK_OVERRIDE {
7663361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int i = 0; i < loops; ++i) {
7679bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com            const SkRect& rect = fQueryRects[i % kQueryRectCnt];
7689bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com            fParity = fParity != fPath.conservativelyContainsRect(rect);
7699bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com        }
7709bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com    }
7719bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com
7729bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com    virtual void onPreDraw() SK_OVERRIDE {
7739bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com        fQueryRects.setCount(kQueryRectCnt);
7749bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com
775e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org        SkRandom rand;
7769bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com        for (int i = 0; i < kQueryRectCnt; ++i) {
7779bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com            SkSize size;
7789bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com            SkPoint xy;
7799bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com            size.fWidth = rand.nextRangeScalar(kQueryMin.fWidth,  kQueryMax.fWidth);
7809bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com            size.fHeight = rand.nextRangeScalar(kQueryMin.fHeight, kQueryMax.fHeight);
7819bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com            xy.fX = rand.nextRangeScalar(kBounds.fLeft, kBounds.fRight - size.fWidth);
7829bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com            xy.fY = rand.nextRangeScalar(kBounds.fTop, kBounds.fBottom - size.fHeight);
7839bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com
7849bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com            fQueryRects[i] = SkRect::MakeXYWH(xy.fX, xy.fY, size.fWidth, size.fHeight);
7859bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com        }
7869bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com    }
7879bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com
7889bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com    enum {
7899bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com        kQueryRectCnt = 400,
7909bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com    };
7919bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com    static const SkRect kBounds;   // bounds for all random query rects
7929bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com    static const SkSize kQueryMin; // minimum query rect size, should be <= kQueryMax
7939bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com    static const SkSize kQueryMax; // max query rect size, should < kBounds
7949bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com    static const SkRect kBaseRect; // rect that is used to construct the path
7959bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com    static const SkScalar kRRRadii[2]; // x and y radii for round rect
7969bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com
7979bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com    SkString            fName;
7989bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com    SkPath              fPath;
7999bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com    bool                fParity;
8009bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com    SkTDArray<SkRect>   fQueryRects;
8019bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com
802f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina    typedef Benchmark INHERITED;
8039bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com};
8049bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com
8058d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org///////////////////////////////////////////////////////////////////////////////
8068d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org
8078d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org#include "SkGeometry.h"
8088d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org
809f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass ConicBench_Chop5 : public Benchmark {
81028552e12a019bf5ae55c9e8602bbe216562d7a3emike@reedtribe.org    SkConic fRQ;
8118d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.orgpublic:
812410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    ConicBench_Chop5()  {
8138d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org        fRQ.fPts[0].set(0, 0);
8148d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org        fRQ.fPts[1].set(100, 0);
8158d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org        fRQ.fPts[2].set(100, 100);
8168d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org        fRQ.fW = SkScalarCos(SK_ScalarPI/4);
8178d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org    }
818ab38e560e922b554ea9fa98adc4f79aee7eca8baskia.committer@gmail.com
8198d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.orgprivate:
8208d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org    virtual const char* onGetName() SK_OVERRIDE {
8218d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org        return "ratquad-chop-0.5";
8228d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org    }
823ab38e560e922b554ea9fa98adc4f79aee7eca8baskia.committer@gmail.com
8243361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org    virtual void onDraw(const int loops, SkCanvas*) SK_OVERRIDE {
82528552e12a019bf5ae55c9e8602bbe216562d7a3emike@reedtribe.org        SkConic dst[2];
8263361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int i = 0; i < loops; ++i) {
8278d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org            fRQ.chopAt(0.5f, dst);
8288d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org        }
8298d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org    }
830ab38e560e922b554ea9fa98adc4f79aee7eca8baskia.committer@gmail.com
831f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina    typedef Benchmark INHERITED;
8328d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org};
8338d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org
834f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass ConicBench_ChopHalf : public Benchmark {
83528552e12a019bf5ae55c9e8602bbe216562d7a3emike@reedtribe.org    SkConic fRQ;
8368d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.orgpublic:
837410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    ConicBench_ChopHalf()  {
8388d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org        fRQ.fPts[0].set(0, 0);
8398d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org        fRQ.fPts[1].set(100, 0);
8408d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org        fRQ.fPts[2].set(100, 100);
8418d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org        fRQ.fW = SkScalarCos(SK_ScalarPI/4);
8428d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org    }
843815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com
8448d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.orgprivate:
8458d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org    virtual const char* onGetName() SK_OVERRIDE {
8468d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org        return "ratquad-chop-half";
8478d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org    }
848815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com
8493361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org    virtual void onDraw(const int loops, SkCanvas*) SK_OVERRIDE {
85028552e12a019bf5ae55c9e8602bbe216562d7a3emike@reedtribe.org        SkConic dst[2];
8513361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int i = 0; i < loops; ++i) {
8528d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org            fRQ.chop(dst);
8538d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org        }
8548d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org    }
855815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com
856f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina    typedef Benchmark INHERITED;
857af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org};
858af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org
859af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org///////////////////////////////////////////////////////////////////////////////
860ab38e560e922b554ea9fa98adc4f79aee7eca8baskia.committer@gmail.com
861e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.orgstatic void rand_conic(SkConic* conic, SkRandom& rand) {
862af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org    for (int i = 0; i < 3; ++i) {
863af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org        conic->fPts[i].set(rand.nextUScalar1() * 100, rand.nextUScalar1() * 100);
864af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org    }
865af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org    if (rand.nextUScalar1() > 0.5f) {
866af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org        conic->fW = rand.nextUScalar1();
867af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org    } else {
868af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org        conic->fW = 1 + rand.nextUScalar1() * 4;
869af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org    }
870af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org}
871af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org
872f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass ConicBench : public Benchmark {
873af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgpublic:
874410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    ConicBench()  {
875e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org        SkRandom rand;
876af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org        for (int i = 0; i < CONICS; ++i) {
877af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org            rand_conic(&fConics[i], rand);
878af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org        }
879644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org    }
880644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org
881644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org    virtual bool isSuitableFor(Backend backend) SK_OVERRIDE {
882644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org        return backend == kNonRendering_Backend;
883af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org    }
884815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com
885af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgprotected:
886af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org    enum {
887af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org        CONICS = 100
888af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org    };
889af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org    SkConic fConics[CONICS];
890815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com
891af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgprivate:
892f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina    typedef Benchmark INHERITED;
8938d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org};
8948d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org
895af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgclass ConicBench_ComputeError : public ConicBench {
896af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgpublic:
897410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    ConicBench_ComputeError()  {}
898815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com
899af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgprotected:
900af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org    virtual const char* onGetName() SK_OVERRIDE {
901af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org        return "conic-compute-error";
902af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org    }
903815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com
9043361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org    virtual void onDraw(const int loops, SkCanvas*) SK_OVERRIDE {
905af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org        SkVector err;
9063361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int i = 0; i < loops; ++i) {
907af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org            for (int j = 0; j < CONICS; ++j) {
908af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org                fConics[j].computeAsQuadError(&err);
909af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org            }
910af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org        }
911af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org    }
912815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com
913af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgprivate:
914af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org    typedef ConicBench INHERITED;
915af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org};
916af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org
917af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgclass ConicBench_asQuadTol : public ConicBench {
918af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgpublic:
919410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    ConicBench_asQuadTol()  {}
920815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com
921af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgprotected:
922af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org    virtual const char* onGetName() SK_OVERRIDE {
923af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org        return "conic-asQuadTol";
924af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org    }
925815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com
9263361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org    virtual void onDraw(const int loops, SkCanvas*) SK_OVERRIDE {
9273361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int i = 0; i < loops; ++i) {
928af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org            for (int j = 0; j < CONICS; ++j) {
929af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org                fConics[j].asQuadTol(SK_ScalarHalf);
930af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org            }
931af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org        }
932af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org    }
933815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com
934af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgprivate:
935af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org    typedef ConicBench INHERITED;
936af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org};
937af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org
938af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgclass ConicBench_quadPow2 : public ConicBench {
939af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgpublic:
940410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    ConicBench_quadPow2()  {}
941af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org
942af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgprotected:
943af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org    virtual const char* onGetName() SK_OVERRIDE {
944af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org        return "conic-quadPow2";
945af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org    }
946815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com
9473361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org    virtual void onDraw(const int loops, SkCanvas*) SK_OVERRIDE {
9483361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int i = 0; i < loops; ++i) {
949af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org            for (int j = 0; j < CONICS; ++j) {
950af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org                fConics[j].computeQuadPOW2(SK_ScalarHalf);
951af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org            }
952af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org        }
953af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org    }
954815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com
955af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgprivate:
956af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org    typedef ConicBench INHERITED;
957af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org};
958af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org
9598d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org///////////////////////////////////////////////////////////////////////////////
9608d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org
9619bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.comconst SkRect ConservativelyContainsBench::kBounds = SkRect::MakeWH(SkIntToScalar(100), SkIntToScalar(100));
9629bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.comconst SkSize ConservativelyContainsBench::kQueryMin = SkSize::Make(SkIntToScalar(1), SkIntToScalar(1));
9639bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.comconst SkSize ConservativelyContainsBench::kQueryMax = SkSize::Make(SkIntToScalar(40), SkIntToScalar(40));
9649bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.comconst SkRect ConservativelyContainsBench::kBaseRect = SkRect::MakeXYWH(SkIntToScalar(25), SkIntToScalar(25), SkIntToScalar(50), SkIntToScalar(50));
9659bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.comconst SkScalar ConservativelyContainsBench::kRRRadii[2] = {SkIntToScalar(5), SkIntToScalar(10)};
9669bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com
967410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new TrianglePathBench(FLAGS00); )
968410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new TrianglePathBench(FLAGS01); )
969410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new TrianglePathBench(FLAGS10); )
970410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new TrianglePathBench(FLAGS11); )
971410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com
972410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new RectPathBench(FLAGS00); )
973410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new RectPathBench(FLAGS01); )
974410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new RectPathBench(FLAGS10); )
975410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new RectPathBench(FLAGS11); )
976410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com
977410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new OvalPathBench(FLAGS00); )
978410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new OvalPathBench(FLAGS01); )
979410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new OvalPathBench(FLAGS10); )
980410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new OvalPathBench(FLAGS11); )
981410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com
982410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new CirclePathBench(FLAGS00); )
983410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new CirclePathBench(FLAGS01); )
984410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new CirclePathBench(FLAGS10); )
985410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new CirclePathBench(FLAGS11); )
986410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com
987410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new SawToothPathBench(FLAGS00); )
988410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new SawToothPathBench(FLAGS01); )
989410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com
990410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new LongCurvedPathBench(FLAGS00); )
991410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new LongCurvedPathBench(FLAGS01); )
992410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new LongLinePathBench(FLAGS00); )
993410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new LongLinePathBench(FLAGS01); )
994410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com
995410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new PathCreateBench(); )
996410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new PathCopyBench(); )
997410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new PathTransformBench(true); )
998410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new PathTransformBench(false); )
999410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new PathEqualityBench(); )
1000410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com
1001410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new SkBench_AddPathTest(SkBench_AddPathTest::kAdd_AddType); )
1002410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new SkBench_AddPathTest(SkBench_AddPathTest::kAddTrans_AddType); )
1003410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new SkBench_AddPathTest(SkBench_AddPathTest::kAddMatrix_AddType); )
1004410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new SkBench_AddPathTest(SkBench_AddPathTest::kReverseAdd_AddType); )
1005410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new SkBench_AddPathTest(SkBench_AddPathTest::kReversePathTo_AddType); )
1006410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com
1007410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new CirclesBench(FLAGS00); )
1008410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new CirclesBench(FLAGS01); )
1009410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ArbRoundRectBench(false); )
1010410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ArbRoundRectBench(true); )
1011410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ConservativelyContainsBench(ConservativelyContainsBench::kRect_Type); )
1012410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ConservativelyContainsBench(ConservativelyContainsBench::kRoundRect_Type); )
1013410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ConservativelyContainsBench(ConservativelyContainsBench::kOval_Type); )
1014410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com
1015410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ConicBench_Chop5() )
1016410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ConicBench_ChopHalf() )
1017410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ConicBench_ComputeError() )
1018410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ConicBench_asQuadTol() )
1019410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ConicBench_quadPow2() )
1020