14aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com
24aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com/*
34aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com * Copyright 2011 Google Inc.
44aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com *
54aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com * Use of this source code is governed by a BSD-style license that can be
64aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com * found in the LICENSE file.
74aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com */
8f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina#include "Benchmark.h"
94aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com#include "SkBitmap.h"
104aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com#include "SkCanvas.h"
114aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com#include "SkDashPathEffect.h"
124aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com#include "SkPaint.h"
134aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com#include "SkPath.h"
144aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com#include "SkRandom.h"
154aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com#include "SkString.h"
164aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com#include "SkTDArray.h"
174aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com
18ef85e3c52c551a66e537cc8bdcbad77bdc87ef19reed@google.com
194aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com/*
204aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com *  Cases to consider:
214aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com *
224aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com *  1. antialiasing on/off (esp. width <= 1)
234aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com *  2. strokewidth == 0, 1, 2
244aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com *  3. hline, vline, diagonal, rect, oval
254aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com *  4. dots [1,1] ([N,N] where N=strokeWidth?) or arbitrary (e.g. [2,1] or [1,2,3,2])
264aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com */
274aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.comstatic void path_hline(SkPath* path) {
284aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com    path->moveTo(SkIntToScalar(10), SkIntToScalar(10));
294aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com    path->lineTo(SkIntToScalar(600), SkIntToScalar(10));
304aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com}
314aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com
32f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass DashBench : public Benchmark {
33ef85e3c52c551a66e537cc8bdcbad77bdc87ef19reed@google.comprotected:
3499a6ef48e396901b6cfb007b49d592ffac2bc597mike@reedtribe.org    SkString            fName;
354aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com    SkTDArray<SkScalar> fIntervals;
3699a6ef48e396901b6cfb007b49d592ffac2bc597mike@reedtribe.org    int                 fWidth;
37a584aed5f709ff9655fd3326e23cd6f602ac7ae4reed@google.com    SkPoint             fPts[2];
38a584aed5f709ff9655fd3326e23cd6f602ac7ae4reed@google.com    bool                fDoClip;
394aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com
404aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.compublic:
41410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    DashBench(const SkScalar intervals[], int count, int width,
42410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com              bool doClip = false)  {
434aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com        fIntervals.append(count, intervals);
4499a6ef48e396901b6cfb007b49d592ffac2bc597mike@reedtribe.org        for (int i = 0; i < count; ++i) {
4599a6ef48e396901b6cfb007b49d592ffac2bc597mike@reedtribe.org            fIntervals[i] *= width;
4699a6ef48e396901b6cfb007b49d592ffac2bc597mike@reedtribe.org        }
4799a6ef48e396901b6cfb007b49d592ffac2bc597mike@reedtribe.org        fWidth = width;
484ad22753504828342e47627b12210c2c47e7290areed@google.com        fName.printf("dash_%d_%s", width, doClip ? "clipped" : "noclip");
494ad22753504828342e47627b12210c2c47e7290areed@google.com        fDoClip = doClip;
50fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
51a584aed5f709ff9655fd3326e23cd6f602ac7ae4reed@google.com        fPts[0].set(SkIntToScalar(10), SkIntToScalar(10));
52a584aed5f709ff9655fd3326e23cd6f602ac7ae4reed@google.com        fPts[1].set(SkIntToScalar(600), SkIntToScalar(10));
534aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com    }
544aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com
554aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com    virtual void makePath(SkPath* path) {
564aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com        path_hline(path);
574aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com    }
584aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com
594aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.comprotected:
604aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com    virtual const char* onGetName() SK_OVERRIDE {
6199a6ef48e396901b6cfb007b49d592ffac2bc597mike@reedtribe.org        return fName.c_str();
624aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com    }
634aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com
643361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org    virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE {
654aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com        SkPaint paint;
664aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com        this->setupPaint(&paint);
674aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com        paint.setStyle(SkPaint::kStroke_Style);
6899a6ef48e396901b6cfb007b49d592ffac2bc597mike@reedtribe.org        paint.setStrokeWidth(SkIntToScalar(fWidth));
694aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com        paint.setAntiAlias(false);
704aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com
714aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com        SkPath path;
724aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com        this->makePath(&path);
734aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com
740a2bf90dccba3bde188e0386a7f0c60e6dde1ae9commit-bot@chromium.org        paint.setPathEffect(SkDashPathEffect::Create(fIntervals.begin(),
750a2bf90dccba3bde188e0386a7f0c60e6dde1ae9commit-bot@chromium.org                                                     fIntervals.count(), 0))->unref();
764ad22753504828342e47627b12210c2c47e7290areed@google.com
774ad22753504828342e47627b12210c2c47e7290areed@google.com        if (fDoClip) {
784ad22753504828342e47627b12210c2c47e7290areed@google.com            SkRect r = path.getBounds();
794ad22753504828342e47627b12210c2c47e7290areed@google.com            r.inset(-SkIntToScalar(20), -SkIntToScalar(20));
804ad22753504828342e47627b12210c2c47e7290areed@google.com            // now move it so we don't intersect
814ad22753504828342e47627b12210c2c47e7290areed@google.com            r.offset(0, r.height() * 3 / 2);
824ad22753504828342e47627b12210c2c47e7290areed@google.com            canvas->clipRect(r);
834ad22753504828342e47627b12210c2c47e7290areed@google.com        }
844ad22753504828342e47627b12210c2c47e7290areed@google.com
853361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        this->handlePath(canvas, path, paint, loops);
86ef85e3c52c551a66e537cc8bdcbad77bdc87ef19reed@google.com    }
87ef85e3c52c551a66e537cc8bdcbad77bdc87ef19reed@google.com
88ef85e3c52c551a66e537cc8bdcbad77bdc87ef19reed@google.com    virtual void handlePath(SkCanvas* canvas, const SkPath& path,
89ef85e3c52c551a66e537cc8bdcbad77bdc87ef19reed@google.com                            const SkPaint& paint, int N) {
904aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com        for (int i = 0; i < N; ++i) {
91a584aed5f709ff9655fd3326e23cd6f602ac7ae4reed@google.com//            canvas->drawPoints(SkCanvas::kLines_PointMode, 2, fPts, paint);
924aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com            canvas->drawPath(path, paint);
934aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com        }
944aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com    }
954aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com
964aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.comprivate:
97f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina    typedef Benchmark INHERITED;
984aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com};
994aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com
100ef85e3c52c551a66e537cc8bdcbad77bdc87ef19reed@google.comclass RectDashBench : public DashBench {
101ef85e3c52c551a66e537cc8bdcbad77bdc87ef19reed@google.compublic:
102410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    RectDashBench(const SkScalar intervals[], int count, int width)
103410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    : INHERITED(intervals, count, width) {
104ef85e3c52c551a66e537cc8bdcbad77bdc87ef19reed@google.com        fName.append("_rect");
105ef85e3c52c551a66e537cc8bdcbad77bdc87ef19reed@google.com    }
106fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
107ef85e3c52c551a66e537cc8bdcbad77bdc87ef19reed@google.comprotected:
108ef85e3c52c551a66e537cc8bdcbad77bdc87ef19reed@google.com    virtual void handlePath(SkCanvas* canvas, const SkPath& path,
109ef85e3c52c551a66e537cc8bdcbad77bdc87ef19reed@google.com                            const SkPaint& paint, int N) SK_OVERRIDE {
110ef85e3c52c551a66e537cc8bdcbad77bdc87ef19reed@google.com        SkPoint pts[2];
111ef85e3c52c551a66e537cc8bdcbad77bdc87ef19reed@google.com        if (!path.isLine(pts) || pts[0].fY != pts[1].fY) {
112ef85e3c52c551a66e537cc8bdcbad77bdc87ef19reed@google.com            this->INHERITED::handlePath(canvas, path, paint, N);
113ef85e3c52c551a66e537cc8bdcbad77bdc87ef19reed@google.com        } else {
114ef85e3c52c551a66e537cc8bdcbad77bdc87ef19reed@google.com            SkRect rect;
115ef85e3c52c551a66e537cc8bdcbad77bdc87ef19reed@google.com            rect.fLeft = pts[0].fX;
116ef85e3c52c551a66e537cc8bdcbad77bdc87ef19reed@google.com            rect.fTop = pts[0].fY - paint.getStrokeWidth() / 2;
117ef85e3c52c551a66e537cc8bdcbad77bdc87ef19reed@google.com            rect.fRight = rect.fLeft + SkIntToScalar(fWidth);
118ef85e3c52c551a66e537cc8bdcbad77bdc87ef19reed@google.com            rect.fBottom = rect.fTop + paint.getStrokeWidth();
119fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
120ef85e3c52c551a66e537cc8bdcbad77bdc87ef19reed@google.com            SkPaint p(paint);
121ef85e3c52c551a66e537cc8bdcbad77bdc87ef19reed@google.com            p.setStyle(SkPaint::kFill_Style);
122ef85e3c52c551a66e537cc8bdcbad77bdc87ef19reed@google.com            p.setPathEffect(NULL);
123fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
124ef85e3c52c551a66e537cc8bdcbad77bdc87ef19reed@google.com            int count = SkScalarRoundToInt((pts[1].fX - pts[0].fX) / (2*fWidth));
125ef85e3c52c551a66e537cc8bdcbad77bdc87ef19reed@google.com            SkScalar dx = SkIntToScalar(2 * fWidth);
126fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
127ef85e3c52c551a66e537cc8bdcbad77bdc87ef19reed@google.com            for (int i = 0; i < N*10; ++i) {
128ef85e3c52c551a66e537cc8bdcbad77bdc87ef19reed@google.com                SkRect r = rect;
129ef85e3c52c551a66e537cc8bdcbad77bdc87ef19reed@google.com                for (int j = 0; j < count; ++j) {
130ef85e3c52c551a66e537cc8bdcbad77bdc87ef19reed@google.com                    canvas->drawRect(r, p);
131ef85e3c52c551a66e537cc8bdcbad77bdc87ef19reed@google.com                    r.offset(dx, 0);
132ef85e3c52c551a66e537cc8bdcbad77bdc87ef19reed@google.com                }
133ef85e3c52c551a66e537cc8bdcbad77bdc87ef19reed@google.com            }
134ef85e3c52c551a66e537cc8bdcbad77bdc87ef19reed@google.com        }
135ef85e3c52c551a66e537cc8bdcbad77bdc87ef19reed@google.com    }
136fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
137ef85e3c52c551a66e537cc8bdcbad77bdc87ef19reed@google.comprivate:
138ef85e3c52c551a66e537cc8bdcbad77bdc87ef19reed@google.com    typedef DashBench INHERITED;
139ef85e3c52c551a66e537cc8bdcbad77bdc87ef19reed@google.com};
140ef85e3c52c551a66e537cc8bdcbad77bdc87ef19reed@google.com
141ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.comstatic void make_unit_star(SkPath* path, int n) {
142ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com    SkScalar rad = -SK_ScalarPI / 2;
143ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com    const SkScalar drad = (n >> 1) * SK_ScalarPI * 2 / n;
144fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
145ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com    path->moveTo(0, -SK_Scalar1);
146ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com    for (int i = 1; i < n; i++) {
147ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com        rad += drad;
148ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com        SkScalar cosV, sinV = SkScalarSinCos(rad, &cosV);
149ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com        path->lineTo(cosV, sinV);
150ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com    }
151ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com    path->close();
152ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com}
153ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com
154ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.comstatic void make_poly(SkPath* path) {
155ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com    make_unit_star(path, 9);
156ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com    SkMatrix matrix;
157ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com    matrix.setScale(SkIntToScalar(100), SkIntToScalar(100));
158ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com    path->transform(matrix);
159ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com}
160ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com
161ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.comstatic void make_quad(SkPath* path) {
162ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com    SkScalar x0 = SkIntToScalar(10);
163ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com    SkScalar y0 = SkIntToScalar(10);
164ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com    path->moveTo(x0, y0);
165ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com    path->quadTo(x0,                    y0 + 400 * SK_Scalar1,
166ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com                 x0 + 600 * SK_Scalar1, y0 + 400 * SK_Scalar1);
167ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com}
168ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com
169ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.comstatic void make_cubic(SkPath* path) {
170ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com    SkScalar x0 = SkIntToScalar(10);
171ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com    SkScalar y0 = SkIntToScalar(10);
172ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com    path->moveTo(x0, y0);
173ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com    path->cubicTo(x0,                    y0 + 400 * SK_Scalar1,
174ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com                  x0 + 600 * SK_Scalar1, y0 + 400 * SK_Scalar1,
175ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com                  x0 + 600 * SK_Scalar1, y0);
176ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com}
177ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com
178f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass MakeDashBench : public Benchmark {
179ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com    SkString fName;
180ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com    SkPath   fPath;
181ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com    SkAutoTUnref<SkPathEffect> fPE;
18273bb3bee937ce55b5bcdb9e480e14fb4df809e5dskia.committer@gmail.com
183ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.compublic:
184410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    MakeDashBench(void (*proc)(SkPath*), const char name[])  {
185ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com        fName.printf("makedash_%s", name);
186ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com        proc(&fPath);
18773bb3bee937ce55b5bcdb9e480e14fb4df809e5dskia.committer@gmail.com
188ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com        SkScalar vals[] = { SkIntToScalar(4), SkIntToScalar(4) };
1890a2bf90dccba3bde188e0386a7f0c60e6dde1ae9commit-bot@chromium.org        fPE.reset(SkDashPathEffect::Create(vals, 2, 0));
190ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com    }
19173bb3bee937ce55b5bcdb9e480e14fb4df809e5dskia.committer@gmail.com
192ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.comprotected:
193ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com    virtual const char* onGetName() SK_OVERRIDE {
194ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com        return fName.c_str();
195ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com    }
19673bb3bee937ce55b5bcdb9e480e14fb4df809e5dskia.committer@gmail.com
1973361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org    virtual void onDraw(const int loops, SkCanvas*) SK_OVERRIDE {
198ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com        SkPath dst;
1993361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int i = 0; i < loops; ++i) {
200fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com            SkStrokeRec rec(SkStrokeRec::kHairline_InitStyle);
20173bb3bee937ce55b5bcdb9e480e14fb4df809e5dskia.committer@gmail.com
2024bbdeac58cc928dc66296bde3bd06e78070d96b7reed@google.com            fPE->filterPath(&dst, fPath, &rec, NULL);
203ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com            dst.rewind();
204ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com        }
205ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com    }
20673bb3bee937ce55b5bcdb9e480e14fb4df809e5dskia.committer@gmail.com
20731e9d64cb1a1fe07cdb2e4a5cd64c817a9373a86reed@google.comprivate:
208f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina    typedef Benchmark INHERITED;
20931e9d64cb1a1fe07cdb2e4a5cd64c817a9373a86reed@google.com};
210fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
2115125d84433599b6103127cd1aaaa0e4e2f5c4e66reed@google.com/*
2125125d84433599b6103127cd1aaaa0e4e2f5c4e66reed@google.com *  We try to special case square dashes (intervals are equal to strokewidth).
2135125d84433599b6103127cd1aaaa0e4e2f5c4e66reed@google.com */
214f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass DashLineBench : public Benchmark {
21531e9d64cb1a1fe07cdb2e4a5cd64c817a9373a86reed@google.com    SkString fName;
2165125d84433599b6103127cd1aaaa0e4e2f5c4e66reed@google.com    SkScalar fStrokeWidth;
2175125d84433599b6103127cd1aaaa0e4e2f5c4e66reed@google.com    bool     fIsRound;
21831e9d64cb1a1fe07cdb2e4a5cd64c817a9373a86reed@google.com    SkAutoTUnref<SkPathEffect> fPE;
21973bb3bee937ce55b5bcdb9e480e14fb4df809e5dskia.committer@gmail.com
22031e9d64cb1a1fe07cdb2e4a5cd64c817a9373a86reed@google.compublic:
221410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    DashLineBench(SkScalar width, bool isRound)  {
2225125d84433599b6103127cd1aaaa0e4e2f5c4e66reed@google.com        fName.printf("dashline_%g_%s", SkScalarToFloat(width), isRound ? "circle" : "square");
2235125d84433599b6103127cd1aaaa0e4e2f5c4e66reed@google.com        fStrokeWidth = width;
2245125d84433599b6103127cd1aaaa0e4e2f5c4e66reed@google.com        fIsRound = isRound;
22573bb3bee937ce55b5bcdb9e480e14fb4df809e5dskia.committer@gmail.com
2265125d84433599b6103127cd1aaaa0e4e2f5c4e66reed@google.com        SkScalar vals[] = { SK_Scalar1, SK_Scalar1 };
2270a2bf90dccba3bde188e0386a7f0c60e6dde1ae9commit-bot@chromium.org        fPE.reset(SkDashPathEffect::Create(vals, 2, 0));
22831e9d64cb1a1fe07cdb2e4a5cd64c817a9373a86reed@google.com    }
22973bb3bee937ce55b5bcdb9e480e14fb4df809e5dskia.committer@gmail.com
23031e9d64cb1a1fe07cdb2e4a5cd64c817a9373a86reed@google.comprotected:
23131e9d64cb1a1fe07cdb2e4a5cd64c817a9373a86reed@google.com    virtual const char* onGetName() SK_OVERRIDE {
23231e9d64cb1a1fe07cdb2e4a5cd64c817a9373a86reed@google.com        return fName.c_str();
23331e9d64cb1a1fe07cdb2e4a5cd64c817a9373a86reed@google.com    }
23473bb3bee937ce55b5bcdb9e480e14fb4df809e5dskia.committer@gmail.com
2353361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org    virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE {
23631e9d64cb1a1fe07cdb2e4a5cd64c817a9373a86reed@google.com        SkPaint paint;
23731e9d64cb1a1fe07cdb2e4a5cd64c817a9373a86reed@google.com        this->setupPaint(&paint);
2385125d84433599b6103127cd1aaaa0e4e2f5c4e66reed@google.com        paint.setStrokeWidth(fStrokeWidth);
2395125d84433599b6103127cd1aaaa0e4e2f5c4e66reed@google.com        paint.setStrokeCap(fIsRound ? SkPaint::kRound_Cap : SkPaint::kSquare_Cap);
24031e9d64cb1a1fe07cdb2e4a5cd64c817a9373a86reed@google.com        paint.setPathEffect(fPE);
2413361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int i = 0; i < loops; ++i) {
2425125d84433599b6103127cd1aaaa0e4e2f5c4e66reed@google.com            canvas->drawLine(10 * SK_Scalar1, 10 * SK_Scalar1,
2435125d84433599b6103127cd1aaaa0e4e2f5c4e66reed@google.com                             640 * SK_Scalar1, 10 * SK_Scalar1, paint);
24431e9d64cb1a1fe07cdb2e4a5cd64c817a9373a86reed@google.com        }
24531e9d64cb1a1fe07cdb2e4a5cd64c817a9373a86reed@google.com    }
24673bb3bee937ce55b5bcdb9e480e14fb4df809e5dskia.committer@gmail.com
247ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.comprivate:
248f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina    typedef Benchmark INHERITED;
249ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com};
250ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com
251f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass DrawPointsDashingBench : public Benchmark {
252935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.com    SkString fName;
253935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.com    int      fStrokeWidth;
254ca47aae7ecfdafb5e88baee13737908b79a4c716robertphillips@google.com    bool     fDoAA;
255935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.com
256935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.com    SkAutoTUnref<SkPathEffect> fPathEffect;
257935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.com
258935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.compublic:
259410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    DrawPointsDashingBench(int dashLength, int strokeWidth, bool doAA)
260410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com         {
261935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.com        fName.printf("drawpointsdash_%d_%d%s", dashLength, strokeWidth, doAA ? "_aa" : "_bw");
262935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.com        fStrokeWidth = strokeWidth;
263ca47aae7ecfdafb5e88baee13737908b79a4c716robertphillips@google.com        fDoAA = doAA;
264935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.com
265935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.com        SkScalar vals[] = { SkIntToScalar(dashLength), SkIntToScalar(dashLength) };
26635c03fbf101306e8e82141853de4c664cbafedbbcommit-bot@chromium.org        fPathEffect.reset(SkDashPathEffect::Create(vals, 2, SK_Scalar1));
267935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.com    }
268935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.com
269935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.comprotected:
270935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.com    virtual const char* onGetName() SK_OVERRIDE {
271935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.com        return fName.c_str();
272935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.com    }
273935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.com
2743361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org    virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE {
275935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.com        SkPaint p;
276935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.com        this->setupPaint(&p);
277935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.com        p.setColor(SK_ColorBLACK);
278935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.com        p.setStyle(SkPaint::kStroke_Style);
279935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.com        p.setStrokeWidth(SkIntToScalar(fStrokeWidth));
280935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.com        p.setPathEffect(fPathEffect);
281ca47aae7ecfdafb5e88baee13737908b79a4c716robertphillips@google.com        p.setAntiAlias(fDoAA);
282935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.com
283935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.com        SkPoint pts[2] = {
284935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.com            { SkIntToScalar(10), 0 },
285935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.com            { SkIntToScalar(640), 0 }
286935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.com        };
287935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.com
2883361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int i = 0; i < loops; ++i) {
289935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.com            pts[0].fY = pts[1].fY = SkIntToScalar(i % 480);
290935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.com            canvas->drawPoints(SkCanvas::kLines_PointMode, 2, pts, p);
291935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.com        }
292935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.com    }
293935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.com
294935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.comprivate:
295f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina    typedef Benchmark INHERITED;
296935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.com};
297996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com
298e5ceea9232ecdb76d3b2457146e7dcfd28c3d0fbreed@google.com// Want to test how we handle dashing when 99% of the dash is clipped out
299f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass GiantDashBench : public Benchmark {
300996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com    SkString fName;
301e5ceea9232ecdb76d3b2457146e7dcfd28c3d0fbreed@google.com    SkScalar fStrokeWidth;
302996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com    SkPoint  fPts[2];
303996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com    SkAutoTUnref<SkPathEffect> fPathEffect;
3044024f32d99b63a599c544a49f526e53c25135159skia.committer@gmail.com
305996f64f8e752fb1207d446320c0fcce8505c5611reed@google.compublic:
306996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com    enum LineType {
307996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com        kHori_LineType,
308996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com        kVert_LineType,
3095d7ca957edcc57f7f0be2741183e8d3c36cb5129commit-bot@chromium.org        kDiag_LineType,
3105d7ca957edcc57f7f0be2741183e8d3c36cb5129commit-bot@chromium.org        kLineTypeCount
311996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com    };
312996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com
313996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com    static const char* LineTypeName(LineType lt) {
314996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com        static const char* gNames[] = { "hori", "vert", "diag" };
3155d7ca957edcc57f7f0be2741183e8d3c36cb5129commit-bot@chromium.org        SK_COMPILE_ASSERT(kLineTypeCount == SK_ARRAY_COUNT(gNames), names_wrong_size);
316996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com        return gNames[lt];
317996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com    }
318996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com
319410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    GiantDashBench(LineType lt, SkScalar width)  {
320e5ceea9232ecdb76d3b2457146e7dcfd28c3d0fbreed@google.com        fName.printf("giantdashline_%s_%g", LineTypeName(lt), width);
321e5ceea9232ecdb76d3b2457146e7dcfd28c3d0fbreed@google.com        fStrokeWidth = width;
322e5ceea9232ecdb76d3b2457146e7dcfd28c3d0fbreed@google.com
323996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com        // deliberately pick intervals that won't be caught by asPoints(), so
324996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com        // we can test the filterPath code-path.
325ae4976c9d09478975aac3a2956e9918d606fea46commit-bot@chromium.org        const SkScalar intervals[] = { 20, 10, 10, 10 };
3260a2bf90dccba3bde188e0386a7f0c60e6dde1ae9commit-bot@chromium.org        fPathEffect.reset(SkDashPathEffect::Create(intervals,
3270a2bf90dccba3bde188e0386a7f0c60e6dde1ae9commit-bot@chromium.org                                                   SK_ARRAY_COUNT(intervals), 0));
328996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com
329996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com        SkScalar cx = 640 / 2;  // center X
330996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com        SkScalar cy = 480 / 2;  // center Y
331996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com        SkMatrix matrix;
3324024f32d99b63a599c544a49f526e53c25135159skia.committer@gmail.com
333996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com        switch (lt) {
334996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com            case kHori_LineType:
335996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com                matrix.setIdentity();
336996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com                break;
337996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com            case kVert_LineType:
338996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com                matrix.setRotate(90, cx, cy);
339996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com                break;
340996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com            case kDiag_LineType:
341996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com                matrix.setRotate(45, cx, cy);
342996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com                break;
3435d7ca957edcc57f7f0be2741183e8d3c36cb5129commit-bot@chromium.org            case kLineTypeCount:
3445d7ca957edcc57f7f0be2741183e8d3c36cb5129commit-bot@chromium.org                // Not a real enum value.
3455d7ca957edcc57f7f0be2741183e8d3c36cb5129commit-bot@chromium.org                break;
346996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com        }
3474024f32d99b63a599c544a49f526e53c25135159skia.committer@gmail.com
348e5ceea9232ecdb76d3b2457146e7dcfd28c3d0fbreed@google.com        const SkScalar overshoot = 100*1000;
349996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com        const SkPoint pts[2] = {
350996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com            { -overshoot, cy }, { 640 + overshoot, cy }
351996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com        };
352996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com        matrix.mapPoints(fPts, pts, 2);
353996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com    }
3544024f32d99b63a599c544a49f526e53c25135159skia.committer@gmail.com
355996f64f8e752fb1207d446320c0fcce8505c5611reed@google.comprotected:
356996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com    virtual const char* onGetName() SK_OVERRIDE {
357996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com        return fName.c_str();
358996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com    }
3594024f32d99b63a599c544a49f526e53c25135159skia.committer@gmail.com
3603361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org    virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE {
361996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com        SkPaint p;
362996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com        this->setupPaint(&p);
363996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com        p.setStyle(SkPaint::kStroke_Style);
364e5ceea9232ecdb76d3b2457146e7dcfd28c3d0fbreed@google.com        p.setStrokeWidth(fStrokeWidth);
365996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com        p.setPathEffect(fPathEffect);
366996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com
3673361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int i = 0; i < loops; i++) {
368c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com            canvas->drawPoints(SkCanvas::kLines_PointMode, 2, fPts, p);
369c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com        }
370996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com    }
3714024f32d99b63a599c544a49f526e53c25135159skia.committer@gmail.com
372996f64f8e752fb1207d446320c0fcce8505c5611reed@google.comprivate:
373f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina    typedef Benchmark INHERITED;
374996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com};
375996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com
37605bb6f136d8d2b2d45a912cf967a09e4d42dd4d0egdaniel// Want to test how we draw a dashed grid (like what is used in spreadsheets) of many
37705bb6f136d8d2b2d45a912cf967a09e4d42dd4d0egdaniel// small dashed lines switching back and forth between horizontal and vertical
378f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass DashGridBench : public Benchmark {
37905bb6f136d8d2b2d45a912cf967a09e4d42dd4d0egdaniel    SkString fName;
38005bb6f136d8d2b2d45a912cf967a09e4d42dd4d0egdaniel    int      fStrokeWidth;
38105bb6f136d8d2b2d45a912cf967a09e4d42dd4d0egdaniel    bool     fDoAA;
38205bb6f136d8d2b2d45a912cf967a09e4d42dd4d0egdaniel
38305bb6f136d8d2b2d45a912cf967a09e4d42dd4d0egdaniel    SkAutoTUnref<SkPathEffect> fPathEffect;
38405bb6f136d8d2b2d45a912cf967a09e4d42dd4d0egdaniel
38505bb6f136d8d2b2d45a912cf967a09e4d42dd4d0egdanielpublic:
38605bb6f136d8d2b2d45a912cf967a09e4d42dd4d0egdaniel    DashGridBench(int dashLength, int strokeWidth, bool doAA) {
38705bb6f136d8d2b2d45a912cf967a09e4d42dd4d0egdaniel        fName.printf("dashgrid_%d_%d%s", dashLength, strokeWidth, doAA ? "_aa" : "_bw");
38805bb6f136d8d2b2d45a912cf967a09e4d42dd4d0egdaniel        fStrokeWidth = strokeWidth;
38905bb6f136d8d2b2d45a912cf967a09e4d42dd4d0egdaniel        fDoAA = doAA;
39005bb6f136d8d2b2d45a912cf967a09e4d42dd4d0egdaniel
39105bb6f136d8d2b2d45a912cf967a09e4d42dd4d0egdaniel        SkScalar vals[] = { SkIntToScalar(dashLength), SkIntToScalar(dashLength) };
39205bb6f136d8d2b2d45a912cf967a09e4d42dd4d0egdaniel        fPathEffect.reset(SkDashPathEffect::Create(vals, 2, SK_Scalar1));
39305bb6f136d8d2b2d45a912cf967a09e4d42dd4d0egdaniel    }
39405bb6f136d8d2b2d45a912cf967a09e4d42dd4d0egdaniel
39505bb6f136d8d2b2d45a912cf967a09e4d42dd4d0egdanielprotected:
39605bb6f136d8d2b2d45a912cf967a09e4d42dd4d0egdaniel    virtual const char* onGetName() SK_OVERRIDE {
39705bb6f136d8d2b2d45a912cf967a09e4d42dd4d0egdaniel        return fName.c_str();
39805bb6f136d8d2b2d45a912cf967a09e4d42dd4d0egdaniel    }
39905bb6f136d8d2b2d45a912cf967a09e4d42dd4d0egdaniel
40005bb6f136d8d2b2d45a912cf967a09e4d42dd4d0egdaniel    virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE {
40105bb6f136d8d2b2d45a912cf967a09e4d42dd4d0egdaniel        SkPaint p;
40205bb6f136d8d2b2d45a912cf967a09e4d42dd4d0egdaniel        this->setupPaint(&p);
40305bb6f136d8d2b2d45a912cf967a09e4d42dd4d0egdaniel        p.setColor(SK_ColorBLACK);
40405bb6f136d8d2b2d45a912cf967a09e4d42dd4d0egdaniel        p.setStyle(SkPaint::kStroke_Style);
40505bb6f136d8d2b2d45a912cf967a09e4d42dd4d0egdaniel        p.setStrokeWidth(SkIntToScalar(fStrokeWidth));
40605bb6f136d8d2b2d45a912cf967a09e4d42dd4d0egdaniel        p.setPathEffect(fPathEffect);
40705bb6f136d8d2b2d45a912cf967a09e4d42dd4d0egdaniel        p.setAntiAlias(fDoAA);
40805bb6f136d8d2b2d45a912cf967a09e4d42dd4d0egdaniel
40905bb6f136d8d2b2d45a912cf967a09e4d42dd4d0egdaniel        SkPoint pts[4] = {
41005bb6f136d8d2b2d45a912cf967a09e4d42dd4d0egdaniel            { SkIntToScalar(0), 20.5f },
41105bb6f136d8d2b2d45a912cf967a09e4d42dd4d0egdaniel            { SkIntToScalar(20), 20.5f },
41205bb6f136d8d2b2d45a912cf967a09e4d42dd4d0egdaniel            { 20.5f, SkIntToScalar(0) },
41305bb6f136d8d2b2d45a912cf967a09e4d42dd4d0egdaniel            { 20.5f, SkIntToScalar(20) }
41405bb6f136d8d2b2d45a912cf967a09e4d42dd4d0egdaniel        };
41505bb6f136d8d2b2d45a912cf967a09e4d42dd4d0egdaniel
41605bb6f136d8d2b2d45a912cf967a09e4d42dd4d0egdaniel        for (int i = 0; i < loops; ++i) {
41705bb6f136d8d2b2d45a912cf967a09e4d42dd4d0egdaniel            for (int j = 0; j < 10; ++j) {
41805bb6f136d8d2b2d45a912cf967a09e4d42dd4d0egdaniel                for (int k = 0; k < 10; ++k) {
41905bb6f136d8d2b2d45a912cf967a09e4d42dd4d0egdaniel                    // Horizontal line
42005bb6f136d8d2b2d45a912cf967a09e4d42dd4d0egdaniel                    SkPoint horPts[2];
42105bb6f136d8d2b2d45a912cf967a09e4d42dd4d0egdaniel                    horPts[0].fX = pts[0].fX + k * 22.f;
42205bb6f136d8d2b2d45a912cf967a09e4d42dd4d0egdaniel                    horPts[0].fY = pts[0].fY + j * 22.f;
42305bb6f136d8d2b2d45a912cf967a09e4d42dd4d0egdaniel                    horPts[1].fX = pts[1].fX + k * 22.f;
42405bb6f136d8d2b2d45a912cf967a09e4d42dd4d0egdaniel                    horPts[1].fY = pts[1].fY + j * 22.f;
42505bb6f136d8d2b2d45a912cf967a09e4d42dd4d0egdaniel                    canvas->drawPoints(SkCanvas::kLines_PointMode, 2, horPts, p);
42605bb6f136d8d2b2d45a912cf967a09e4d42dd4d0egdaniel
42705bb6f136d8d2b2d45a912cf967a09e4d42dd4d0egdaniel                    // Vertical line
42805bb6f136d8d2b2d45a912cf967a09e4d42dd4d0egdaniel                    SkPoint vertPts[2];
42905bb6f136d8d2b2d45a912cf967a09e4d42dd4d0egdaniel                    vertPts[0].fX = pts[2].fX + k * 22.f;
43005bb6f136d8d2b2d45a912cf967a09e4d42dd4d0egdaniel                    vertPts[0].fY = pts[2].fY + j * 22.f;
43105bb6f136d8d2b2d45a912cf967a09e4d42dd4d0egdaniel                    vertPts[1].fX = pts[3].fX + k * 22.f;
43205bb6f136d8d2b2d45a912cf967a09e4d42dd4d0egdaniel                    vertPts[1].fY = pts[3].fY + j * 22.f;
43305bb6f136d8d2b2d45a912cf967a09e4d42dd4d0egdaniel                    canvas->drawPoints(SkCanvas::kLines_PointMode, 2, vertPts, p);
43405bb6f136d8d2b2d45a912cf967a09e4d42dd4d0egdaniel                }
43505bb6f136d8d2b2d45a912cf967a09e4d42dd4d0egdaniel            }
43605bb6f136d8d2b2d45a912cf967a09e4d42dd4d0egdaniel        }
43705bb6f136d8d2b2d45a912cf967a09e4d42dd4d0egdaniel    }
43805bb6f136d8d2b2d45a912cf967a09e4d42dd4d0egdaniel
43905bb6f136d8d2b2d45a912cf967a09e4d42dd4d0egdanielprivate:
440f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina    typedef Benchmark INHERITED;
44105bb6f136d8d2b2d45a912cf967a09e4d42dd4d0egdaniel};
442996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com
4434aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com///////////////////////////////////////////////////////////////////////////////
4444aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com
4454aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.comstatic const SkScalar gDots[] = { SK_Scalar1, SK_Scalar1 };
4464aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com
4474aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com#define PARAM(array)    array, SK_ARRAY_COUNT(array)
4484aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com
449410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new DashBench(PARAM(gDots), 0); )
450410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new DashBench(PARAM(gDots), 1); )
451410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new DashBench(PARAM(gDots), 1, true); )
452410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new DashBench(PARAM(gDots), 4); )
453410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new MakeDashBench(make_poly, "poly"); )
454410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new MakeDashBench(make_quad, "quad"); )
455410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new MakeDashBench(make_cubic, "cubic"); )
456410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new DashLineBench(0, false); )
457410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new DashLineBench(SK_Scalar1, false); )
458410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new DashLineBench(2 * SK_Scalar1, false); )
459410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new DashLineBench(0, true); )
460410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new DashLineBench(SK_Scalar1, true); )
461410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new DashLineBench(2 * SK_Scalar1, true); )
462410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com
463410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new DrawPointsDashingBench(1, 1, false); )
464410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new DrawPointsDashingBench(1, 1, true); )
465410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new DrawPointsDashingBench(3, 1, false); )
466410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new DrawPointsDashingBench(3, 1, true); )
467410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new DrawPointsDashingBench(5, 5, false); )
468410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new DrawPointsDashingBench(5, 5, true); )
469996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com
47069feaca231990003a7f3dadd6bfb9110dc6b9b96djsollen@google.com/* Disable the GiantDashBench for Android devices until we can better control
47169feaca231990003a7f3dadd6bfb9110dc6b9b96djsollen@google.com * the memory usage. (https://code.google.com/p/skia/issues/detail?id=1430)
47269feaca231990003a7f3dadd6bfb9110dc6b9b96djsollen@google.com */
47369feaca231990003a7f3dadd6bfb9110dc6b9b96djsollen@google.com#ifndef SK_BUILD_FOR_ANDROID
474410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new GiantDashBench(GiantDashBench::kHori_LineType, 0); )
475410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new GiantDashBench(GiantDashBench::kVert_LineType, 0); )
476410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new GiantDashBench(GiantDashBench::kDiag_LineType, 0); )
477e5ceea9232ecdb76d3b2457146e7dcfd28c3d0fbreed@google.com
478e5ceea9232ecdb76d3b2457146e7dcfd28c3d0fbreed@google.com// pass 2 to explicitly avoid any 1-is-the-same-as-hairline special casing
479e5ceea9232ecdb76d3b2457146e7dcfd28c3d0fbreed@google.com
480e5ceea9232ecdb76d3b2457146e7dcfd28c3d0fbreed@google.com// hori_2 is just too slow to enable at the moment
481410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new GiantDashBench(GiantDashBench::kHori_LineType, 2); )
482410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new GiantDashBench(GiantDashBench::kVert_LineType, 2); )
483410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new GiantDashBench(GiantDashBench::kDiag_LineType, 2); )
48405bb6f136d8d2b2d45a912cf967a09e4d42dd4d0egdaniel
48505bb6f136d8d2b2d45a912cf967a09e4d42dd4d0egdanielDEF_BENCH( return new DashGridBench(1, 1, true); )
48605bb6f136d8d2b2d45a912cf967a09e4d42dd4d0egdanielDEF_BENCH( return new DashGridBench(1, 1, false); )
48705bb6f136d8d2b2d45a912cf967a09e4d42dd4d0egdanielDEF_BENCH( return new DashGridBench(3, 1, true); )
48805bb6f136d8d2b2d45a912cf967a09e4d42dd4d0egdanielDEF_BENCH( return new DashGridBench(3, 1, false); )
48969feaca231990003a7f3dadd6bfb9110dc6b9b96djsollen@google.com#endif
490