1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc.
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */
7d3ebb48320cf1b7e969974673e4bd7743816985ebungeman
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"
13d3ebb48320cf1b7e969974673e4bd7743816985ebungeman#include "SkPath.h"
146e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com#include "SkRandom.h"
15d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com#include "SkShader.h"
16d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com#include "SkString.h"
1730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com#include "SkTArray.h"
1830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
19d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.comenum Flags {
20d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com    kStroke_Flag = 1 << 0,
21d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com    kBig_Flag    = 1 << 1
22d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com};
23d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com
24d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com#define FLAGS00  Flags(0)
25d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com#define FLAGS01  Flags(kStroke_Flag)
26d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com#define FLAGS10  Flags(kBig_Flag)
27d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com#define FLAGS11  Flags(kStroke_Flag | kBig_Flag)
28d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com
29f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass PathBench : public Benchmark {
30d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com    SkPaint     fPaint;
31d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com    SkString    fName;
32d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com    Flags       fFlags;
33d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.compublic:
34410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    PathBench(Flags flags) : fFlags(flags) {
35d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        fPaint.setStyle(flags & kStroke_Flag ? SkPaint::kStroke_Style :
36d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com                        SkPaint::kFill_Style);
37d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        fPaint.setStrokeWidth(SkIntToScalar(5));
38d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        fPaint.setStrokeJoin(SkPaint::kBevel_Join);
39d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com    }
40d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com
41d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com    virtual void appendName(SkString*) = 0;
42d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com    virtual void makePath(SkPath*) = 0;
436e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com    virtual int complexity() { return 0; }
44d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com
45d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.comprotected:
4636352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    const char* onGetName() override {
47d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        fName.printf("path_%s_%s_",
48d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com                     fFlags & kStroke_Flag ? "stroke" : "fill",
49d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com                     fFlags & kBig_Flag ? "big" : "small");
50d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        this->appendName(&fName);
51d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        return fName.c_str();
52d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com    }
53d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com
54a1ebeb25e9acfcd801e089e063311d716b83b8a5mtklein    void onDraw(int loops, SkCanvas* canvas) override {
55d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        SkPaint paint(fPaint);
56d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        this->setupPaint(&paint);
57d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com
58d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        SkPath path;
59d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        this->makePath(&path);
60d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        if (fFlags & kBig_Flag) {
611d24b8dfe9aac9cadaf3914b8574a4ff6e9bc19drobertphillips            const SkMatrix m = SkMatrix::MakeScale(SkIntToScalar(10), SkIntToScalar(10));
62d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com            path.transform(m);
63d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        }
64d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com
65d29f0e7ccb84993562f34f2d8e3933a19a3ed676Yuqian Li        for (int i = 0; i < loops; i++) {
66d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com            canvas->drawPath(path, paint);
67d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        }
68d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com    }
69d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com
70d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.comprivate:
71f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina    typedef Benchmark INHERITED;
72d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com};
73d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com
74d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.comclass TrianglePathBench : public PathBench {
75d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.compublic:
76410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    TrianglePathBench(Flags flags) : INHERITED(flags) {}
77fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
7836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void appendName(SkString* name) override {
79d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        name->append("triangle");
80d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com    }
8136352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void makePath(SkPath* path) override {
82d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        static const int gCoord[] = {
83d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com            10, 10, 15, 5, 20, 20
84d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        };
85d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        path->moveTo(SkIntToScalar(gCoord[0]), SkIntToScalar(gCoord[1]));
86d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        path->lineTo(SkIntToScalar(gCoord[2]), SkIntToScalar(gCoord[3]));
87d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        path->lineTo(SkIntToScalar(gCoord[4]), SkIntToScalar(gCoord[5]));
88d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        path->close();
89d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com    }
90d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.comprivate:
91d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com    typedef PathBench INHERITED;
92d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com};
93d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com
94d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.comclass RectPathBench : public PathBench {
95d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.compublic:
96410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    RectPathBench(Flags flags) : INHERITED(flags) {}
97fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
9836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void appendName(SkString* name) override {
99d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        name->append("rect");
100d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com    }
10136352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void makePath(SkPath* path) override {
102d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        SkRect r = { 10, 10, 20, 20 };
103d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        path->addRect(r);
104d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com    }
105d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.comprivate:
106d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com    typedef PathBench INHERITED;
107d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com};
108d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com
109a27f669f460e9186dbb3ebe3e9323acef95d41b8liyuqianclass RotatedRectBench : public PathBench {
110a27f669f460e9186dbb3ebe3e9323acef95d41b8liyuqianpublic:
111a27f669f460e9186dbb3ebe3e9323acef95d41b8liyuqian    RotatedRectBench(Flags flags, bool aa, int degrees) : INHERITED(flags) {
112a27f669f460e9186dbb3ebe3e9323acef95d41b8liyuqian        fAA = aa;
113a27f669f460e9186dbb3ebe3e9323acef95d41b8liyuqian        fDegrees = degrees;
114a27f669f460e9186dbb3ebe3e9323acef95d41b8liyuqian    }
115a27f669f460e9186dbb3ebe3e9323acef95d41b8liyuqian
116a27f669f460e9186dbb3ebe3e9323acef95d41b8liyuqian    void appendName(SkString* name) override {
117a27f669f460e9186dbb3ebe3e9323acef95d41b8liyuqian        SkString suffix;
118a27f669f460e9186dbb3ebe3e9323acef95d41b8liyuqian        suffix.printf("rotated_rect_%s_%d", fAA ? "aa" : "noaa", fDegrees);
119a27f669f460e9186dbb3ebe3e9323acef95d41b8liyuqian        name->append(suffix);
120a27f669f460e9186dbb3ebe3e9323acef95d41b8liyuqian    }
121a27f669f460e9186dbb3ebe3e9323acef95d41b8liyuqian
122a27f669f460e9186dbb3ebe3e9323acef95d41b8liyuqian    void makePath(SkPath* path) override {
123a27f669f460e9186dbb3ebe3e9323acef95d41b8liyuqian        SkRect r = { 10, 10, 20, 20 };
124a27f669f460e9186dbb3ebe3e9323acef95d41b8liyuqian        path->addRect(r);
125a27f669f460e9186dbb3ebe3e9323acef95d41b8liyuqian        SkMatrix rotateMatrix;
126a27f669f460e9186dbb3ebe3e9323acef95d41b8liyuqian        rotateMatrix.setRotate((SkScalar)fDegrees);
127a27f669f460e9186dbb3ebe3e9323acef95d41b8liyuqian        path->transform(rotateMatrix);
128a27f669f460e9186dbb3ebe3e9323acef95d41b8liyuqian    }
129a27f669f460e9186dbb3ebe3e9323acef95d41b8liyuqian
130a27f669f460e9186dbb3ebe3e9323acef95d41b8liyuqian    virtual void setupPaint(SkPaint* paint) override {
131a27f669f460e9186dbb3ebe3e9323acef95d41b8liyuqian        PathBench::setupPaint(paint);
132a27f669f460e9186dbb3ebe3e9323acef95d41b8liyuqian        paint->setAntiAlias(fAA);
133a27f669f460e9186dbb3ebe3e9323acef95d41b8liyuqian    }
134a27f669f460e9186dbb3ebe3e9323acef95d41b8liyuqianprivate:
135a27f669f460e9186dbb3ebe3e9323acef95d41b8liyuqian    typedef PathBench INHERITED;
136a27f669f460e9186dbb3ebe3e9323acef95d41b8liyuqian    int fDegrees;
137a27f669f460e9186dbb3ebe3e9323acef95d41b8liyuqian    bool fAA;
138a27f669f460e9186dbb3ebe3e9323acef95d41b8liyuqian};
139a27f669f460e9186dbb3ebe3e9323acef95d41b8liyuqian
140d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.comclass OvalPathBench : public PathBench {
141d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.compublic:
142410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    OvalPathBench(Flags flags) : INHERITED(flags) {}
143fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
14436352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void appendName(SkString* name) override {
145d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        name->append("oval");
146d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com    }
14736352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void makePath(SkPath* path) override {
148e2bfd8b7b17c7a66728883d6fb5f7b7639c73b90jvanverth@google.com        SkRect r = { 10, 10, 23, 20 };
149d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        path->addOval(r);
150d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com    }
151d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.comprivate:
152d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com    typedef PathBench INHERITED;
153d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com};
154d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com
1551647a1955fa44654102ae36df7af683bb8874175bsalomon@google.comclass CirclePathBench: public PathBench {
1561647a1955fa44654102ae36df7af683bb8874175bsalomon@google.compublic:
157410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    CirclePathBench(Flags flags) : INHERITED(flags) {}
1581647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com
15936352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void appendName(SkString* name) override {
1601647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com        name->append("circle");
1611647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com    }
16236352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void makePath(SkPath* path) override {
1631647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com        path->addCircle(SkIntToScalar(20), SkIntToScalar(20),
1641647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com                        SkIntToScalar(10));
1651647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com    }
1661647a1955fa44654102ae36df7af683bb8874175bsalomon@google.comprivate:
1671647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com    typedef PathBench INHERITED;
1681647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com};
1691647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com
1708eedbfc9ac3e14c5eac3167192cdbc5b4275adf8Yuqian Liclass NonAACirclePathBench: public CirclePathBench {
1718eedbfc9ac3e14c5eac3167192cdbc5b4275adf8Yuqian Lipublic:
1728eedbfc9ac3e14c5eac3167192cdbc5b4275adf8Yuqian Li    NonAACirclePathBench(Flags flags) : INHERITED(flags) {}
1738eedbfc9ac3e14c5eac3167192cdbc5b4275adf8Yuqian Li
1748eedbfc9ac3e14c5eac3167192cdbc5b4275adf8Yuqian Li    void appendName(SkString* name) override {
1758eedbfc9ac3e14c5eac3167192cdbc5b4275adf8Yuqian Li        name->append("nonaacircle");
1768eedbfc9ac3e14c5eac3167192cdbc5b4275adf8Yuqian Li    }
1778eedbfc9ac3e14c5eac3167192cdbc5b4275adf8Yuqian Li
1788eedbfc9ac3e14c5eac3167192cdbc5b4275adf8Yuqian Li    void setupPaint(SkPaint* paint) override {
1798eedbfc9ac3e14c5eac3167192cdbc5b4275adf8Yuqian Li        CirclePathBench::setupPaint(paint);
1808eedbfc9ac3e14c5eac3167192cdbc5b4275adf8Yuqian Li        paint->setAntiAlias(false);
1818eedbfc9ac3e14c5eac3167192cdbc5b4275adf8Yuqian Li    }
1828eedbfc9ac3e14c5eac3167192cdbc5b4275adf8Yuqian Li
1838eedbfc9ac3e14c5eac3167192cdbc5b4275adf8Yuqian Liprivate:
1848eedbfc9ac3e14c5eac3167192cdbc5b4275adf8Yuqian Li    typedef CirclePathBench INHERITED;
1858eedbfc9ac3e14c5eac3167192cdbc5b4275adf8Yuqian Li};
1868eedbfc9ac3e14c5eac3167192cdbc5b4275adf8Yuqian Li
187131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Li// Test max speedup of Analytic AA for concave paths
188131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Liclass AAAConcavePathBench : public PathBench {
189131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Lipublic:
190131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Li    AAAConcavePathBench(Flags flags) : INHERITED(flags) {}
191131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Li
192131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Li    void appendName(SkString* name) override {
193131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Li        name->append("concave_aaa");
194131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Li    }
195131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Li
196131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Li    void makePath(SkPath* path) override {
197131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Li        path->moveTo(10, 10);
198131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Li        path->lineTo(15, 10);
199131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Li        path->lineTo(15, 5);
200131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Li        path->lineTo(40, 40);
201131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Li        path->close();
202131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Li    }
203131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Li
204131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Liprivate:
205131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Li    typedef PathBench INHERITED;
206131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Li};
207131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Li
208131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Li// Test max speedup of Analytic AA for convex paths
209131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Liclass AAAConvexPathBench : public PathBench {
210131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Lipublic:
211131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Li    AAAConvexPathBench(Flags flags) : INHERITED(flags) {}
212131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Li
213131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Li    void appendName(SkString* name) override {
214131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Li        name->append("convex_aaa");
215131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Li    }
216131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Li
217131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Li    void makePath(SkPath* path) override {
218131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Li        path->moveTo(10, 10);
219131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Li        path->lineTo(15, 10);
220131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Li        path->lineTo(40, 50);
221131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Li        path->close();
222131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Li    }
223131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Li
224131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Liprivate:
225131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Li    typedef PathBench INHERITED;
226131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Li};
227131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Li
228d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.comclass SawToothPathBench : public PathBench {
229d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.compublic:
230410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    SawToothPathBench(Flags flags) : INHERITED(flags) {}
231fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
23236352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void appendName(SkString* name) override {
233d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        name->append("sawtooth");
234d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com    }
235f059900f75639f1b1a03f2c25333ef9aa22d58b8mtklein    void makePath(SkPath* path) override {
236d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        SkScalar x = SkIntToScalar(20);
237d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        SkScalar y = SkIntToScalar(20);
238d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        const SkScalar x0 = x;
239d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        const SkScalar dx = SK_Scalar1 * 5;
240d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        const SkScalar dy = SK_Scalar1 * 10;
241d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com
242d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        path->moveTo(x, y);
243d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        for (int i = 0; i < 32; i++) {
244d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com            x += dx;
245d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com            path->lineTo(x, y - dy);
246d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com            x += dx;
247d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com            path->lineTo(x, y + dy);
248d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        }
249d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        path->lineTo(x, y + 2 * dy);
250d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        path->lineTo(x0, y + 2 * dy);
251d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com        path->close();
252d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com    }
25336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    int complexity() override { return 1; }
2546e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.comprivate:
2556e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com    typedef PathBench INHERITED;
2566e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com};
2576e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com
2586e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.comclass LongCurvedPathBench : public PathBench {
2596e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.compublic:
260410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    LongCurvedPathBench(Flags flags) : INHERITED(flags) {}
2616e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com
26236352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void appendName(SkString* name) override {
2636e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com        name->append("long_curved");
2646e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com    }
26536352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void makePath(SkPath* path) override {
266e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org        SkRandom rand (12);
2676e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com        int i;
2686e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com        for (i = 0; i < 100; i++) {
269df85c38163245c7fc3c23cad3a4ad104949f3a62Mike Reed            path->quadTo(rand.nextUScalar1() * 640, rand.nextUScalar1() * 480,
270df85c38163245c7fc3c23cad3a4ad104949f3a62Mike Reed                         rand.nextUScalar1() * 640, rand.nextUScalar1() * 480);
2716e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com        }
2726e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com        path->close();
2736e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com    }
27436352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    int complexity() override { return 2; }
275d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.comprivate:
276d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com    typedef PathBench INHERITED;
277d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com};
278d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com
279e50f7361b4ee9fc8968e0e8a511379b3bf5f5123senorblanco@chromium.orgclass LongLinePathBench : public PathBench {
280e50f7361b4ee9fc8968e0e8a511379b3bf5f5123senorblanco@chromium.orgpublic:
281410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    LongLinePathBench(Flags flags) : INHERITED(flags) {}
282e50f7361b4ee9fc8968e0e8a511379b3bf5f5123senorblanco@chromium.org
28336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void appendName(SkString* name) override {
284e50f7361b4ee9fc8968e0e8a511379b3bf5f5123senorblanco@chromium.org        name->append("long_line");
285e50f7361b4ee9fc8968e0e8a511379b3bf5f5123senorblanco@chromium.org    }
28636352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void makePath(SkPath* path) override {
287e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org        SkRandom rand;
288e50f7361b4ee9fc8968e0e8a511379b3bf5f5123senorblanco@chromium.org        path->moveTo(rand.nextUScalar1() * 640, rand.nextUScalar1() * 480);
289e50f7361b4ee9fc8968e0e8a511379b3bf5f5123senorblanco@chromium.org        for (size_t i = 1; i < 100; i++) {
290e50f7361b4ee9fc8968e0e8a511379b3bf5f5123senorblanco@chromium.org            path->lineTo(rand.nextUScalar1() * 640, rand.nextUScalar1() * 480);
291e50f7361b4ee9fc8968e0e8a511379b3bf5f5123senorblanco@chromium.org        }
292e50f7361b4ee9fc8968e0e8a511379b3bf5f5123senorblanco@chromium.org    }
29336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    int complexity() override { return 2; }
294e50f7361b4ee9fc8968e0e8a511379b3bf5f5123senorblanco@chromium.orgprivate:
295e50f7361b4ee9fc8968e0e8a511379b3bf5f5123senorblanco@chromium.org    typedef PathBench INHERITED;
296e50f7361b4ee9fc8968e0e8a511379b3bf5f5123senorblanco@chromium.org};
2976e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com
298f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass RandomPathBench : public Benchmark {
29930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.compublic:
30036352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    bool isSuitableFor(Backend backend) override {
301644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org        return backend == kNonRendering_Backend;
30230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    }
30330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
30430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comprotected:
30530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    void createData(int minVerbs,
30630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                    int maxVerbs,
30730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                    bool allowMoves = true,
30896fcdcc219d2a0d3579719b84b28bede76efba64halcanary                    SkRect* bounds = nullptr) {
30930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        SkRect tempBounds;
31096fcdcc219d2a0d3579719b84b28bede76efba64halcanary        if (nullptr == bounds) {
31130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com            tempBounds.setXYWH(0, 0, SK_Scalar1, SK_Scalar1);
31230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com            bounds = &tempBounds;
31330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        }
3146d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com        fVerbCnts.reset(kNumVerbCnts);
3156d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com        for (int i = 0; i < kNumVerbCnts; ++i) {
3166d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com            fVerbCnts[i] = fRandom.nextRangeU(minVerbs, maxVerbs + 1);
3176d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com        }
3186d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com        fVerbs.reset(kNumVerbs);
3196d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com        for (int i = 0; i < kNumVerbs; ++i) {
3206d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com            do {
3216d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com                fVerbs[i] = static_cast<SkPath::Verb>(fRandom.nextULessThan(SkPath::kDone_Verb));
3226d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com            } while (!allowMoves && SkPath::kMove_Verb == fVerbs[i]);
3236d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com        }
3246d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com        fPoints.reset(kNumPoints);
3256d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com        for (int i = 0; i < kNumPoints; ++i) {
3266d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com            fPoints[i].set(fRandom.nextRangeScalar(bounds->fLeft, bounds->fRight),
3276d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com                           fRandom.nextRangeScalar(bounds->fTop, bounds->fBottom));
32830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        }
32930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        this->restartMakingPaths();
33030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    }
33130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
33230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    void restartMakingPaths() {
33330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        fCurrPath = 0;
33430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        fCurrVerb = 0;
33530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        fCurrPoint = 0;
33630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    }
33730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
33830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    void makePath(SkPath* path) {
3396d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com        int vCount = fVerbCnts[(fCurrPath++) & (kNumVerbCnts - 1)];
34030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        for (int v = 0; v < vCount; ++v) {
3416d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com            int verb = fVerbs[(fCurrVerb++) & (kNumVerbs - 1)];
3426d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com            switch (verb) {
34330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                case SkPath::kMove_Verb:
3446d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com                    path->moveTo(fPoints[(fCurrPoint++) & (kNumPoints - 1)]);
34530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                    break;
34630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                case SkPath::kLine_Verb:
3476d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com                    path->lineTo(fPoints[(fCurrPoint++) & (kNumPoints - 1)]);
34830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                    break;
34930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                case SkPath::kQuad_Verb:
350373ebc634573364c27b1ebd35bb537ef1285cba4bsalomon@google.com                    path->quadTo(fPoints[(fCurrPoint + 0) & (kNumPoints - 1)],
351373ebc634573364c27b1ebd35bb537ef1285cba4bsalomon@google.com                                 fPoints[(fCurrPoint + 1) & (kNumPoints - 1)]);
352373ebc634573364c27b1ebd35bb537ef1285cba4bsalomon@google.com                    fCurrPoint += 2;
35330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                    break;
354277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com                case SkPath::kConic_Verb:
355277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com                    path->conicTo(fPoints[(fCurrPoint + 0) & (kNumPoints - 1)],
356277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com                                  fPoints[(fCurrPoint + 1) & (kNumPoints - 1)],
357277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com                                  SK_ScalarHalf);
358277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com                    fCurrPoint += 2;
359277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com                    break;
36030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                case SkPath::kCubic_Verb:
361373ebc634573364c27b1ebd35bb537ef1285cba4bsalomon@google.com                    path->cubicTo(fPoints[(fCurrPoint + 0) & (kNumPoints - 1)],
362373ebc634573364c27b1ebd35bb537ef1285cba4bsalomon@google.com                                  fPoints[(fCurrPoint + 1) & (kNumPoints - 1)],
363373ebc634573364c27b1ebd35bb537ef1285cba4bsalomon@google.com                                  fPoints[(fCurrPoint + 2) & (kNumPoints - 1)]);
364373ebc634573364c27b1ebd35bb537ef1285cba4bsalomon@google.com                    fCurrPoint += 3;
36530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                    break;
36630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                case SkPath::kClose_Verb:
36730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                    path->close();
36830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                    break;
36930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                default:
37030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                    SkDEBUGFAIL("Unexpected path verb");
37130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                    break;
37230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com            }
37330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        }
37430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    }
37530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
37630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    void finishedMakingPaths() {
3776d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com        fVerbCnts.reset(0);
3786d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com        fVerbs.reset(0);
3796d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com        fPoints.reset(0);
38030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    }
38130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
38230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comprivate:
3836d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com    enum {
3846d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com        // these should all be pow 2
385b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com        kNumVerbCnts = 1 << 5,
386b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com        kNumVerbs    = 1 << 5,
387b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com        kNumPoints   = 1 << 5,
3886d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com    };
3896d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com    SkAutoTArray<int>           fVerbCnts;
3906d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com    SkAutoTArray<SkPath::Verb>  fVerbs;
3916d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com    SkAutoTArray<SkPoint>       fPoints;
3926d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com    int                         fCurrPath;
3936d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com    int                         fCurrVerb;
3946d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com    int                         fCurrPoint;
395e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org    SkRandom                    fRandom;
396f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina    typedef Benchmark INHERITED;
39730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com};
39830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
39930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comclass PathCreateBench : public RandomPathBench {
40030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.compublic:
401410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    PathCreateBench()  {
40230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    }
40330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
40430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comprotected:
40536352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    const char* onGetName() override {
40630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        return "path_create";
40730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    }
40830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
4098a6697af95b340aad6dee7e6228048fa305c1e59joshualitt    void onDelayedSetup() override {
4106d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com        this->createData(10, 100);
41130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    }
41230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
413a1ebeb25e9acfcd801e089e063311d716b83b8a5mtklein    void onDraw(int loops, SkCanvas*) override {
4143361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int i = 0; i < loops; ++i) {
4158f88117940ebb0a7f514194a4ad3384073c1f145commit-bot@chromium.org            if (i % 1000 == 0) {
4168f88117940ebb0a7f514194a4ad3384073c1f145commit-bot@chromium.org                fPath.reset();  // PathRef memory can grow without bound otherwise.
4178f88117940ebb0a7f514194a4ad3384073c1f145commit-bot@chromium.org            }
4188f88117940ebb0a7f514194a4ad3384073c1f145commit-bot@chromium.org            this->makePath(&fPath);
41930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        }
42030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        this->restartMakingPaths();
42130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    }
42230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
42330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comprivate:
4248f88117940ebb0a7f514194a4ad3384073c1f145commit-bot@chromium.org    SkPath fPath;
42530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
42630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    typedef RandomPathBench INHERITED;
42730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com};
42830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
42930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comclass PathCopyBench : public RandomPathBench {
43030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.compublic:
431410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    PathCopyBench()  {
43230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    }
43330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
43430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comprotected:
43536352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    const char* onGetName() override {
43630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        return "path_copy";
43730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    }
4388a6697af95b340aad6dee7e6228048fa305c1e59joshualitt    void onDelayedSetup() override {
4396d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com        this->createData(10, 100);
440b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com        fPaths.reset(kPathCnt);
441b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com        fCopies.reset(kPathCnt);
442b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com        for (int i = 0; i < kPathCnt; ++i) {
44330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com            this->makePath(&fPaths[i]);
44430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        }
44530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        this->finishedMakingPaths();
44630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    }
447a1ebeb25e9acfcd801e089e063311d716b83b8a5mtklein    void onDraw(int loops, SkCanvas*) override {
4483361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int i = 0; i < loops; ++i) {
449b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com            int idx = i & (kPathCnt - 1);
450b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com            fCopies[idx] = fPaths[idx];
45130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        }
45230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    }
45330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
45430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comprivate:
455b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com    enum {
456b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com        // must be a pow 2
457b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com        kPathCnt = 1 << 5,
458b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com    };
459b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com    SkAutoTArray<SkPath> fPaths;
460b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com    SkAutoTArray<SkPath> fCopies;
46130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
46230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    typedef RandomPathBench INHERITED;
46330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com};
46430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
46530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comclass PathTransformBench : public RandomPathBench {
46630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.compublic:
467410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    PathTransformBench(bool inPlace) : fInPlace(inPlace) {}
46830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
46930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comprotected:
47036352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    const char* onGetName() override {
47130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        return fInPlace ? "path_transform_in_place" : "path_transform_copy";
47230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    }
47330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
4748a6697af95b340aad6dee7e6228048fa305c1e59joshualitt    void onDelayedSetup() override {
47530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        fMatrix.setScale(5 * SK_Scalar1, 6 * SK_Scalar1);
4766d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com        this->createData(10, 100);
477b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com        fPaths.reset(kPathCnt);
478b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com        for (int i = 0; i < kPathCnt; ++i) {
47930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com            this->makePath(&fPaths[i]);
48030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        }
481b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com        this->finishedMakingPaths();
48230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        if (!fInPlace) {
483b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com            fTransformed.reset(kPathCnt);
48430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        }
48530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    }
48630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
487a1ebeb25e9acfcd801e089e063311d716b83b8a5mtklein    void onDraw(int loops, SkCanvas*) override {
48830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        if (fInPlace) {
4893361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org            for (int i = 0; i < loops; ++i) {
490b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com                fPaths[i & (kPathCnt - 1)].transform(fMatrix);
49130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com            }
49230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        } else {
4933361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org            for (int i = 0; i < loops; ++i) {
494b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com                int idx = i & (kPathCnt - 1);
495b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com                fPaths[idx].transform(fMatrix, &fTransformed[idx]);
49630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com            }
49730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        }
49830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    }
49930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
50030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comprivate:
501b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com    enum {
502b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com        // must be a pow 2
503b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com        kPathCnt = 1 << 5,
504b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com    };
505b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com    SkAutoTArray<SkPath> fPaths;
506b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com    SkAutoTArray<SkPath> fTransformed;
507b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com
50830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    SkMatrix fMatrix;
50930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    bool fInPlace;
51030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    typedef RandomPathBench INHERITED;
51130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com};
51230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
51330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comclass PathEqualityBench : public RandomPathBench {
51430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.compublic:
515410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    PathEqualityBench() { }
51630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
51730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comprotected:
51836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    const char* onGetName() override {
51930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        return "path_equality_50%";
52030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    }
52130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
5228a6697af95b340aad6dee7e6228048fa305c1e59joshualitt    void onDelayedSetup() override {
52330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        fParity = 0;
5246d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com        this->createData(10, 100);
525b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com        fPaths.reset(kPathCnt);
526b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com        fCopies.reset(kPathCnt);
527b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com        for (int i = 0; i < kPathCnt; ++i) {
52830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com            this->makePath(&fPaths[i]);
52930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com            fCopies[i] = fPaths[i];
53030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        }
53130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        this->finishedMakingPaths();
53230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    }
53330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
534a1ebeb25e9acfcd801e089e063311d716b83b8a5mtklein    void onDraw(int loops, SkCanvas*) override {
5353361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int i = 0; i < loops; ++i) {
536b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com            int idx = i & (kPathCnt - 1);
537b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com            fParity ^= (fPaths[idx] == fCopies[idx & ~0x1]);
53830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        }
53930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    }
54030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
54130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comprivate:
54230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    bool fParity; // attempt to keep compiler from optimizing out the ==
543b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com    enum {
544b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com        // must be a pow 2
545b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com        kPathCnt = 1 << 5,
546b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com    };
547b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com    SkAutoTArray<SkPath> fPaths;
548b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com    SkAutoTArray<SkPath> fCopies;
54930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    typedef RandomPathBench INHERITED;
55030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com};
55130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
55230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comclass SkBench_AddPathTest : public RandomPathBench {
55330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.compublic:
55430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    enum AddType {
55530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        kAdd_AddType,
55630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        kAddTrans_AddType,
55730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        kAddMatrix_AddType,
55830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        kReverseAdd_AddType,
55930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        kReversePathTo_AddType,
56030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    };
56130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
562410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    SkBench_AddPathTest(AddType type) : fType(type) {
56330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        fMatrix.setRotate(60 * SK_Scalar1);
56430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    }
56530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
56630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comprotected:
56736352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    const char* onGetName() override {
56830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        switch (fType) {
56930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com            case kAdd_AddType:
57030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                return "path_add_path";
57130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com            case kAddTrans_AddType:
57230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                return "path_add_path_trans";
57330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com            case kAddMatrix_AddType:
57430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                return "path_add_path_matrix";
57530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com            case kReverseAdd_AddType:
57630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                return "path_reverse_add_path";
57730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com            case kReversePathTo_AddType:
57830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                return "path_reverse_path_to";
57930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com            default:
58030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                SkDEBUGFAIL("Bad add type");
58130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                return "";
58230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        }
58330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    }
58430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
5858a6697af95b340aad6dee7e6228048fa305c1e59joshualitt    void onDelayedSetup() override {
586a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org        // reversePathTo assumes a single contour path.
587a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org        bool allowMoves = kReversePathTo_AddType != fType;
5886d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com        this->createData(10, 100, allowMoves);
589b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com        fPaths0.reset(kPathCnt);
590b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com        fPaths1.reset(kPathCnt);
591b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com        for (int i = 0; i < kPathCnt; ++i) {
59230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com            this->makePath(&fPaths0[i]);
59330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com            this->makePath(&fPaths1[i]);
59430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        }
59530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        this->finishedMakingPaths();
59630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    }
59730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
598a1ebeb25e9acfcd801e089e063311d716b83b8a5mtklein    void onDraw(int loops, SkCanvas*) override {
59930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        switch (fType) {
60030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com            case kAdd_AddType:
6013361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org                for (int i = 0; i < loops; ++i) {
602b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com                    int idx = i & (kPathCnt - 1);
603b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com                    SkPath result = fPaths0[idx];
604b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com                    result.addPath(fPaths1[idx]);
60530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                }
60630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                break;
60730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com            case kAddTrans_AddType:
6083361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org                for (int i = 0; i < loops; ++i) {
609b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com                    int idx = i & (kPathCnt - 1);
610b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com                    SkPath result = fPaths0[idx];
611b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com                    result.addPath(fPaths1[idx], 2 * SK_Scalar1, 5 * SK_Scalar1);
61230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                }
61330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                break;
61430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com            case kAddMatrix_AddType:
6153361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org                for (int i = 0; i < loops; ++i) {
616b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com                    int idx = i & (kPathCnt - 1);
617b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com                    SkPath result = fPaths0[idx];
618b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com                    result.addPath(fPaths1[idx], fMatrix);
61930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                }
62030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                break;
62130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com            case kReverseAdd_AddType:
6223361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org                for (int i = 0; i < loops; ++i) {
623b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com                    int idx = i & (kPathCnt - 1);
624b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com                    SkPath result = fPaths0[idx];
625b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com                    result.reverseAddPath(fPaths1[idx]);
62630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                }
62730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                break;
62830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com            case kReversePathTo_AddType:
6293361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org                for (int i = 0; i < loops; ++i) {
630b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com                    int idx = i & (kPathCnt - 1);
631b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com                    SkPath result = fPaths0[idx];
632b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com                    result.reversePathTo(fPaths1[idx]);
63330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                }
63430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com                break;
63530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com        }
63630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    }
63730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com
63830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comprivate:
63930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    AddType fType; // or reverseAddPath
640b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com    enum {
641b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com        // must be a pow 2
642b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com        kPathCnt = 1 << 5,
643b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com    };
644b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com    SkAutoTArray<SkPath> fPaths0;
645b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com    SkAutoTArray<SkPath> fPaths1;
64630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    SkMatrix         fMatrix;
64730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com    typedef RandomPathBench INHERITED;
64830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com};
6496e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com
65017bb458fe897411218d8c9781770948d4398b723robertphillips@google.com
651f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass CirclesBench : public Benchmark {
65217bb458fe897411218d8c9781770948d4398b723robertphillips@google.comprotected:
65317bb458fe897411218d8c9781770948d4398b723robertphillips@google.com    SkString            fName;
65446d3d39e65e0b3ea2ad7c91c176ccafb4df0fa24jvanverth@google.com    Flags               fFlags;
65517bb458fe897411218d8c9781770948d4398b723robertphillips@google.com
65617bb458fe897411218d8c9781770948d4398b723robertphillips@google.compublic:
657410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    CirclesBench(Flags flags) : fFlags(flags) {
65846d3d39e65e0b3ea2ad7c91c176ccafb4df0fa24jvanverth@google.com        fName.printf("circles_%s", fFlags & kStroke_Flag ? "stroke" : "fill");
65917bb458fe897411218d8c9781770948d4398b723robertphillips@google.com    }
66017bb458fe897411218d8c9781770948d4398b723robertphillips@google.com
66117bb458fe897411218d8c9781770948d4398b723robertphillips@google.comprotected:
66236352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    const char* onGetName() override {
66317bb458fe897411218d8c9781770948d4398b723robertphillips@google.com        return fName.c_str();
66417bb458fe897411218d8c9781770948d4398b723robertphillips@google.com    }
66517bb458fe897411218d8c9781770948d4398b723robertphillips@google.com
666a1ebeb25e9acfcd801e089e063311d716b83b8a5mtklein    void onDraw(int loops, SkCanvas* canvas) override {
66717bb458fe897411218d8c9781770948d4398b723robertphillips@google.com        SkPaint paint;
66817bb458fe897411218d8c9781770948d4398b723robertphillips@google.com
66917bb458fe897411218d8c9781770948d4398b723robertphillips@google.com        paint.setColor(SK_ColorBLACK);
67017bb458fe897411218d8c9781770948d4398b723robertphillips@google.com        paint.setAntiAlias(true);
67146d3d39e65e0b3ea2ad7c91c176ccafb4df0fa24jvanverth@google.com        if (fFlags & kStroke_Flag) {
67246d3d39e65e0b3ea2ad7c91c176ccafb4df0fa24jvanverth@google.com            paint.setStyle(SkPaint::kStroke_Style);
67346d3d39e65e0b3ea2ad7c91c176ccafb4df0fa24jvanverth@google.com        }
67417bb458fe897411218d8c9781770948d4398b723robertphillips@google.com
675e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org        SkRandom rand;
67617bb458fe897411218d8c9781770948d4398b723robertphillips@google.com
67717bb458fe897411218d8c9781770948d4398b723robertphillips@google.com        SkRect r;
67817bb458fe897411218d8c9781770948d4398b723robertphillips@google.com
6793361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int i = 0; i < loops; ++i) {
68017bb458fe897411218d8c9781770948d4398b723robertphillips@google.com            SkScalar radius = rand.nextUScalar1() * 3;
68117bb458fe897411218d8c9781770948d4398b723robertphillips@google.com            r.fLeft = rand.nextUScalar1() * 300;
68217bb458fe897411218d8c9781770948d4398b723robertphillips@google.com            r.fTop =  rand.nextUScalar1() * 300;
68317bb458fe897411218d8c9781770948d4398b723robertphillips@google.com            r.fRight =  r.fLeft + 2 * radius;
68417bb458fe897411218d8c9781770948d4398b723robertphillips@google.com            r.fBottom = r.fTop + 2 * radius;
68517bb458fe897411218d8c9781770948d4398b723robertphillips@google.com
68646d3d39e65e0b3ea2ad7c91c176ccafb4df0fa24jvanverth@google.com            if (fFlags & kStroke_Flag) {
68746d3d39e65e0b3ea2ad7c91c176ccafb4df0fa24jvanverth@google.com                paint.setStrokeWidth(rand.nextUScalar1() * 5.0f);
68846d3d39e65e0b3ea2ad7c91c176ccafb4df0fa24jvanverth@google.com            }
68946d3d39e65e0b3ea2ad7c91c176ccafb4df0fa24jvanverth@google.com
69017bb458fe897411218d8c9781770948d4398b723robertphillips@google.com            SkPath temp;
69117bb458fe897411218d8c9781770948d4398b723robertphillips@google.com
69217bb458fe897411218d8c9781770948d4398b723robertphillips@google.com            // mimic how Chrome does circles
69317bb458fe897411218d8c9781770948d4398b723robertphillips@google.com            temp.arcTo(r, 0, 0, false);
69417bb458fe897411218d8c9781770948d4398b723robertphillips@google.com            temp.addOval(r, SkPath::kCCW_Direction);
69517bb458fe897411218d8c9781770948d4398b723robertphillips@google.com            temp.arcTo(r, 360, 0, true);
69617bb458fe897411218d8c9781770948d4398b723robertphillips@google.com            temp.close();
697fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
69817bb458fe897411218d8c9781770948d4398b723robertphillips@google.com            canvas->drawPath(temp, paint);
69917bb458fe897411218d8c9781770948d4398b723robertphillips@google.com        }
70017bb458fe897411218d8c9781770948d4398b723robertphillips@google.com    }
70117bb458fe897411218d8c9781770948d4398b723robertphillips@google.com
70217bb458fe897411218d8c9781770948d4398b723robertphillips@google.comprivate:
703f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina    typedef Benchmark INHERITED;
70417bb458fe897411218d8c9781770948d4398b723robertphillips@google.com};
70517bb458fe897411218d8c9781770948d4398b723robertphillips@google.com
70646d3d39e65e0b3ea2ad7c91c176ccafb4df0fa24jvanverth@google.com
707158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com// Chrome creates its own round rects with each corner possibly being different.
708158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com// In its "zero radius" incarnation it creates degenerate round rects.
7091e34ff7030c95a96c3cd5940de9b4dda4e1cef86skia.committer@gmail.com// Note: PathTest::test_arb_round_rect_is_convex and
710158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com// test_arb_zero_rad_round_rect_is_rect perform almost exactly
711b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com// the same test (but with no drawing)
712f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass ArbRoundRectBench : public Benchmark {
713f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.comprotected:
714f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com    SkString            fName;
715f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com
716f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.compublic:
717410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    ArbRoundRectBench(bool zeroRad) : fZeroRad(zeroRad) {
718158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com        if (zeroRad) {
719158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com            fName.printf("zeroradroundrect");
720158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com        } else {
721158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com            fName.printf("arbroundrect");
722158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com        }
723f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com    }
724f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com
725f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.comprotected:
72636352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    const char* onGetName() override {
727f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com        return fName.c_str();
728f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com    }
729f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com
730989a95ea77230e8347da18876e1bd5f39a78ebb5skia.committer@gmail.com    static void add_corner_arc(SkPath* path, const SkRect& rect,
731989a95ea77230e8347da18876e1bd5f39a78ebb5skia.committer@gmail.com                               SkScalar xIn, SkScalar yIn,
732f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com                               int startAngle)
733f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com    {
734f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com
735f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com        SkScalar rx = SkMinScalar(rect.width(), xIn);
736f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com        SkScalar ry = SkMinScalar(rect.height(), yIn);
737f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com
738f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com        SkRect arcRect;
739f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com        arcRect.set(-rx, -ry, rx, ry);
740f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com        switch (startAngle) {
741f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com        case 0:
742f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com            arcRect.offset(rect.fRight - arcRect.fRight, rect.fBottom - arcRect.fBottom);
743f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com            break;
744f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com        case 90:
745f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com            arcRect.offset(rect.fLeft - arcRect.fLeft, rect.fBottom - arcRect.fBottom);
746f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com            break;
747f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com        case 180:
748f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com            arcRect.offset(rect.fLeft - arcRect.fLeft, rect.fTop - arcRect.fTop);
749f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com            break;
750f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com        case 270:
751f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com            arcRect.offset(rect.fRight - arcRect.fRight, rect.fTop - arcRect.fTop);
752f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com            break;
753f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com        default:
754f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com            break;
755f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com        }
756f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com
757f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com        path->arcTo(arcRect, SkIntToScalar(startAngle), SkIntToScalar(90), false);
758f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com    }
759f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com
760989a95ea77230e8347da18876e1bd5f39a78ebb5skia.committer@gmail.com    static void make_arb_round_rect(SkPath* path, const SkRect& r,
761f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com                                    SkScalar xCorner, SkScalar yCorner) {
762f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com        // we are lazy here and use the same x & y for each corner
763f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com        add_corner_arc(path, r, xCorner, yCorner, 270);
764f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com        add_corner_arc(path, r, xCorner, yCorner, 0);
765f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com        add_corner_arc(path, r, xCorner, yCorner, 90);
766f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com        add_corner_arc(path, r, xCorner, yCorner, 180);
767158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com        path->close();
768f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com
769b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com        SkASSERT(path->isConvex());
770f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com    }
771f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com
772a1ebeb25e9acfcd801e089e063311d716b83b8a5mtklein    void onDraw(int loops, SkCanvas* canvas) override {
773e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org        SkRandom rand;
774f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com        SkRect r;
775f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com
7763361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int i = 0; i < loops; ++i) {
777f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com            SkPaint paint;
778f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com            paint.setColor(0xff000000 | rand.nextU());
779f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com            paint.setAntiAlias(true);
780f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com
781158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com            SkScalar size = rand.nextUScalar1() * 30;
782158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com            if (size < SK_Scalar1) {
783b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com                continue;
784b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com            }
785f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com            r.fLeft = rand.nextUScalar1() * 300;
786f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com            r.fTop =  rand.nextUScalar1() * 300;
787158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com            r.fRight =  r.fLeft + 2 * size;
788158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com            r.fBottom = r.fTop + 2 * size;
789f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com
790f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com            SkPath temp;
791f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com
792158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com            if (fZeroRad) {
793158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com                make_arb_round_rect(&temp, r, 0, 0);
794158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com
79596fcdcc219d2a0d3579719b84b28bede76efba64halcanary                SkASSERT(temp.isRect(nullptr));
796158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com            } else {
797158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com                make_arb_round_rect(&temp, r, r.width() / 10, r.height() / 15);
798158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com            }
799f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com
800f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com            canvas->drawPath(temp, paint);
801f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com        }
802f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com    }
803f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com
804f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.comprivate:
805158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com    bool fZeroRad;      // should 0 radius rounds rects be tested?
806158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com
807f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina    typedef Benchmark INHERITED;
808f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com};
809f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com
810f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass ConservativelyContainsBench : public Benchmark {
8119bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.compublic:
8129bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com    enum Type {
8139bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com        kRect_Type,
8149bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com        kRoundRect_Type,
8159bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com        kOval_Type,
8169bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com    };
8179bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com
818410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    ConservativelyContainsBench(Type type)  {
8199bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com        fParity = false;
8209bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com        fName = "conservatively_contains_";
8219bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com        switch (type) {
8229bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com            case kRect_Type:
8239bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com                fName.append("rect");
8249bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com                fPath.addRect(kBaseRect);
8259bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com                break;
8269bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com            case kRoundRect_Type:
8279bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com                fName.append("round_rect");
8289bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com                fPath.addRoundRect(kBaseRect, kRRRadii[0], kRRRadii[1]);
8299bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com                break;
8309bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com            case kOval_Type:
8319bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com                fName.append("oval");
8329bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com                fPath.addOval(kBaseRect);
8339bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com                break;
8349bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com        }
8359bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com    }
8369bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com
83736352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    bool isSuitableFor(Backend backend) override {
838644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org        return backend == kNonRendering_Backend;
839644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org    }
840644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org
8419bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.comprivate:
84236352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    const char* onGetName() override {
8439bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com        return fName.c_str();
8449bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com    }
8459bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com
846a1ebeb25e9acfcd801e089e063311d716b83b8a5mtklein    void onDraw(int loops, SkCanvas*) override {
8473361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int i = 0; i < loops; ++i) {
8489bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com            const SkRect& rect = fQueryRects[i % kQueryRectCnt];
8499bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com            fParity = fParity != fPath.conservativelyContainsRect(rect);
8509bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com        }
8519bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com    }
8529bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com
8538a6697af95b340aad6dee7e6228048fa305c1e59joshualitt    void onDelayedSetup() override {
8549bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com        fQueryRects.setCount(kQueryRectCnt);
8559bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com
856e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org        SkRandom rand;
8579bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com        for (int i = 0; i < kQueryRectCnt; ++i) {
8589bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com            SkSize size;
8599bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com            SkPoint xy;
8609bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com            size.fWidth = rand.nextRangeScalar(kQueryMin.fWidth,  kQueryMax.fWidth);
8619bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com            size.fHeight = rand.nextRangeScalar(kQueryMin.fHeight, kQueryMax.fHeight);
8629bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com            xy.fX = rand.nextRangeScalar(kBounds.fLeft, kBounds.fRight - size.fWidth);
8639bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com            xy.fY = rand.nextRangeScalar(kBounds.fTop, kBounds.fBottom - size.fHeight);
8649bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com
8659bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com            fQueryRects[i] = SkRect::MakeXYWH(xy.fX, xy.fY, size.fWidth, size.fHeight);
8669bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com        }
8679bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com    }
8689bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com
8699bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com    enum {
8709bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com        kQueryRectCnt = 400,
8719bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com    };
8729bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com    static const SkRect kBounds;   // bounds for all random query rects
8739bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com    static const SkSize kQueryMin; // minimum query rect size, should be <= kQueryMax
8749bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com    static const SkSize kQueryMax; // max query rect size, should < kBounds
8759bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com    static const SkRect kBaseRect; // rect that is used to construct the path
8769bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com    static const SkScalar kRRRadii[2]; // x and y radii for round rect
8779bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com
8789bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com    SkString            fName;
8799bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com    SkPath              fPath;
8809bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com    bool                fParity;
8819bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com    SkTDArray<SkRect>   fQueryRects;
8829bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com
883f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina    typedef Benchmark INHERITED;
8849bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com};
8859bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com
8868d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org///////////////////////////////////////////////////////////////////////////////
8878d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org
8888d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org#include "SkGeometry.h"
8898d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org
89055011038816a3fc7f0c0a39d482fb85347cc2e78reedclass ConicBench_Chop : public Benchmark {
891b640203cd5733aaf110277e28e22007c5b541565reedprotected:
892b640203cd5733aaf110277e28e22007c5b541565reed    SkConic fRQ, fDst[2];
893b640203cd5733aaf110277e28e22007c5b541565reed    SkString fName;
8948d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.orgpublic:
89555011038816a3fc7f0c0a39d482fb85347cc2e78reed    ConicBench_Chop() : fName("conic-chop") {
8968d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org        fRQ.fPts[0].set(0, 0);
8978d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org        fRQ.fPts[1].set(100, 0);
8988d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org        fRQ.fPts[2].set(100, 100);
8998d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org        fRQ.fW = SkScalarCos(SK_ScalarPI/4);
9008d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org    }
901815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com
90236352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    bool isSuitableFor(Backend backend) override {
903b640203cd5733aaf110277e28e22007c5b541565reed        return backend == kNonRendering_Backend;
9048d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org    }
905815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com
906b640203cd5733aaf110277e28e22007c5b541565reedprivate:
90736352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    const char* onGetName() override { return fName.c_str(); }
908b640203cd5733aaf110277e28e22007c5b541565reed
909a1ebeb25e9acfcd801e089e063311d716b83b8a5mtklein    void onDraw(int loops, SkCanvas*) override {
91055011038816a3fc7f0c0a39d482fb85347cc2e78reed        for (int i = 0; i < loops; ++i) {
91155011038816a3fc7f0c0a39d482fb85347cc2e78reed            fRQ.chop(fDst);
9128d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org        }
9138d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org    }
914815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com
915f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina    typedef Benchmark INHERITED;
916af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org};
91755011038816a3fc7f0c0a39d482fb85347cc2e78reedDEF_BENCH( return new ConicBench_Chop; )
918b640203cd5733aaf110277e28e22007c5b541565reed
91955011038816a3fc7f0c0a39d482fb85347cc2e78reedclass ConicBench_EvalPos : public ConicBench_Chop {
92055011038816a3fc7f0c0a39d482fb85347cc2e78reed    const bool fUseV2;
921b640203cd5733aaf110277e28e22007c5b541565reedpublic:
92255011038816a3fc7f0c0a39d482fb85347cc2e78reed    ConicBench_EvalPos(bool useV2) : fUseV2(useV2) {
923b640203cd5733aaf110277e28e22007c5b541565reed        fName.printf("conic-eval-pos%d", useV2);
924b640203cd5733aaf110277e28e22007c5b541565reed    }
925a1ebeb25e9acfcd801e089e063311d716b83b8a5mtklein    void onDraw(int loops, SkCanvas*) override {
926b640203cd5733aaf110277e28e22007c5b541565reed        if (fUseV2) {
927b640203cd5733aaf110277e28e22007c5b541565reed            for (int i = 0; i < loops; ++i) {
928b640203cd5733aaf110277e28e22007c5b541565reed                for (int j = 0; j < 1000; ++j) {
929b640203cd5733aaf110277e28e22007c5b541565reed                    fDst[0].fPts[0] = fRQ.evalAt(0.4f);
930b640203cd5733aaf110277e28e22007c5b541565reed                }
931b640203cd5733aaf110277e28e22007c5b541565reed            }
932b640203cd5733aaf110277e28e22007c5b541565reed        } else {
933b640203cd5733aaf110277e28e22007c5b541565reed            for (int i = 0; i < loops; ++i) {
934b640203cd5733aaf110277e28e22007c5b541565reed                for (int j = 0; j < 1000; ++j) {
93596fcdcc219d2a0d3579719b84b28bede76efba64halcanary                    fRQ.evalAt(0.4f, &fDst[0].fPts[0], nullptr);
936b640203cd5733aaf110277e28e22007c5b541565reed                }
937b640203cd5733aaf110277e28e22007c5b541565reed            }
938b640203cd5733aaf110277e28e22007c5b541565reed        }
939b640203cd5733aaf110277e28e22007c5b541565reed    }
940b640203cd5733aaf110277e28e22007c5b541565reed};
941b640203cd5733aaf110277e28e22007c5b541565reedDEF_BENCH( return new ConicBench_EvalPos(false); )
942b640203cd5733aaf110277e28e22007c5b541565reedDEF_BENCH( return new ConicBench_EvalPos(true); )
943b640203cd5733aaf110277e28e22007c5b541565reed
94455011038816a3fc7f0c0a39d482fb85347cc2e78reedclass ConicBench_EvalTan : public ConicBench_Chop {
94555011038816a3fc7f0c0a39d482fb85347cc2e78reed    const bool fUseV2;
946b640203cd5733aaf110277e28e22007c5b541565reedpublic:
94755011038816a3fc7f0c0a39d482fb85347cc2e78reed    ConicBench_EvalTan(bool useV2) : fUseV2(useV2) {
948b640203cd5733aaf110277e28e22007c5b541565reed        fName.printf("conic-eval-tan%d", useV2);
949b640203cd5733aaf110277e28e22007c5b541565reed    }
950a1ebeb25e9acfcd801e089e063311d716b83b8a5mtklein    void onDraw(int loops, SkCanvas*) override {
951b640203cd5733aaf110277e28e22007c5b541565reed        if (fUseV2) {
952b640203cd5733aaf110277e28e22007c5b541565reed            for (int i = 0; i < loops; ++i) {
953b640203cd5733aaf110277e28e22007c5b541565reed                for (int j = 0; j < 1000; ++j) {
954b640203cd5733aaf110277e28e22007c5b541565reed                    fDst[0].fPts[0] = fRQ.evalTangentAt(0.4f);
955b640203cd5733aaf110277e28e22007c5b541565reed                }
956b640203cd5733aaf110277e28e22007c5b541565reed            }
957b640203cd5733aaf110277e28e22007c5b541565reed        } else {
958b640203cd5733aaf110277e28e22007c5b541565reed            for (int i = 0; i < loops; ++i) {
959b640203cd5733aaf110277e28e22007c5b541565reed                for (int j = 0; j < 1000; ++j) {
96096fcdcc219d2a0d3579719b84b28bede76efba64halcanary                    fRQ.evalAt(0.4f, nullptr, &fDst[0].fPts[0]);
961b640203cd5733aaf110277e28e22007c5b541565reed                }
962b640203cd5733aaf110277e28e22007c5b541565reed            }
963b640203cd5733aaf110277e28e22007c5b541565reed        }
964b640203cd5733aaf110277e28e22007c5b541565reed    }
965b640203cd5733aaf110277e28e22007c5b541565reed};
966b640203cd5733aaf110277e28e22007c5b541565reedDEF_BENCH( return new ConicBench_EvalTan(false); )
967b640203cd5733aaf110277e28e22007c5b541565reedDEF_BENCH( return new ConicBench_EvalTan(true); )
968af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org
969af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org///////////////////////////////////////////////////////////////////////////////
970ab38e560e922b554ea9fa98adc4f79aee7eca8baskia.committer@gmail.com
971e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.orgstatic void rand_conic(SkConic* conic, SkRandom& rand) {
972af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org    for (int i = 0; i < 3; ++i) {
973af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org        conic->fPts[i].set(rand.nextUScalar1() * 100, rand.nextUScalar1() * 100);
974af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org    }
975af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org    if (rand.nextUScalar1() > 0.5f) {
976af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org        conic->fW = rand.nextUScalar1();
977af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org    } else {
978af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org        conic->fW = 1 + rand.nextUScalar1() * 4;
979af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org    }
980af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org}
981af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org
982f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass ConicBench : public Benchmark {
983af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgpublic:
984410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    ConicBench()  {
985e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org        SkRandom rand;
986af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org        for (int i = 0; i < CONICS; ++i) {
987af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org            rand_conic(&fConics[i], rand);
988af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org        }
989644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org    }
990644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org
99136352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    bool isSuitableFor(Backend backend) override {
992644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org        return backend == kNonRendering_Backend;
993af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org    }
994815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com
995af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgprotected:
996af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org    enum {
997af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org        CONICS = 100
998af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org    };
999af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org    SkConic fConics[CONICS];
1000815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com
1001af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgprivate:
1002f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina    typedef Benchmark INHERITED;
10038d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org};
10048d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org
1005af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgclass ConicBench_ComputeError : public ConicBench {
1006af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgpublic:
1007410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    ConicBench_ComputeError()  {}
1008815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com
1009af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgprotected:
101036352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    const char* onGetName() override {
1011af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org        return "conic-compute-error";
1012af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org    }
1013815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com
1014a1ebeb25e9acfcd801e089e063311d716b83b8a5mtklein    void onDraw(int loops, SkCanvas*) override {
1015af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org        SkVector err;
10163361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int i = 0; i < loops; ++i) {
1017af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org            for (int j = 0; j < CONICS; ++j) {
1018af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org                fConics[j].computeAsQuadError(&err);
1019af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org            }
1020af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org        }
1021af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org    }
1022815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com
1023af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgprivate:
1024af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org    typedef ConicBench INHERITED;
1025af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org};
1026af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org
1027af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgclass ConicBench_asQuadTol : public ConicBench {
1028af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgpublic:
1029410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    ConicBench_asQuadTol()  {}
1030815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com
1031af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgprotected:
103236352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    const char* onGetName() override {
1033af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org        return "conic-asQuadTol";
1034af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org    }
1035815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com
1036a1ebeb25e9acfcd801e089e063311d716b83b8a5mtklein    void onDraw(int loops, SkCanvas*) override {
10373361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int i = 0; i < loops; ++i) {
1038af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org            for (int j = 0; j < CONICS; ++j) {
1039af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org                fConics[j].asQuadTol(SK_ScalarHalf);
1040af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org            }
1041af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org        }
1042af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org    }
1043815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com
1044af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgprivate:
1045af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org    typedef ConicBench INHERITED;
1046af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org};
1047af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org
1048af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgclass ConicBench_quadPow2 : public ConicBench {
1049af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgpublic:
1050410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    ConicBench_quadPow2()  {}
1051af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org
1052af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgprotected:
105336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    const char* onGetName() override {
1054af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org        return "conic-quadPow2";
1055af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org    }
1056815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com
1057a1ebeb25e9acfcd801e089e063311d716b83b8a5mtklein    void onDraw(int loops, SkCanvas*) override {
10583361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int i = 0; i < loops; ++i) {
1059af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org            for (int j = 0; j < CONICS; ++j) {
1060af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org                fConics[j].computeQuadPOW2(SK_ScalarHalf);
1061af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org            }
1062af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org        }
1063af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org    }
1064815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com
1065af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgprivate:
1066af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org    typedef ConicBench INHERITED;
1067af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org};
1068af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org
10698d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org///////////////////////////////////////////////////////////////////////////////
10708d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org
10710d7dac8fb8c404cada8d46646a980772b9dc55d6Mike Reedclass TightBoundsBench : public Benchmark {
10720d7dac8fb8c404cada8d46646a980772b9dc55d6Mike Reed    SkPath      fPath;
10730d7dac8fb8c404cada8d46646a980772b9dc55d6Mike Reed    SkString    fName;
10748d3196bdfcf478982bec9885d21e1d664ab9a72bMike Reed    SkRect      (*fProc)(const SkPath&);
10750d7dac8fb8c404cada8d46646a980772b9dc55d6Mike Reed
10760d7dac8fb8c404cada8d46646a980772b9dc55d6Mike Reedpublic:
10778d3196bdfcf478982bec9885d21e1d664ab9a72bMike Reed    TightBoundsBench(SkRect (*proc)(const SkPath&), const char suffix[]) : fProc(proc) {
10780d7dac8fb8c404cada8d46646a980772b9dc55d6Mike Reed        fName.printf("tight_bounds_%s", suffix);
10799d5dcda7818abfb1443400b391d3b35f18ffd96aYuqian Li
10800d7dac8fb8c404cada8d46646a980772b9dc55d6Mike Reed        const int N = 100;
10810d7dac8fb8c404cada8d46646a980772b9dc55d6Mike Reed        SkRandom rand;
10820d7dac8fb8c404cada8d46646a980772b9dc55d6Mike Reed        for (int i = 0; i < N; ++i) {
10830d7dac8fb8c404cada8d46646a980772b9dc55d6Mike Reed            fPath.moveTo(rand.nextF()*100, rand.nextF()*100);
10840d7dac8fb8c404cada8d46646a980772b9dc55d6Mike Reed            fPath.lineTo(rand.nextF()*100, rand.nextF()*100);
10850d7dac8fb8c404cada8d46646a980772b9dc55d6Mike Reed            fPath.quadTo(rand.nextF()*100, rand.nextF()*100, rand.nextF()*100, rand.nextF()*100);
10860d7dac8fb8c404cada8d46646a980772b9dc55d6Mike Reed            fPath.conicTo(rand.nextF()*100, rand.nextF()*100, rand.nextF()*100, rand.nextF()*100,
10870d7dac8fb8c404cada8d46646a980772b9dc55d6Mike Reed                          rand.nextF()*10);
10880d7dac8fb8c404cada8d46646a980772b9dc55d6Mike Reed            fPath.cubicTo(rand.nextF()*100, rand.nextF()*100, rand.nextF()*100, rand.nextF()*100,
10890d7dac8fb8c404cada8d46646a980772b9dc55d6Mike Reed                          rand.nextF()*100, rand.nextF()*100);
10900d7dac8fb8c404cada8d46646a980772b9dc55d6Mike Reed        }
10910d7dac8fb8c404cada8d46646a980772b9dc55d6Mike Reed    }
10920d7dac8fb8c404cada8d46646a980772b9dc55d6Mike Reed
10930d7dac8fb8c404cada8d46646a980772b9dc55d6Mike Reedprotected:
10940d7dac8fb8c404cada8d46646a980772b9dc55d6Mike Reed    bool isSuitableFor(Backend backend) override {
10950d7dac8fb8c404cada8d46646a980772b9dc55d6Mike Reed        return backend == kNonRendering_Backend;
10960d7dac8fb8c404cada8d46646a980772b9dc55d6Mike Reed    }
10970d7dac8fb8c404cada8d46646a980772b9dc55d6Mike Reed
10980d7dac8fb8c404cada8d46646a980772b9dc55d6Mike Reed    const char* onGetName() override { return fName.c_str(); }
10999d5dcda7818abfb1443400b391d3b35f18ffd96aYuqian Li
11000d7dac8fb8c404cada8d46646a980772b9dc55d6Mike Reed    void onDraw(int loops, SkCanvas* canvas) override {
11010d7dac8fb8c404cada8d46646a980772b9dc55d6Mike Reed        for (int i = 0; i < loops*100; ++i) {
11028d3196bdfcf478982bec9885d21e1d664ab9a72bMike Reed            fProc(fPath);
11030d7dac8fb8c404cada8d46646a980772b9dc55d6Mike Reed        }
11040d7dac8fb8c404cada8d46646a980772b9dc55d6Mike Reed    }
11059d5dcda7818abfb1443400b391d3b35f18ffd96aYuqian Li
11060d7dac8fb8c404cada8d46646a980772b9dc55d6Mike Reedprivate:
11070d7dac8fb8c404cada8d46646a980772b9dc55d6Mike Reed    typedef Benchmark INHERITED;
11080d7dac8fb8c404cada8d46646a980772b9dc55d6Mike Reed};
11090d7dac8fb8c404cada8d46646a980772b9dc55d6Mike Reed
11100d7dac8fb8c404cada8d46646a980772b9dc55d6Mike Reed
11119bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.comconst SkRect ConservativelyContainsBench::kBounds = SkRect::MakeWH(SkIntToScalar(100), SkIntToScalar(100));
1112fafe135349bd34961a12bfd8185733709cd0e45eHal Canaryconst SkSize ConservativelyContainsBench::kQueryMin = {SkIntToScalar(1), SkIntToScalar(1)};
1113fafe135349bd34961a12bfd8185733709cd0e45eHal Canaryconst SkSize ConservativelyContainsBench::kQueryMax = {SkIntToScalar(40), SkIntToScalar(40)};
11149bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.comconst SkRect ConservativelyContainsBench::kBaseRect = SkRect::MakeXYWH(SkIntToScalar(25), SkIntToScalar(25), SkIntToScalar(50), SkIntToScalar(50));
11159bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.comconst SkScalar ConservativelyContainsBench::kRRRadii[2] = {SkIntToScalar(5), SkIntToScalar(10)};
11169bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com
1117410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new TrianglePathBench(FLAGS00); )
1118410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new TrianglePathBench(FLAGS01); )
1119410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new TrianglePathBench(FLAGS10); )
1120410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new TrianglePathBench(FLAGS11); )
1121410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com
1122410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new RectPathBench(FLAGS00); )
1123410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new RectPathBench(FLAGS01); )
1124410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new RectPathBench(FLAGS10); )
1125410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new RectPathBench(FLAGS11); )
1126410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com
1127a27f669f460e9186dbb3ebe3e9323acef95d41b8liyuqianDEF_BENCH( return new RotatedRectBench(FLAGS00, false, 45));
1128a27f669f460e9186dbb3ebe3e9323acef95d41b8liyuqianDEF_BENCH( return new RotatedRectBench(FLAGS10, false, 45));
1129a27f669f460e9186dbb3ebe3e9323acef95d41b8liyuqianDEF_BENCH( return new RotatedRectBench(FLAGS00, true, 45));
1130a27f669f460e9186dbb3ebe3e9323acef95d41b8liyuqianDEF_BENCH( return new RotatedRectBench(FLAGS10, true, 45));
1131a27f669f460e9186dbb3ebe3e9323acef95d41b8liyuqian
1132410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new OvalPathBench(FLAGS00); )
1133410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new OvalPathBench(FLAGS01); )
1134410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new OvalPathBench(FLAGS10); )
1135410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new OvalPathBench(FLAGS11); )
1136410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com
1137410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new CirclePathBench(FLAGS00); )
1138410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new CirclePathBench(FLAGS01); )
1139410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new CirclePathBench(FLAGS10); )
1140410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new CirclePathBench(FLAGS11); )
1141410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com
11428eedbfc9ac3e14c5eac3167192cdbc5b4275adf8Yuqian LiDEF_BENCH( return new NonAACirclePathBench(FLAGS00); )
11438eedbfc9ac3e14c5eac3167192cdbc5b4275adf8Yuqian LiDEF_BENCH( return new NonAACirclePathBench(FLAGS10); )
11448eedbfc9ac3e14c5eac3167192cdbc5b4275adf8Yuqian Li
1145131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian LiDEF_BENCH( return new AAAConcavePathBench(FLAGS00); )
1146131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian LiDEF_BENCH( return new AAAConcavePathBench(FLAGS10); )
1147131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian LiDEF_BENCH( return new AAAConvexPathBench(FLAGS00); )
1148131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian LiDEF_BENCH( return new AAAConvexPathBench(FLAGS10); )
1149131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Li
1150410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new SawToothPathBench(FLAGS00); )
1151410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new SawToothPathBench(FLAGS01); )
1152410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com
1153410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new LongCurvedPathBench(FLAGS00); )
1154410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new LongCurvedPathBench(FLAGS01); )
1155410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new LongLinePathBench(FLAGS00); )
1156410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new LongLinePathBench(FLAGS01); )
1157410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com
1158410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new PathCreateBench(); )
1159410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new PathCopyBench(); )
1160410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new PathTransformBench(true); )
1161410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new PathTransformBench(false); )
1162410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new PathEqualityBench(); )
1163410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com
1164410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new SkBench_AddPathTest(SkBench_AddPathTest::kAdd_AddType); )
1165410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new SkBench_AddPathTest(SkBench_AddPathTest::kAddTrans_AddType); )
1166410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new SkBench_AddPathTest(SkBench_AddPathTest::kAddMatrix_AddType); )
1167410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new SkBench_AddPathTest(SkBench_AddPathTest::kReverseAdd_AddType); )
1168410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new SkBench_AddPathTest(SkBench_AddPathTest::kReversePathTo_AddType); )
1169410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com
1170410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new CirclesBench(FLAGS00); )
1171410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new CirclesBench(FLAGS01); )
1172410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ArbRoundRectBench(false); )
1173410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ArbRoundRectBench(true); )
1174410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ConservativelyContainsBench(ConservativelyContainsBench::kRect_Type); )
1175410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ConservativelyContainsBench(ConservativelyContainsBench::kRoundRect_Type); )
1176410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ConservativelyContainsBench(ConservativelyContainsBench::kOval_Type); )
1177410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com
11780d7dac8fb8c404cada8d46646a980772b9dc55d6Mike Reed#include "SkPathOps.h"
11790d7dac8fb8c404cada8d46646a980772b9dc55d6Mike Reed#include "SkPathPriv.h"
11808d3196bdfcf478982bec9885d21e1d664ab9a72bMike ReedDEF_BENCH( return new TightBoundsBench([](const SkPath& path){ return path.computeTightBounds();},
11818d3196bdfcf478982bec9885d21e1d664ab9a72bMike Reed                                       "priv"); )
11828d3196bdfcf478982bec9885d21e1d664ab9a72bMike ReedDEF_BENCH( return new TightBoundsBench([](const SkPath& path) {
11838d3196bdfcf478982bec9885d21e1d664ab9a72bMike Reed        SkRect bounds; TightBounds(path, &bounds); return bounds;
11848d3196bdfcf478982bec9885d21e1d664ab9a72bMike Reed    }, "pathops"); )
1185b640203cd5733aaf110277e28e22007c5b541565reed
11863f376a55002c205aacacc4cb16ed745e3afbad31Mike Klein// These seem to be optimized away, which is troublesome for timing.
11873f376a55002c205aacacc4cb16ed745e3afbad31Mike Klein/*
1188410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ConicBench_Chop5() )
1189410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ConicBench_ComputeError() )
1190410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ConicBench_asQuadTol() )
1191410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ConicBench_quadPow2() )
11923f376a55002c205aacacc4cb16ed745e3afbad31Mike Klein*/
1193