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#include "Benchmark.h"
8fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkBitmap.h"
9fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkCanvas.h"
10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkDashPathEffect.h"
11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkPaint.h"
12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkPath.h"
13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkRandom.h"
14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkString.h"
15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkStrokeRec.h"
16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkTDArray.h"
17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/*
20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot *  Cases to consider:
21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot *
22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot *  1. antialiasing on/off (esp. width <= 1)
23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot *  2. strokewidth == 0, 1, 2
24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot *  3. hline, vline, diagonal, rect, oval
25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot *  4. dots [1,1] ([N,N] where N=strokeWidth?) or arbitrary (e.g. [2,1] or [1,2,3,2])
26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */
27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic void path_hline(SkPath* path) {
28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    path->moveTo(SkIntToScalar(10), SkIntToScalar(10));
29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    path->lineTo(SkIntToScalar(600), SkIntToScalar(10));
30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass DashBench : public Benchmark {
33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected:
34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkString            fName;
35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkTDArray<SkScalar> fIntervals;
36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    int                 fWidth;
37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkPoint             fPts[2];
38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool                fDoClip;
39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    DashBench(const SkScalar intervals[], int count, int width,
42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot              bool doClip = false)  {
43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fIntervals.append(count, intervals);
44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        for (int i = 0; i < count; ++i) {
45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            fIntervals[i] *= width;
46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fWidth = width;
48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fName.printf("dash_%d_%s", width, doClip ? "clipped" : "noclip");
49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fDoClip = doClip;
50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fPts[0].set(SkIntToScalar(10), SkIntToScalar(10));
52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fPts[1].set(SkIntToScalar(600), SkIntToScalar(10));
53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    virtual void makePath(SkPath* path) {
56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        path_hline(path);
57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected:
60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const char* onGetName() override {
61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return fName.c_str();
62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onDraw(int loops, SkCanvas* canvas) override {
65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkPaint paint;
66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        this->setupPaint(&paint);
67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        paint.setStyle(SkPaint::kStroke_Style);
68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        paint.setStrokeWidth(SkIntToScalar(fWidth));
69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        paint.setAntiAlias(false);
70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkPath path;
72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        this->makePath(&path);
73fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
74fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        paint.setPathEffect(SkDashPathEffect::Make(fIntervals.begin(), fIntervals.count(), 0));
75fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
76fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (fDoClip) {
77fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkRect r = path.getBounds();
78fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            r.inset(-SkIntToScalar(20), -SkIntToScalar(20));
79fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            // now move it so we don't intersect
80fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            r.offset(0, r.height() * 3 / 2);
81fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            canvas->clipRect(r);
82fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
83fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
84fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        this->handlePath(canvas, path, paint, loops);
85fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
86fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
87fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    virtual void handlePath(SkCanvas* canvas, const SkPath& path,
88fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                            const SkPaint& paint, int N) {
89fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        for (int i = 0; i < N; ++i) {
90fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot//            canvas->drawPoints(SkCanvas::kLines_PointMode, 2, fPts, paint);
91fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            canvas->drawPath(path, paint);
92fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
93fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
94fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
95fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
96fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    typedef Benchmark INHERITED;
97fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
98fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
99fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass RectDashBench : public DashBench {
100fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
101fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    RectDashBench(const SkScalar intervals[], int count, int width)
102fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    : INHERITED(intervals, count, width) {
103fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fName.append("_rect");
104fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
105fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
106fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected:
107fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    virtual void handlePath(SkCanvas* canvas, const SkPath& path,
108fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                            const SkPaint& paint, int N) override {
109fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkPoint pts[2];
110fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (!path.isLine(pts) || pts[0].fY != pts[1].fY) {
111fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            this->INHERITED::handlePath(canvas, path, paint, N);
112fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        } else {
113fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkRect rect;
114fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            rect.fLeft = pts[0].fX;
115fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            rect.fTop = pts[0].fY - paint.getStrokeWidth() / 2;
116fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            rect.fRight = rect.fLeft + SkIntToScalar(fWidth);
117fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            rect.fBottom = rect.fTop + paint.getStrokeWidth();
118fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
119fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkPaint p(paint);
120fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            p.setStyle(SkPaint::kFill_Style);
121fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            p.setPathEffect(nullptr);
122fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
123fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            int count = SkScalarRoundToInt((pts[1].fX - pts[0].fX) / (2*fWidth));
124fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkScalar dx = SkIntToScalar(2 * fWidth);
125fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
126fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            for (int i = 0; i < N*10; ++i) {
127fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                SkRect r = rect;
128fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                for (int j = 0; j < count; ++j) {
129fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    canvas->drawRect(r, p);
130fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    r.offset(dx, 0);
131fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                }
132fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            }
133fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
134fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
135fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
136fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
137fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    typedef DashBench INHERITED;
138fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
139fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
140fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic void make_unit_star(SkPath* path, int n) {
141fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkScalar rad = -SK_ScalarPI / 2;
142fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const SkScalar drad = (n >> 1) * SK_ScalarPI * 2 / n;
143fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
144fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    path->moveTo(0, -SK_Scalar1);
145fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    for (int i = 1; i < n; i++) {
146fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        rad += drad;
147fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkScalar cosV, sinV = SkScalarSinCos(rad, &cosV);
148fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        path->lineTo(cosV, sinV);
149fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
150fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    path->close();
151fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
152fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
153fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic void make_poly(SkPath* path) {
154fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    make_unit_star(path, 9);
155fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const SkMatrix matrix = SkMatrix::MakeScale(SkIntToScalar(100), SkIntToScalar(100));
156fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    path->transform(matrix);
157fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
158fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
159fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic void make_quad(SkPath* path) {
160fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkScalar x0 = SkIntToScalar(10);
161fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkScalar y0 = SkIntToScalar(10);
162fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    path->moveTo(x0, y0);
163fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    path->quadTo(x0,                    y0 + 400 * SK_Scalar1,
164fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                 x0 + 600 * SK_Scalar1, y0 + 400 * SK_Scalar1);
165fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
166fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
167fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic void make_cubic(SkPath* path) {
168fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkScalar x0 = SkIntToScalar(10);
169fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkScalar y0 = SkIntToScalar(10);
170fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    path->moveTo(x0, y0);
171fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    path->cubicTo(x0,                    y0 + 400 * SK_Scalar1,
172fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                  x0 + 600 * SK_Scalar1, y0 + 400 * SK_Scalar1,
173fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                  x0 + 600 * SK_Scalar1, y0);
174fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
175fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
176fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass MakeDashBench : public Benchmark {
177fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkString fName;
178fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkPath   fPath;
179fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    sk_sp<SkPathEffect> fPE;
180fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
181fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
182fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    MakeDashBench(void (*proc)(SkPath*), const char name[])  {
183fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fName.printf("makedash_%s", name);
184fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        proc(&fPath);
185fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
186fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkScalar vals[] = { SkIntToScalar(4), SkIntToScalar(4) };
187fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fPE = SkDashPathEffect::Make(vals, 2, 0);
188fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
189fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
190fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected:
191fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const char* onGetName() override {
192fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return fName.c_str();
193fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
194fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
195fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onDraw(int loops, SkCanvas*) override {
196fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkPath dst;
197fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        for (int i = 0; i < loops; ++i) {
198fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkStrokeRec rec(SkStrokeRec::kHairline_InitStyle);
199fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
200fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            fPE->filterPath(&dst, fPath, &rec, nullptr);
201fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            dst.rewind();
202fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
203fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
204fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
205fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
206fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    typedef Benchmark INHERITED;
207fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
208fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
209fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/*
210fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot *  We try to special case square dashes (intervals are equal to strokewidth).
211fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */
212fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass DashLineBench : public Benchmark {
213fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkString fName;
214fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkScalar fStrokeWidth;
215fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool     fIsRound;
216fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    sk_sp<SkPathEffect> fPE;
217fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
218fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
219fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    DashLineBench(SkScalar width, bool isRound)  {
220fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fName.printf("dashline_%g_%s", SkScalarToFloat(width), isRound ? "circle" : "square");
221fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fStrokeWidth = width;
222fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fIsRound = isRound;
223fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
224fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkScalar vals[] = { SK_Scalar1, SK_Scalar1 };
225fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fPE = SkDashPathEffect::Make(vals, 2, 0);
226fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
227fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
228fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected:
229fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const char* onGetName() override {
230fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return fName.c_str();
231fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
232fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
233fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onDraw(int loops, SkCanvas* canvas) override {
234fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkPaint paint;
235fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        this->setupPaint(&paint);
236fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        paint.setStrokeWidth(fStrokeWidth);
237fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        paint.setStrokeCap(fIsRound ? SkPaint::kRound_Cap : SkPaint::kSquare_Cap);
238fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        paint.setPathEffect(fPE);
239fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        for (int i = 0; i < loops; ++i) {
240fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            canvas->drawLine(10 * SK_Scalar1, 10 * SK_Scalar1,
241fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                             640 * SK_Scalar1, 10 * SK_Scalar1, paint);
242fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
243fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
244fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
245fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
246fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    typedef Benchmark INHERITED;
247fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
248fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
249fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass DrawPointsDashingBench : public Benchmark {
250fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkString fName;
251fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    int      fStrokeWidth;
252fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool     fDoAA;
253fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
254fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    sk_sp<SkPathEffect> fPathEffect;
255fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
256fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
257fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    DrawPointsDashingBench(int dashLength, int strokeWidth, bool doAA)
258fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot         {
259fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fName.printf("drawpointsdash_%d_%d%s", dashLength, strokeWidth, doAA ? "_aa" : "_bw");
260fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fStrokeWidth = strokeWidth;
261fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fDoAA = doAA;
262fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
263fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkScalar vals[] = { SkIntToScalar(dashLength), SkIntToScalar(dashLength) };
264fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fPathEffect = SkDashPathEffect::Make(vals, 2, SK_Scalar1);
265fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
266fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
267fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected:
268fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const char* onGetName() override {
269fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return fName.c_str();
270fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
271fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
272fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onDraw(int loops, SkCanvas* canvas) override {
273fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkPaint p;
274fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        this->setupPaint(&p);
275fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        p.setColor(SK_ColorBLACK);
276fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        p.setStyle(SkPaint::kStroke_Style);
277fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        p.setStrokeWidth(SkIntToScalar(fStrokeWidth));
278fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        p.setPathEffect(fPathEffect);
279fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        p.setAntiAlias(fDoAA);
280fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
281fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkPoint pts[2] = {
282fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            { SkIntToScalar(10), 0 },
283fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            { SkIntToScalar(640), 0 }
284fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        };
285fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
286fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        for (int i = 0; i < loops; ++i) {
287fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            pts[0].fY = pts[1].fY = SkIntToScalar(i % 480);
288fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            canvas->drawPoints(SkCanvas::kLines_PointMode, 2, pts, p);
289fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
290fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
291fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
292fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
293fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    typedef Benchmark INHERITED;
294fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
295fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
296fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// Want to test how we handle dashing when 99% of the dash is clipped out
297fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass GiantDashBench : public Benchmark {
298fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkString fName;
299fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkScalar fStrokeWidth;
300fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkPoint  fPts[2];
301fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    sk_sp<SkPathEffect> fPathEffect;
302fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
303fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
304fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    enum LineType {
305fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        kHori_LineType,
306fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        kVert_LineType,
307fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        kDiag_LineType,
308fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        kLineTypeCount
309fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    };
310fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
311fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    static const char* LineTypeName(LineType lt) {
312fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        static const char* gNames[] = { "hori", "vert", "diag" };
313fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        static_assert(kLineTypeCount == SK_ARRAY_COUNT(gNames), "names_wrong_size");
314fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return gNames[lt];
315fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
316fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
317fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    GiantDashBench(LineType lt, SkScalar width)  {
318fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fName.printf("giantdashline_%s_%g", LineTypeName(lt), width);
319fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fStrokeWidth = width;
320fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
321fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        // deliberately pick intervals that won't be caught by asPoints(), so
322fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        // we can test the filterPath code-path.
323fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        const SkScalar intervals[] = { 20, 10, 10, 10 };
324fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fPathEffect = SkDashPathEffect::Make(intervals, SK_ARRAY_COUNT(intervals), 0);
325fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
326fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkScalar cx = 640 / 2;  // center X
327fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkScalar cy = 480 / 2;  // center Y
328fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkMatrix matrix;
329fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
330fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        switch (lt) {
331fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            case kHori_LineType:
332fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                matrix.setIdentity();
333fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                break;
334fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            case kVert_LineType:
335fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                matrix.setRotate(90, cx, cy);
336fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                break;
337fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            case kDiag_LineType:
338fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                matrix.setRotate(45, cx, cy);
339fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                break;
340fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            case kLineTypeCount:
341fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                // Not a real enum value.
342fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                break;
343fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
344fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
345fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        const SkScalar overshoot = 100*1000;
346fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        const SkPoint pts[2] = {
347fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            { -overshoot, cy }, { 640 + overshoot, cy }
348fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        };
349fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        matrix.mapPoints(fPts, pts, 2);
350fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
351fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
352fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected:
353fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const char* onGetName() override {
354fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return fName.c_str();
355fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
356fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
357fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onDraw(int loops, SkCanvas* canvas) override {
358fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkPaint p;
359fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        this->setupPaint(&p);
360fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        p.setStyle(SkPaint::kStroke_Style);
361fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        p.setStrokeWidth(fStrokeWidth);
362fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        p.setPathEffect(fPathEffect);
363fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
364fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        for (int i = 0; i < loops; i++) {
365fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            canvas->drawPoints(SkCanvas::kLines_PointMode, 2, fPts, p);
366fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
367fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
368fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
369fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
370fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    typedef Benchmark INHERITED;
371fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
372fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
373fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// Want to test how we draw a dashed grid (like what is used in spreadsheets) of many
374fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// small dashed lines switching back and forth between horizontal and vertical
375fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass DashGridBench : public Benchmark {
376fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkString fName;
377fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    int      fStrokeWidth;
378fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool     fDoAA;
379fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
380fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    sk_sp<SkPathEffect> fPathEffect;
381fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
382fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
383fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    DashGridBench(int dashLength, int strokeWidth, bool doAA) {
384fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fName.printf("dashgrid_%d_%d%s", dashLength, strokeWidth, doAA ? "_aa" : "_bw");
385fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fStrokeWidth = strokeWidth;
386fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fDoAA = doAA;
387fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
388fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkScalar vals[] = { SkIntToScalar(dashLength), SkIntToScalar(dashLength) };
389fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fPathEffect = SkDashPathEffect::Make(vals, 2, SK_Scalar1);
390fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
391fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
392fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected:
393fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const char* onGetName() override {
394fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return fName.c_str();
395fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
396fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
397fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onDraw(int loops, SkCanvas* canvas) override {
398fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkPaint p;
399fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        this->setupPaint(&p);
400fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        p.setColor(SK_ColorBLACK);
401fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        p.setStyle(SkPaint::kStroke_Style);
402fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        p.setStrokeWidth(SkIntToScalar(fStrokeWidth));
403fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        p.setPathEffect(fPathEffect);
404fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        p.setAntiAlias(fDoAA);
405fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
406fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkPoint pts[4] = {
407fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            { SkIntToScalar(0), 20.5f },
408fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            { SkIntToScalar(20), 20.5f },
409fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            { 20.5f, SkIntToScalar(0) },
410fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            { 20.5f, SkIntToScalar(20) }
411fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        };
412fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
413fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        for (int i = 0; i < loops; ++i) {
414fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            for (int j = 0; j < 10; ++j) {
415fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                for (int k = 0; k < 10; ++k) {
416fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    // Horizontal line
417fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    SkPoint horPts[2];
418fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    horPts[0].fX = pts[0].fX + k * 22.f;
419fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    horPts[0].fY = pts[0].fY + j * 22.f;
420fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    horPts[1].fX = pts[1].fX + k * 22.f;
421fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    horPts[1].fY = pts[1].fY + j * 22.f;
422fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    canvas->drawPoints(SkCanvas::kLines_PointMode, 2, horPts, p);
423fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
424fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    // Vertical line
425fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    SkPoint vertPts[2];
426fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    vertPts[0].fX = pts[2].fX + k * 22.f;
427fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    vertPts[0].fY = pts[2].fY + j * 22.f;
428fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    vertPts[1].fX = pts[3].fX + k * 22.f;
429fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    vertPts[1].fY = pts[3].fY + j * 22.f;
430fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    canvas->drawPoints(SkCanvas::kLines_PointMode, 2, vertPts, p);
431fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                }
432fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            }
433fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
434fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
435fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
436fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
437fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    typedef Benchmark INHERITED;
438fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
439fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
440fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot///////////////////////////////////////////////////////////////////////////////
441fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
442fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic const SkScalar gDots[] = { SK_Scalar1, SK_Scalar1 };
443fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
444fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define PARAM(array)    array, SK_ARRAY_COUNT(array)
445fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
446fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new DashBench(PARAM(gDots), 0); )
447fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new DashBench(PARAM(gDots), 1); )
448fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new DashBench(PARAM(gDots), 1, true); )
449fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new DashBench(PARAM(gDots), 4); )
450fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new MakeDashBench(make_poly, "poly"); )
451fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new MakeDashBench(make_quad, "quad"); )
452fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new MakeDashBench(make_cubic, "cubic"); )
453fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new DashLineBench(0, false); )
454fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new DashLineBench(SK_Scalar1, false); )
455fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new DashLineBench(2 * SK_Scalar1, false); )
456fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new DashLineBench(0, true); )
457fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new DashLineBench(SK_Scalar1, true); )
458fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new DashLineBench(2 * SK_Scalar1, true); )
459fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
460fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new DrawPointsDashingBench(1, 1, false); )
461fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new DrawPointsDashingBench(1, 1, true); )
462fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new DrawPointsDashingBench(3, 1, false); )
463fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new DrawPointsDashingBench(3, 1, true); )
464fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new DrawPointsDashingBench(5, 5, false); )
465fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new DrawPointsDashingBench(5, 5, true); )
466fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
467fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/* Disable the GiantDashBench for Android devices until we can better control
468fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * the memory usage. (https://code.google.com/p/skia/issues/detail?id=1430)
469fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */
470fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#ifndef SK_BUILD_FOR_ANDROID
471fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new GiantDashBench(GiantDashBench::kHori_LineType, 0); )
472fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new GiantDashBench(GiantDashBench::kVert_LineType, 0); )
473fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new GiantDashBench(GiantDashBench::kDiag_LineType, 0); )
474fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
475fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// pass 2 to explicitly avoid any 1-is-the-same-as-hairline special casing
476fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
477fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// hori_2 is just too slow to enable at the moment
478fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new GiantDashBench(GiantDashBench::kHori_LineType, 2); )
479fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new GiantDashBench(GiantDashBench::kVert_LineType, 2); )
480fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new GiantDashBench(GiantDashBench::kDiag_LineType, 2); )
481fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
482fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new DashGridBench(1, 1, true); )
483fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new DashGridBench(1, 1, false); )
484fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new DashGridBench(3, 1, true); )
485fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new DashGridBench(3, 1, false); )
486fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#endif
487