1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/*
2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2011 Google Inc.
3fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot *
4fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Use of this source code is governed by a BSD-style license that can be
5fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * found in the LICENSE file.
6fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */
7fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
8fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "Benchmark.h"
9fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkBitmap.h"
10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkCanvas.h"
11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkColorPriv.h"
12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkPaint.h"
13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkPath.h"
14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkRandom.h"
15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkShader.h"
16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkString.h"
17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkTArray.h"
18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotenum Flags {
20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    kStroke_Flag = 1 << 0,
21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    kBig_Flag    = 1 << 1
22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define FLAGS00  Flags(0)
25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define FLAGS01  Flags(kStroke_Flag)
26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define FLAGS10  Flags(kBig_Flag)
27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define FLAGS11  Flags(kStroke_Flag | kBig_Flag)
28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass PathBench : public Benchmark {
30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkPaint     fPaint;
31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkString    fName;
32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    Flags       fFlags;
33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    PathBench(Flags flags) : fFlags(flags) {
35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fPaint.setStyle(flags & kStroke_Flag ? SkPaint::kStroke_Style :
36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                        SkPaint::kFill_Style);
37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fPaint.setStrokeWidth(SkIntToScalar(5));
38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fPaint.setStrokeJoin(SkPaint::kBevel_Join);
39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    virtual void appendName(SkString*) = 0;
42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    virtual void makePath(SkPath*) = 0;
43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    virtual int complexity() { return 0; }
44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected:
46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const char* onGetName() override {
47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fName.printf("path_%s_%s_",
48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                     fFlags & kStroke_Flag ? "stroke" : "fill",
49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                     fFlags & kBig_Flag ? "big" : "small");
50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        this->appendName(&fName);
51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return fName.c_str();
52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onDraw(int loops, SkCanvas* canvas) override {
55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkPaint paint(fPaint);
56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        this->setupPaint(&paint);
57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkPath path;
59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        this->makePath(&path);
60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (fFlags & kBig_Flag) {
61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            const SkMatrix m = SkMatrix::MakeScale(SkIntToScalar(10), SkIntToScalar(10));
62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            path.transform(m);
63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        for (int i = 0; i < loops; i++) {
66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            canvas->drawPath(path, paint);
67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    typedef Benchmark INHERITED;
72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
73fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
74fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass TrianglePathBench : public PathBench {
75fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
76fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    TrianglePathBench(Flags flags) : INHERITED(flags) {}
77fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
78fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void appendName(SkString* name) override {
79fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        name->append("triangle");
80fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
81fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void makePath(SkPath* path) override {
82fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        static const int gCoord[] = {
83fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            10, 10, 15, 5, 20, 20
84fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        };
85fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        path->moveTo(SkIntToScalar(gCoord[0]), SkIntToScalar(gCoord[1]));
86fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        path->lineTo(SkIntToScalar(gCoord[2]), SkIntToScalar(gCoord[3]));
87fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        path->lineTo(SkIntToScalar(gCoord[4]), SkIntToScalar(gCoord[5]));
88fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        path->close();
89fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
90fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
91fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    typedef PathBench INHERITED;
92fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
93fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
94fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass RectPathBench : public PathBench {
95fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
96fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    RectPathBench(Flags flags) : INHERITED(flags) {}
97fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
98fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void appendName(SkString* name) override {
99fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        name->append("rect");
100fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
101fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void makePath(SkPath* path) override {
102fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkRect r = { 10, 10, 20, 20 };
103fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        path->addRect(r);
104fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
105fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
106fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    typedef PathBench INHERITED;
107fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
108fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
109fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass RotatedRectBench : public PathBench {
110fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
111fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    RotatedRectBench(Flags flags, bool aa, int degrees) : INHERITED(flags) {
112fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fAA = aa;
113fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fDegrees = degrees;
114fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
115fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
116fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void appendName(SkString* name) override {
117fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkString suffix;
118fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        suffix.printf("rotated_rect_%s_%d", fAA ? "aa" : "noaa", fDegrees);
119fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        name->append(suffix);
120fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
121fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
122fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void makePath(SkPath* path) override {
123fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkRect r = { 10, 10, 20, 20 };
124fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        path->addRect(r);
125fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkMatrix rotateMatrix;
126fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        rotateMatrix.setRotate((SkScalar)fDegrees);
127fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        path->transform(rotateMatrix);
128fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
129fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
130fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    virtual void setupPaint(SkPaint* paint) override {
131fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        PathBench::setupPaint(paint);
132fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        paint->setAntiAlias(fAA);
133fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
134fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
135fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    typedef PathBench INHERITED;
136fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    int fDegrees;
137fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool fAA;
138fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
139fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
140fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass OvalPathBench : public PathBench {
141fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
142fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    OvalPathBench(Flags flags) : INHERITED(flags) {}
143fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
144fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void appendName(SkString* name) override {
145fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        name->append("oval");
146fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
147fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void makePath(SkPath* path) override {
148fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkRect r = { 10, 10, 23, 20 };
149fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        path->addOval(r);
150fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
151fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
152fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    typedef PathBench INHERITED;
153fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
154fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
155fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass CirclePathBench: public PathBench {
156fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
157fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    CirclePathBench(Flags flags) : INHERITED(flags) {}
158fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
159fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void appendName(SkString* name) override {
160fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        name->append("circle");
161fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
162fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void makePath(SkPath* path) override {
163fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        path->addCircle(SkIntToScalar(20), SkIntToScalar(20),
164fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                        SkIntToScalar(10));
165fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
166fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
167fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    typedef PathBench INHERITED;
168fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
169fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
170fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass NonAACirclePathBench: public CirclePathBench {
171fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
172fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    NonAACirclePathBench(Flags flags) : INHERITED(flags) {}
173fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
174fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void appendName(SkString* name) override {
175fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        name->append("nonaacircle");
176fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
177fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
178fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void setupPaint(SkPaint* paint) override {
179fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        CirclePathBench::setupPaint(paint);
180fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        paint->setAntiAlias(false);
181fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
182fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
183fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
184fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    typedef CirclePathBench INHERITED;
185fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
186fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
187fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// Test max speedup of Analytic AA for concave paths
188fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass AAAConcavePathBench : public PathBench {
189fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
190fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    AAAConcavePathBench(Flags flags) : INHERITED(flags) {}
191fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
192fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void appendName(SkString* name) override {
193fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        name->append("concave_aaa");
194fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
195fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
196fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void makePath(SkPath* path) override {
197fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        path->moveTo(10, 10);
198fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        path->lineTo(15, 10);
199fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        path->lineTo(15, 5);
200fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        path->lineTo(40, 40);
201fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        path->close();
202fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
203fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
204fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
205fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    typedef PathBench INHERITED;
206fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
207fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
208fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// Test max speedup of Analytic AA for convex paths
209fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass AAAConvexPathBench : public PathBench {
210fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
211fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    AAAConvexPathBench(Flags flags) : INHERITED(flags) {}
212fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
213fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void appendName(SkString* name) override {
214fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        name->append("convex_aaa");
215fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
216fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
217fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void makePath(SkPath* path) override {
218fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        path->moveTo(10, 10);
219fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        path->lineTo(15, 10);
220fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        path->lineTo(40, 50);
221fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        path->close();
222fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
223fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
224fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
225fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    typedef PathBench INHERITED;
226fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
227fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
228fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass SawToothPathBench : public PathBench {
229fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
230fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SawToothPathBench(Flags flags) : INHERITED(flags) {}
231fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
232fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void appendName(SkString* name) override {
233fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        name->append("sawtooth");
234fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
235fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void makePath(SkPath* path) override {
236fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkScalar x = SkIntToScalar(20);
237fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkScalar y = SkIntToScalar(20);
238fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        const SkScalar x0 = x;
239fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        const SkScalar dx = SK_Scalar1 * 5;
240fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        const SkScalar dy = SK_Scalar1 * 10;
241fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
242fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        path->moveTo(x, y);
243fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        for (int i = 0; i < 32; i++) {
244fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            x += dx;
245fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            path->lineTo(x, y - dy);
246fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            x += dx;
247fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            path->lineTo(x, y + dy);
248fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
249fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        path->lineTo(x, y + 2 * dy);
250fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        path->lineTo(x0, y + 2 * dy);
251fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        path->close();
252fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
253fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    int complexity() override { return 1; }
254fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
255fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    typedef PathBench INHERITED;
256fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
257fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
258fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass LongCurvedPathBench : public PathBench {
259fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
260fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    LongCurvedPathBench(Flags flags) : INHERITED(flags) {}
261fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
262fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void appendName(SkString* name) override {
263fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        name->append("long_curved");
264fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
265fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void makePath(SkPath* path) override {
266fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkRandom rand (12);
267fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        int i;
268fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        for (i = 0; i < 100; i++) {
269fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            path->quadTo(rand.nextUScalar1() * 640, rand.nextUScalar1() * 480,
270fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                         rand.nextUScalar1() * 640, rand.nextUScalar1() * 480);
271fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
272fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        path->close();
273fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
274fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    int complexity() override { return 2; }
275fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
276fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    typedef PathBench INHERITED;
277fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
278fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
279fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass LongLinePathBench : public PathBench {
280fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
281fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    LongLinePathBench(Flags flags) : INHERITED(flags) {}
282fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
283fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void appendName(SkString* name) override {
284fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        name->append("long_line");
285fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
286fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void makePath(SkPath* path) override {
287fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkRandom rand;
288fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        path->moveTo(rand.nextUScalar1() * 640, rand.nextUScalar1() * 480);
289fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        for (size_t i = 1; i < 100; i++) {
290fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            path->lineTo(rand.nextUScalar1() * 640, rand.nextUScalar1() * 480);
291fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
292fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
293fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    int complexity() override { return 2; }
294fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
295fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    typedef PathBench INHERITED;
296fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
297fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
298fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass RandomPathBench : public Benchmark {
299fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
300fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool isSuitableFor(Backend backend) override {
301fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return backend == kNonRendering_Backend;
302fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
303fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
304fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected:
305fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void createData(int minVerbs,
306fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    int maxVerbs,
307fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    bool allowMoves = true,
308fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    SkRect* bounds = nullptr) {
309fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkRect tempBounds;
310fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (nullptr == bounds) {
311fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            tempBounds.setXYWH(0, 0, SK_Scalar1, SK_Scalar1);
312fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            bounds = &tempBounds;
313fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
314fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fVerbCnts.reset(kNumVerbCnts);
315fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        for (int i = 0; i < kNumVerbCnts; ++i) {
316fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            fVerbCnts[i] = fRandom.nextRangeU(minVerbs, maxVerbs + 1);
317fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
318fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fVerbs.reset(kNumVerbs);
319fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        for (int i = 0; i < kNumVerbs; ++i) {
320fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            do {
321fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                fVerbs[i] = static_cast<SkPath::Verb>(fRandom.nextULessThan(SkPath::kDone_Verb));
322fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            } while (!allowMoves && SkPath::kMove_Verb == fVerbs[i]);
323fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
324fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fPoints.reset(kNumPoints);
325fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        for (int i = 0; i < kNumPoints; ++i) {
326fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            fPoints[i].set(fRandom.nextRangeScalar(bounds->fLeft, bounds->fRight),
327fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                           fRandom.nextRangeScalar(bounds->fTop, bounds->fBottom));
328fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
329fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        this->restartMakingPaths();
330fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
331fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
332fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void restartMakingPaths() {
333fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fCurrPath = 0;
334fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fCurrVerb = 0;
335fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fCurrPoint = 0;
336fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
337fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
338fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void makePath(SkPath* path) {
339fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        int vCount = fVerbCnts[(fCurrPath++) & (kNumVerbCnts - 1)];
340fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        for (int v = 0; v < vCount; ++v) {
341fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            int verb = fVerbs[(fCurrVerb++) & (kNumVerbs - 1)];
342fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            switch (verb) {
343fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                case SkPath::kMove_Verb:
344fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    path->moveTo(fPoints[(fCurrPoint++) & (kNumPoints - 1)]);
345fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    break;
346fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                case SkPath::kLine_Verb:
347fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    path->lineTo(fPoints[(fCurrPoint++) & (kNumPoints - 1)]);
348fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    break;
349fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                case SkPath::kQuad_Verb:
350fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    path->quadTo(fPoints[(fCurrPoint + 0) & (kNumPoints - 1)],
351fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                 fPoints[(fCurrPoint + 1) & (kNumPoints - 1)]);
352fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    fCurrPoint += 2;
353fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    break;
354fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                case SkPath::kConic_Verb:
355fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    path->conicTo(fPoints[(fCurrPoint + 0) & (kNumPoints - 1)],
356fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                  fPoints[(fCurrPoint + 1) & (kNumPoints - 1)],
357fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                  SK_ScalarHalf);
358fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    fCurrPoint += 2;
359fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    break;
360fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                case SkPath::kCubic_Verb:
361fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    path->cubicTo(fPoints[(fCurrPoint + 0) & (kNumPoints - 1)],
362fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                  fPoints[(fCurrPoint + 1) & (kNumPoints - 1)],
363fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                  fPoints[(fCurrPoint + 2) & (kNumPoints - 1)]);
364fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    fCurrPoint += 3;
365fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    break;
366fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                case SkPath::kClose_Verb:
367fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    path->close();
368fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    break;
369fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                default:
370fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    SkDEBUGFAIL("Unexpected path verb");
371fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    break;
372fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            }
373fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
374fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
375fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
376fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void finishedMakingPaths() {
377fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fVerbCnts.reset(0);
378fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fVerbs.reset(0);
379fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fPoints.reset(0);
380fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
381fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
382fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
383fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    enum {
384fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        // these should all be pow 2
385fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        kNumVerbCnts = 1 << 5,
386fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        kNumVerbs    = 1 << 5,
387fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        kNumPoints   = 1 << 5,
388fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    };
389fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkAutoTArray<int>           fVerbCnts;
390fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkAutoTArray<SkPath::Verb>  fVerbs;
391fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkAutoTArray<SkPoint>       fPoints;
392fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    int                         fCurrPath;
393fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    int                         fCurrVerb;
394fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    int                         fCurrPoint;
395fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkRandom                    fRandom;
396fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    typedef Benchmark INHERITED;
397fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
398fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
399fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass PathCreateBench : public RandomPathBench {
400fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
401fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    PathCreateBench()  {
402fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
403fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
404fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected:
405fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const char* onGetName() override {
406fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return "path_create";
407fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
408fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
409fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onDelayedSetup() override {
410fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        this->createData(10, 100);
411fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
412fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
413fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onDraw(int loops, SkCanvas*) override {
414fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        for (int i = 0; i < loops; ++i) {
415fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            if (i % 1000 == 0) {
416fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                fPath.reset();  // PathRef memory can grow without bound otherwise.
417fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            }
418fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            this->makePath(&fPath);
419fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
420fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        this->restartMakingPaths();
421fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
422fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
423fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
424fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkPath fPath;
425fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
426fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    typedef RandomPathBench INHERITED;
427fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
428fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
429fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass PathCopyBench : public RandomPathBench {
430fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
431fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    PathCopyBench()  {
432fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
433fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
434fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected:
435fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const char* onGetName() override {
436fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return "path_copy";
437fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
438fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onDelayedSetup() override {
439fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        this->createData(10, 100);
440fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fPaths.reset(kPathCnt);
441fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fCopies.reset(kPathCnt);
442fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        for (int i = 0; i < kPathCnt; ++i) {
443fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            this->makePath(&fPaths[i]);
444fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
445fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        this->finishedMakingPaths();
446fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
447fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onDraw(int loops, SkCanvas*) override {
448fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        for (int i = 0; i < loops; ++i) {
449fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            int idx = i & (kPathCnt - 1);
450fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            fCopies[idx] = fPaths[idx];
451fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
452fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
453fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
454fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
455fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    enum {
456fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        // must be a pow 2
457fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        kPathCnt = 1 << 5,
458fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    };
459fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkAutoTArray<SkPath> fPaths;
460fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkAutoTArray<SkPath> fCopies;
461fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
462fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    typedef RandomPathBench INHERITED;
463fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
464fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
465fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass PathTransformBench : public RandomPathBench {
466fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
467fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    PathTransformBench(bool inPlace) : fInPlace(inPlace) {}
468fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
469fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected:
470fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const char* onGetName() override {
471fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return fInPlace ? "path_transform_in_place" : "path_transform_copy";
472fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
473fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
474fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onDelayedSetup() override {
475fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fMatrix.setScale(5 * SK_Scalar1, 6 * SK_Scalar1);
476fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        this->createData(10, 100);
477fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fPaths.reset(kPathCnt);
478fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        for (int i = 0; i < kPathCnt; ++i) {
479fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            this->makePath(&fPaths[i]);
480fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
481fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        this->finishedMakingPaths();
482fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (!fInPlace) {
483fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            fTransformed.reset(kPathCnt);
484fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
485fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
486fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
487fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onDraw(int loops, SkCanvas*) override {
488fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (fInPlace) {
489fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            for (int i = 0; i < loops; ++i) {
490fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                fPaths[i & (kPathCnt - 1)].transform(fMatrix);
491fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            }
492fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        } else {
493fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            for (int i = 0; i < loops; ++i) {
494fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                int idx = i & (kPathCnt - 1);
495fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                fPaths[idx].transform(fMatrix, &fTransformed[idx]);
496fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            }
497fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
498fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
499fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
500fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
501fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    enum {
502fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        // must be a pow 2
503fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        kPathCnt = 1 << 5,
504fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    };
505fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkAutoTArray<SkPath> fPaths;
506fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkAutoTArray<SkPath> fTransformed;
507fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
508fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkMatrix fMatrix;
509fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool fInPlace;
510fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    typedef RandomPathBench INHERITED;
511fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
512fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
513fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass PathEqualityBench : public RandomPathBench {
514fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
515fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    PathEqualityBench() { }
516fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
517fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected:
518fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const char* onGetName() override {
519fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return "path_equality_50%";
520fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
521fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
522fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onDelayedSetup() override {
523fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fParity = 0;
524fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        this->createData(10, 100);
525fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fPaths.reset(kPathCnt);
526fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fCopies.reset(kPathCnt);
527fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        for (int i = 0; i < kPathCnt; ++i) {
528fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            this->makePath(&fPaths[i]);
529fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            fCopies[i] = fPaths[i];
530fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
531fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        this->finishedMakingPaths();
532fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
533fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
534fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onDraw(int loops, SkCanvas*) override {
535fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        for (int i = 0; i < loops; ++i) {
536fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            int idx = i & (kPathCnt - 1);
537fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            fParity ^= (fPaths[idx] == fCopies[idx & ~0x1]);
538fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
539fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
540fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
541fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
542fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool fParity; // attempt to keep compiler from optimizing out the ==
543fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    enum {
544fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        // must be a pow 2
545fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        kPathCnt = 1 << 5,
546fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    };
547fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkAutoTArray<SkPath> fPaths;
548fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkAutoTArray<SkPath> fCopies;
549fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    typedef RandomPathBench INHERITED;
550fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
551fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
552fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass SkBench_AddPathTest : public RandomPathBench {
553fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
554fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    enum AddType {
555fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        kAdd_AddType,
556fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        kAddTrans_AddType,
557fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        kAddMatrix_AddType,
558fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        kReverseAdd_AddType,
559fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        kReversePathTo_AddType,
560fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    };
561fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
562fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkBench_AddPathTest(AddType type) : fType(type) {
563fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fMatrix.setRotate(60 * SK_Scalar1);
564fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
565fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
566fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected:
567fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const char* onGetName() override {
568fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        switch (fType) {
569fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            case kAdd_AddType:
570fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                return "path_add_path";
571fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            case kAddTrans_AddType:
572fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                return "path_add_path_trans";
573fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            case kAddMatrix_AddType:
574fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                return "path_add_path_matrix";
575fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            case kReverseAdd_AddType:
576fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                return "path_reverse_add_path";
577fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            case kReversePathTo_AddType:
578fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                return "path_reverse_path_to";
579fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            default:
580fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                SkDEBUGFAIL("Bad add type");
581fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                return "";
582fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
583fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
584fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
585fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onDelayedSetup() override {
586fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        // reversePathTo assumes a single contour path.
587fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        bool allowMoves = kReversePathTo_AddType != fType;
588fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        this->createData(10, 100, allowMoves);
589fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fPaths0.reset(kPathCnt);
590fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fPaths1.reset(kPathCnt);
591fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        for (int i = 0; i < kPathCnt; ++i) {
592fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            this->makePath(&fPaths0[i]);
593fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            this->makePath(&fPaths1[i]);
594fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
595fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        this->finishedMakingPaths();
596fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
597fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
598fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onDraw(int loops, SkCanvas*) override {
599fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        switch (fType) {
600fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            case kAdd_AddType:
601fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                for (int i = 0; i < loops; ++i) {
602fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    int idx = i & (kPathCnt - 1);
603fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    SkPath result = fPaths0[idx];
604fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    result.addPath(fPaths1[idx]);
605fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                }
606fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                break;
607fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            case kAddTrans_AddType:
608fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                for (int i = 0; i < loops; ++i) {
609fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    int idx = i & (kPathCnt - 1);
610fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    SkPath result = fPaths0[idx];
611fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    result.addPath(fPaths1[idx], 2 * SK_Scalar1, 5 * SK_Scalar1);
612fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                }
613fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                break;
614fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            case kAddMatrix_AddType:
615fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                for (int i = 0; i < loops; ++i) {
616fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    int idx = i & (kPathCnt - 1);
617fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    SkPath result = fPaths0[idx];
618fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    result.addPath(fPaths1[idx], fMatrix);
619fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                }
620fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                break;
621fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            case kReverseAdd_AddType:
622fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                for (int i = 0; i < loops; ++i) {
623fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    int idx = i & (kPathCnt - 1);
624fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    SkPath result = fPaths0[idx];
625fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    result.reverseAddPath(fPaths1[idx]);
626fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                }
627fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                break;
628fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            case kReversePathTo_AddType:
629fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                for (int i = 0; i < loops; ++i) {
630fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    int idx = i & (kPathCnt - 1);
631fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    SkPath result = fPaths0[idx];
632fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    result.reversePathTo(fPaths1[idx]);
633fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                }
634fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                break;
635fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
636fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
637fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
638fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
639fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    AddType fType; // or reverseAddPath
640fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    enum {
641fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        // must be a pow 2
642fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        kPathCnt = 1 << 5,
643fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    };
644fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkAutoTArray<SkPath> fPaths0;
645fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkAutoTArray<SkPath> fPaths1;
646fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkMatrix         fMatrix;
647fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    typedef RandomPathBench INHERITED;
648fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
649fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
650fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
651fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass CirclesBench : public Benchmark {
652fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected:
653fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkString            fName;
654fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    Flags               fFlags;
655fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
656fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
657fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    CirclesBench(Flags flags) : fFlags(flags) {
658fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fName.printf("circles_%s", fFlags & kStroke_Flag ? "stroke" : "fill");
659fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
660fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
661fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected:
662fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const char* onGetName() override {
663fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return fName.c_str();
664fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
665fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
666fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onDraw(int loops, SkCanvas* canvas) override {
667fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkPaint paint;
668fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
669fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        paint.setColor(SK_ColorBLACK);
670fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        paint.setAntiAlias(true);
671fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (fFlags & kStroke_Flag) {
672fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            paint.setStyle(SkPaint::kStroke_Style);
673fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
674fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
675fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkRandom rand;
676fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
677fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkRect r;
678fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
679fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        for (int i = 0; i < loops; ++i) {
680fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkScalar radius = rand.nextUScalar1() * 3;
681fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            r.fLeft = rand.nextUScalar1() * 300;
682fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            r.fTop =  rand.nextUScalar1() * 300;
683fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            r.fRight =  r.fLeft + 2 * radius;
684fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            r.fBottom = r.fTop + 2 * radius;
685fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
686fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            if (fFlags & kStroke_Flag) {
687fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                paint.setStrokeWidth(rand.nextUScalar1() * 5.0f);
688fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            }
689fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
690fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkPath temp;
691fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
692fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            // mimic how Chrome does circles
693fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            temp.arcTo(r, 0, 0, false);
694fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            temp.addOval(r, SkPath::kCCW_Direction);
695fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            temp.arcTo(r, 360, 0, true);
696fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            temp.close();
697fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
698fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            canvas->drawPath(temp, paint);
699fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
700fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
701fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
702fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
703fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    typedef Benchmark INHERITED;
704fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
705fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
706fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
707fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// Chrome creates its own round rects with each corner possibly being different.
708fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// In its "zero radius" incarnation it creates degenerate round rects.
709fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// Note: PathTest::test_arb_round_rect_is_convex and
710fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// test_arb_zero_rad_round_rect_is_rect perform almost exactly
711fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// the same test (but with no drawing)
712fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass ArbRoundRectBench : public Benchmark {
713fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected:
714fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkString            fName;
715fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
716fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
717fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    ArbRoundRectBench(bool zeroRad) : fZeroRad(zeroRad) {
718fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (zeroRad) {
719fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            fName.printf("zeroradroundrect");
720fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        } else {
721fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            fName.printf("arbroundrect");
722fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
723fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
724fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
725fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected:
726fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const char* onGetName() override {
727fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return fName.c_str();
728fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
729fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
730fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    static void add_corner_arc(SkPath* path, const SkRect& rect,
731fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                               SkScalar xIn, SkScalar yIn,
732fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                               int startAngle)
733fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    {
734fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
735fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkScalar rx = SkMinScalar(rect.width(), xIn);
736fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkScalar ry = SkMinScalar(rect.height(), yIn);
737fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
738fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkRect arcRect;
739fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        arcRect.set(-rx, -ry, rx, ry);
740fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        switch (startAngle) {
741fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        case 0:
742fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            arcRect.offset(rect.fRight - arcRect.fRight, rect.fBottom - arcRect.fBottom);
743fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            break;
744fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        case 90:
745fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            arcRect.offset(rect.fLeft - arcRect.fLeft, rect.fBottom - arcRect.fBottom);
746fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            break;
747fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        case 180:
748fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            arcRect.offset(rect.fLeft - arcRect.fLeft, rect.fTop - arcRect.fTop);
749fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            break;
750fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        case 270:
751fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            arcRect.offset(rect.fRight - arcRect.fRight, rect.fTop - arcRect.fTop);
752fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            break;
753fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        default:
754fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            break;
755fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
756fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
757fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        path->arcTo(arcRect, SkIntToScalar(startAngle), SkIntToScalar(90), false);
758fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
759fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
760fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    static void make_arb_round_rect(SkPath* path, const SkRect& r,
761fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                    SkScalar xCorner, SkScalar yCorner) {
762fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        // we are lazy here and use the same x & y for each corner
763fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        add_corner_arc(path, r, xCorner, yCorner, 270);
764fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        add_corner_arc(path, r, xCorner, yCorner, 0);
765fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        add_corner_arc(path, r, xCorner, yCorner, 90);
766fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        add_corner_arc(path, r, xCorner, yCorner, 180);
767fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        path->close();
768fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
769fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkASSERT(path->isConvex());
770fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
771fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
772fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onDraw(int loops, SkCanvas* canvas) override {
773fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkRandom rand;
774fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkRect r;
775fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
776fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        for (int i = 0; i < loops; ++i) {
777fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkPaint paint;
778fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            paint.setColor(0xff000000 | rand.nextU());
779fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            paint.setAntiAlias(true);
780fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
781fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkScalar size = rand.nextUScalar1() * 30;
782fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            if (size < SK_Scalar1) {
783fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                continue;
784fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            }
785fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            r.fLeft = rand.nextUScalar1() * 300;
786fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            r.fTop =  rand.nextUScalar1() * 300;
787fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            r.fRight =  r.fLeft + 2 * size;
788fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            r.fBottom = r.fTop + 2 * size;
789fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
790fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkPath temp;
791fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
792fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            if (fZeroRad) {
793fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                make_arb_round_rect(&temp, r, 0, 0);
794fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
795fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                SkASSERT(temp.isRect(nullptr));
796fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            } else {
797fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                make_arb_round_rect(&temp, r, r.width() / 10, r.height() / 15);
798fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            }
799fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
800fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            canvas->drawPath(temp, paint);
801fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
802fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
803fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
804fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
805fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool fZeroRad;      // should 0 radius rounds rects be tested?
806fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
807fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    typedef Benchmark INHERITED;
808fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
809fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
810fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass ConservativelyContainsBench : public Benchmark {
811fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
812fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    enum Type {
813fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        kRect_Type,
814fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        kRoundRect_Type,
815fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        kOval_Type,
816fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    };
817fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
818fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    ConservativelyContainsBench(Type type)  {
819fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fParity = false;
820fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fName = "conservatively_contains_";
821fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        switch (type) {
822fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            case kRect_Type:
823fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                fName.append("rect");
824fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                fPath.addRect(kBaseRect);
825fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                break;
826fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            case kRoundRect_Type:
827fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                fName.append("round_rect");
828fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                fPath.addRoundRect(kBaseRect, kRRRadii[0], kRRRadii[1]);
829fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                break;
830fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            case kOval_Type:
831fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                fName.append("oval");
832fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                fPath.addOval(kBaseRect);
833fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                break;
834fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
835fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
836fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
837fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool isSuitableFor(Backend backend) override {
838fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return backend == kNonRendering_Backend;
839fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
840fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
841fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
842fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const char* onGetName() override {
843fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return fName.c_str();
844fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
845fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
846fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onDraw(int loops, SkCanvas*) override {
847fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        for (int i = 0; i < loops; ++i) {
848fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            const SkRect& rect = fQueryRects[i % kQueryRectCnt];
849fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            fParity = fParity != fPath.conservativelyContainsRect(rect);
850fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
851fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
852fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
853fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onDelayedSetup() override {
854fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fQueryRects.setCount(kQueryRectCnt);
855fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
856fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkRandom rand;
857fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        for (int i = 0; i < kQueryRectCnt; ++i) {
858fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkSize size;
859fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkPoint xy;
860fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            size.fWidth = rand.nextRangeScalar(kQueryMin.fWidth,  kQueryMax.fWidth);
861fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            size.fHeight = rand.nextRangeScalar(kQueryMin.fHeight, kQueryMax.fHeight);
862fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            xy.fX = rand.nextRangeScalar(kBounds.fLeft, kBounds.fRight - size.fWidth);
863fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            xy.fY = rand.nextRangeScalar(kBounds.fTop, kBounds.fBottom - size.fHeight);
864fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
865fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            fQueryRects[i] = SkRect::MakeXYWH(xy.fX, xy.fY, size.fWidth, size.fHeight);
866fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
867fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
868fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
869fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    enum {
870fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        kQueryRectCnt = 400,
871fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    };
872fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    static const SkRect kBounds;   // bounds for all random query rects
873fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    static const SkSize kQueryMin; // minimum query rect size, should be <= kQueryMax
874fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    static const SkSize kQueryMax; // max query rect size, should < kBounds
875fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    static const SkRect kBaseRect; // rect that is used to construct the path
876fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    static const SkScalar kRRRadii[2]; // x and y radii for round rect
877fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
878fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkString            fName;
879fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkPath              fPath;
880fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool                fParity;
881fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkTDArray<SkRect>   fQueryRects;
882fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
883fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    typedef Benchmark INHERITED;
884fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
885fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
886fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot///////////////////////////////////////////////////////////////////////////////
887fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
888fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkGeometry.h"
889fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
890fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass ConicBench_Chop : public Benchmark {
891fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected:
892fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkConic fRQ, fDst[2];
893fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkString fName;
894fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
895fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    ConicBench_Chop() : fName("conic-chop") {
896fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fRQ.fPts[0].set(0, 0);
897fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fRQ.fPts[1].set(100, 0);
898fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fRQ.fPts[2].set(100, 100);
899fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fRQ.fW = SkScalarCos(SK_ScalarPI/4);
900fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
901fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
902fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool isSuitableFor(Backend backend) override {
903fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return backend == kNonRendering_Backend;
904fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
905fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
906fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
907fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const char* onGetName() override { return fName.c_str(); }
908fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
909fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onDraw(int loops, SkCanvas*) override {
910fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        for (int i = 0; i < loops; ++i) {
911fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            fRQ.chop(fDst);
912fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
913fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
914fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
915fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    typedef Benchmark INHERITED;
916fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
917fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new ConicBench_Chop; )
918fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
919fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass ConicBench_EvalPos : public ConicBench_Chop {
920fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const bool fUseV2;
921fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
922fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    ConicBench_EvalPos(bool useV2) : fUseV2(useV2) {
923fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fName.printf("conic-eval-pos%d", useV2);
924fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
925fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onDraw(int loops, SkCanvas*) override {
926fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (fUseV2) {
927fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            for (int i = 0; i < loops; ++i) {
928fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                for (int j = 0; j < 1000; ++j) {
929fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    fDst[0].fPts[0] = fRQ.evalAt(0.4f);
930fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                }
931fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            }
932fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        } else {
933fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            for (int i = 0; i < loops; ++i) {
934fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                for (int j = 0; j < 1000; ++j) {
935fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    fRQ.evalAt(0.4f, &fDst[0].fPts[0], nullptr);
936fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                }
937fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            }
938fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
939fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
940fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
941fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new ConicBench_EvalPos(false); )
942fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new ConicBench_EvalPos(true); )
943fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
944fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass ConicBench_EvalTan : public ConicBench_Chop {
945fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const bool fUseV2;
946fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
947fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    ConicBench_EvalTan(bool useV2) : fUseV2(useV2) {
948fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fName.printf("conic-eval-tan%d", useV2);
949fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
950fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onDraw(int loops, SkCanvas*) override {
951fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (fUseV2) {
952fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            for (int i = 0; i < loops; ++i) {
953fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                for (int j = 0; j < 1000; ++j) {
954fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    fDst[0].fPts[0] = fRQ.evalTangentAt(0.4f);
955fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                }
956fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            }
957fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        } else {
958fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            for (int i = 0; i < loops; ++i) {
959fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                for (int j = 0; j < 1000; ++j) {
960fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    fRQ.evalAt(0.4f, nullptr, &fDst[0].fPts[0]);
961fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                }
962fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            }
963fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
964fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
965fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
966fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new ConicBench_EvalTan(false); )
967fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new ConicBench_EvalTan(true); )
968fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
969fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot///////////////////////////////////////////////////////////////////////////////
970fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
971fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic void rand_conic(SkConic* conic, SkRandom& rand) {
972fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    for (int i = 0; i < 3; ++i) {
973fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        conic->fPts[i].set(rand.nextUScalar1() * 100, rand.nextUScalar1() * 100);
974fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
975fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    if (rand.nextUScalar1() > 0.5f) {
976fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        conic->fW = rand.nextUScalar1();
977fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    } else {
978fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        conic->fW = 1 + rand.nextUScalar1() * 4;
979fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
980fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
981fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
982fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass ConicBench : public Benchmark {
983fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
984fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    ConicBench()  {
985fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkRandom rand;
986fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        for (int i = 0; i < CONICS; ++i) {
987fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            rand_conic(&fConics[i], rand);
988fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
989fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
990fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
991fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool isSuitableFor(Backend backend) override {
992fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return backend == kNonRendering_Backend;
993fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
994fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
995fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected:
996fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    enum {
997fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        CONICS = 100
998fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    };
999fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkConic fConics[CONICS];
1000fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
1001fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
1002fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    typedef Benchmark INHERITED;
1003fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
1004fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
1005fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass ConicBench_ComputeError : public ConicBench {
1006fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
1007fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    ConicBench_ComputeError()  {}
1008fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
1009fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected:
1010fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const char* onGetName() override {
1011fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return "conic-compute-error";
1012fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
1013fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
1014fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onDraw(int loops, SkCanvas*) override {
1015fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkVector err;
1016fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        for (int i = 0; i < loops; ++i) {
1017fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            for (int j = 0; j < CONICS; ++j) {
1018fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                fConics[j].computeAsQuadError(&err);
1019fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            }
1020fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
1021fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
1022fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
1023fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
1024fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    typedef ConicBench INHERITED;
1025fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
1026fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
1027fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass ConicBench_asQuadTol : public ConicBench {
1028fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
1029fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    ConicBench_asQuadTol()  {}
1030fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
1031fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected:
1032fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const char* onGetName() override {
1033fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return "conic-asQuadTol";
1034fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
1035fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
1036fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onDraw(int loops, SkCanvas*) override {
1037fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        for (int i = 0; i < loops; ++i) {
1038fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            for (int j = 0; j < CONICS; ++j) {
1039fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                fConics[j].asQuadTol(SK_ScalarHalf);
1040fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            }
1041fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
1042fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
1043fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
1044fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
1045fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    typedef ConicBench INHERITED;
1046fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
1047fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
1048fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass ConicBench_quadPow2 : public ConicBench {
1049fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
1050fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    ConicBench_quadPow2()  {}
1051fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
1052fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected:
1053fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const char* onGetName() override {
1054fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return "conic-quadPow2";
1055fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
1056fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
1057fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onDraw(int loops, SkCanvas*) override {
1058fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        for (int i = 0; i < loops; ++i) {
1059fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            for (int j = 0; j < CONICS; ++j) {
1060fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                fConics[j].computeQuadPOW2(SK_ScalarHalf);
1061fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            }
1062fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
1063fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
1064fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
1065fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
1066fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    typedef ConicBench INHERITED;
1067fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
1068fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
1069fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot///////////////////////////////////////////////////////////////////////////////
1070fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
1071fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass TightBoundsBench : public Benchmark {
1072fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkPath      fPath;
1073fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkString    fName;
1074fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkRect      (*fProc)(const SkPath&);
1075fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
1076fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
1077fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    TightBoundsBench(SkRect (*proc)(const SkPath&), const char suffix[]) : fProc(proc) {
1078fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fName.printf("tight_bounds_%s", suffix);
1079fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
1080fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        const int N = 100;
1081fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkRandom rand;
1082fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        for (int i = 0; i < N; ++i) {
1083fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            fPath.moveTo(rand.nextF()*100, rand.nextF()*100);
1084fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            fPath.lineTo(rand.nextF()*100, rand.nextF()*100);
1085fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            fPath.quadTo(rand.nextF()*100, rand.nextF()*100, rand.nextF()*100, rand.nextF()*100);
1086fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            fPath.conicTo(rand.nextF()*100, rand.nextF()*100, rand.nextF()*100, rand.nextF()*100,
1087fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                          rand.nextF()*10);
1088fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            fPath.cubicTo(rand.nextF()*100, rand.nextF()*100, rand.nextF()*100, rand.nextF()*100,
1089fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                          rand.nextF()*100, rand.nextF()*100);
1090fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
1091fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
1092fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
1093fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected:
1094fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool isSuitableFor(Backend backend) override {
1095fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return backend == kNonRendering_Backend;
1096fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
1097fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
1098fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const char* onGetName() override { return fName.c_str(); }
1099fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
1100fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onDraw(int loops, SkCanvas* canvas) override {
1101fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        for (int i = 0; i < loops*100; ++i) {
1102fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            fProc(fPath);
1103fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
1104fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
1105fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
1106fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
1107fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    typedef Benchmark INHERITED;
1108fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
1109fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
1110fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
1111fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotconst SkRect ConservativelyContainsBench::kBounds = SkRect::MakeWH(SkIntToScalar(100), SkIntToScalar(100));
1112fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotconst SkSize ConservativelyContainsBench::kQueryMin = {SkIntToScalar(1), SkIntToScalar(1)};
1113fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotconst SkSize ConservativelyContainsBench::kQueryMax = {SkIntToScalar(40), SkIntToScalar(40)};
1114fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotconst SkRect ConservativelyContainsBench::kBaseRect = SkRect::MakeXYWH(SkIntToScalar(25), SkIntToScalar(25), SkIntToScalar(50), SkIntToScalar(50));
1115fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotconst SkScalar ConservativelyContainsBench::kRRRadii[2] = {SkIntToScalar(5), SkIntToScalar(10)};
1116fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
1117fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new TrianglePathBench(FLAGS00); )
1118fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new TrianglePathBench(FLAGS01); )
1119fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new TrianglePathBench(FLAGS10); )
1120fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new TrianglePathBench(FLAGS11); )
1121fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
1122fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new RectPathBench(FLAGS00); )
1123fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new RectPathBench(FLAGS01); )
1124fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new RectPathBench(FLAGS10); )
1125fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new RectPathBench(FLAGS11); )
1126fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
1127fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new RotatedRectBench(FLAGS00, false, 45));
1128fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new RotatedRectBench(FLAGS10, false, 45));
1129fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new RotatedRectBench(FLAGS00, true, 45));
1130fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new RotatedRectBench(FLAGS10, true, 45));
1131fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
1132fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new OvalPathBench(FLAGS00); )
1133fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new OvalPathBench(FLAGS01); )
1134fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new OvalPathBench(FLAGS10); )
1135fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new OvalPathBench(FLAGS11); )
1136fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
1137fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new CirclePathBench(FLAGS00); )
1138fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new CirclePathBench(FLAGS01); )
1139fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new CirclePathBench(FLAGS10); )
1140fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new CirclePathBench(FLAGS11); )
1141fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
1142fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new NonAACirclePathBench(FLAGS00); )
1143fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new NonAACirclePathBench(FLAGS10); )
1144fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
1145fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new AAAConcavePathBench(FLAGS00); )
1146fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new AAAConcavePathBench(FLAGS10); )
1147fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new AAAConvexPathBench(FLAGS00); )
1148fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new AAAConvexPathBench(FLAGS10); )
1149fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
1150fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new SawToothPathBench(FLAGS00); )
1151fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new SawToothPathBench(FLAGS01); )
1152fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
1153fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new LongCurvedPathBench(FLAGS00); )
1154fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new LongCurvedPathBench(FLAGS01); )
1155fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new LongLinePathBench(FLAGS00); )
1156fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new LongLinePathBench(FLAGS01); )
1157fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
1158fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new PathCreateBench(); )
1159fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new PathCopyBench(); )
1160fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new PathTransformBench(true); )
1161fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new PathTransformBench(false); )
1162fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new PathEqualityBench(); )
1163fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
1164fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new SkBench_AddPathTest(SkBench_AddPathTest::kAdd_AddType); )
1165fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new SkBench_AddPathTest(SkBench_AddPathTest::kAddTrans_AddType); )
1166fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new SkBench_AddPathTest(SkBench_AddPathTest::kAddMatrix_AddType); )
1167fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new SkBench_AddPathTest(SkBench_AddPathTest::kReverseAdd_AddType); )
1168fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new SkBench_AddPathTest(SkBench_AddPathTest::kReversePathTo_AddType); )
1169fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
1170fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new CirclesBench(FLAGS00); )
1171fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new CirclesBench(FLAGS01); )
1172fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new ArbRoundRectBench(false); )
1173fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new ArbRoundRectBench(true); )
1174fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new ConservativelyContainsBench(ConservativelyContainsBench::kRect_Type); )
1175fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new ConservativelyContainsBench(ConservativelyContainsBench::kRoundRect_Type); )
1176fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new ConservativelyContainsBench(ConservativelyContainsBench::kOval_Type); )
1177fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
1178fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkPathOps.h"
1179fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkPathPriv.h"
1180fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new TightBoundsBench([](const SkPath& path){ return path.computeTightBounds();},
1181fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                       "priv"); )
1182fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new TightBoundsBench([](const SkPath& path) {
1183fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkRect bounds; TightBounds(path, &bounds); return bounds;
1184fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }, "pathops"); )
1185fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
1186fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// These seem to be optimized away, which is troublesome for timing.
1187fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/*
1188fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new ConicBench_Chop5() )
1189fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new ConicBench_ComputeError() )
1190fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new ConicBench_asQuadTol() )
1191fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new ConicBench_quadPow2() )
1192fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot*/
1193