DashBench.cpp revision e5ceea9232ecdb76d3b2457146e7dcfd28c3d0fb
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 */
84aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com#include "SkBenchmark.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
324aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.comclass DashBench : public SkBenchmark {
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.com    enum {
414aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com        N = SkBENCHLOOP(100)
424aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com    };
434aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.compublic:
444ad22753504828342e47627b12210c2c47e7290areed@google.com    DashBench(void* param, const SkScalar intervals[], int count, int width,
454ad22753504828342e47627b12210c2c47e7290areed@google.com              bool doClip = false) : INHERITED(param) {
464aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com        fIntervals.append(count, intervals);
4799a6ef48e396901b6cfb007b49d592ffac2bc597mike@reedtribe.org        for (int i = 0; i < count; ++i) {
4899a6ef48e396901b6cfb007b49d592ffac2bc597mike@reedtribe.org            fIntervals[i] *= width;
4999a6ef48e396901b6cfb007b49d592ffac2bc597mike@reedtribe.org        }
5099a6ef48e396901b6cfb007b49d592ffac2bc597mike@reedtribe.org        fWidth = width;
514ad22753504828342e47627b12210c2c47e7290areed@google.com        fName.printf("dash_%d_%s", width, doClip ? "clipped" : "noclip");
524ad22753504828342e47627b12210c2c47e7290areed@google.com        fDoClip = doClip;
53fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
54a584aed5f709ff9655fd3326e23cd6f602ac7ae4reed@google.com        fPts[0].set(SkIntToScalar(10), SkIntToScalar(10));
55a584aed5f709ff9655fd3326e23cd6f602ac7ae4reed@google.com        fPts[1].set(SkIntToScalar(600), SkIntToScalar(10));
564aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com    }
574aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com
584aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com    virtual void makePath(SkPath* path) {
594aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com        path_hline(path);
604aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com    }
614aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com
624aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.comprotected:
634aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com    virtual const char* onGetName() SK_OVERRIDE {
6499a6ef48e396901b6cfb007b49d592ffac2bc597mike@reedtribe.org        return fName.c_str();
654aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com    }
664aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com
674aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com    virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
684aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com        SkPaint paint;
694aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com        this->setupPaint(&paint);
704aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com        paint.setStyle(SkPaint::kStroke_Style);
7199a6ef48e396901b6cfb007b49d592ffac2bc597mike@reedtribe.org        paint.setStrokeWidth(SkIntToScalar(fWidth));
724aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com        paint.setAntiAlias(false);
734aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com
744aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com        SkPath path;
754aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com        this->makePath(&path);
764aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com
774aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com        paint.setPathEffect(new SkDashPathEffect(fIntervals.begin(),
784aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com                                                 fIntervals.count(), 0))->unref();
794ad22753504828342e47627b12210c2c47e7290areed@google.com
804ad22753504828342e47627b12210c2c47e7290areed@google.com        if (fDoClip) {
814ad22753504828342e47627b12210c2c47e7290areed@google.com            SkRect r = path.getBounds();
824ad22753504828342e47627b12210c2c47e7290areed@google.com            r.inset(-SkIntToScalar(20), -SkIntToScalar(20));
834ad22753504828342e47627b12210c2c47e7290areed@google.com            // now move it so we don't intersect
844ad22753504828342e47627b12210c2c47e7290areed@google.com            r.offset(0, r.height() * 3 / 2);
854ad22753504828342e47627b12210c2c47e7290areed@google.com            canvas->clipRect(r);
864ad22753504828342e47627b12210c2c47e7290areed@google.com        }
874ad22753504828342e47627b12210c2c47e7290areed@google.com
88ef85e3c52c551a66e537cc8bdcbad77bdc87ef19reed@google.com        this->handlePath(canvas, path, paint, N);
89ef85e3c52c551a66e537cc8bdcbad77bdc87ef19reed@google.com    }
90ef85e3c52c551a66e537cc8bdcbad77bdc87ef19reed@google.com
91ef85e3c52c551a66e537cc8bdcbad77bdc87ef19reed@google.com    virtual void handlePath(SkCanvas* canvas, const SkPath& path,
92ef85e3c52c551a66e537cc8bdcbad77bdc87ef19reed@google.com                            const SkPaint& paint, int N) {
934aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com        for (int i = 0; i < N; ++i) {
94a584aed5f709ff9655fd3326e23cd6f602ac7ae4reed@google.com//            canvas->drawPoints(SkCanvas::kLines_PointMode, 2, fPts, paint);
954aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com            canvas->drawPath(path, paint);
964aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com        }
974aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com    }
984aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com
994aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.comprivate:
1004aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com    typedef SkBenchmark INHERITED;
1014aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com};
1024aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com
103ef85e3c52c551a66e537cc8bdcbad77bdc87ef19reed@google.comclass RectDashBench : public DashBench {
104ef85e3c52c551a66e537cc8bdcbad77bdc87ef19reed@google.compublic:
1054ad22753504828342e47627b12210c2c47e7290areed@google.com    RectDashBench(void* param, const SkScalar intervals[], int count, int width, bool doClip = false)
106ef85e3c52c551a66e537cc8bdcbad77bdc87ef19reed@google.com    : INHERITED(param, intervals, count, width) {
107ef85e3c52c551a66e537cc8bdcbad77bdc87ef19reed@google.com        fName.append("_rect");
108ef85e3c52c551a66e537cc8bdcbad77bdc87ef19reed@google.com    }
109fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
110ef85e3c52c551a66e537cc8bdcbad77bdc87ef19reed@google.comprotected:
111ef85e3c52c551a66e537cc8bdcbad77bdc87ef19reed@google.com    virtual void handlePath(SkCanvas* canvas, const SkPath& path,
112ef85e3c52c551a66e537cc8bdcbad77bdc87ef19reed@google.com                            const SkPaint& paint, int N) SK_OVERRIDE {
113ef85e3c52c551a66e537cc8bdcbad77bdc87ef19reed@google.com        SkPoint pts[2];
114ef85e3c52c551a66e537cc8bdcbad77bdc87ef19reed@google.com        if (!path.isLine(pts) || pts[0].fY != pts[1].fY) {
115ef85e3c52c551a66e537cc8bdcbad77bdc87ef19reed@google.com            this->INHERITED::handlePath(canvas, path, paint, N);
116ef85e3c52c551a66e537cc8bdcbad77bdc87ef19reed@google.com        } else {
117ef85e3c52c551a66e537cc8bdcbad77bdc87ef19reed@google.com            SkRect rect;
118ef85e3c52c551a66e537cc8bdcbad77bdc87ef19reed@google.com            rect.fLeft = pts[0].fX;
119ef85e3c52c551a66e537cc8bdcbad77bdc87ef19reed@google.com            rect.fTop = pts[0].fY - paint.getStrokeWidth() / 2;
120ef85e3c52c551a66e537cc8bdcbad77bdc87ef19reed@google.com            rect.fRight = rect.fLeft + SkIntToScalar(fWidth);
121ef85e3c52c551a66e537cc8bdcbad77bdc87ef19reed@google.com            rect.fBottom = rect.fTop + paint.getStrokeWidth();
122fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
123ef85e3c52c551a66e537cc8bdcbad77bdc87ef19reed@google.com            SkPaint p(paint);
124ef85e3c52c551a66e537cc8bdcbad77bdc87ef19reed@google.com            p.setStyle(SkPaint::kFill_Style);
125ef85e3c52c551a66e537cc8bdcbad77bdc87ef19reed@google.com            p.setPathEffect(NULL);
126fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
127ef85e3c52c551a66e537cc8bdcbad77bdc87ef19reed@google.com            int count = SkScalarRoundToInt((pts[1].fX - pts[0].fX) / (2*fWidth));
128ef85e3c52c551a66e537cc8bdcbad77bdc87ef19reed@google.com            SkScalar dx = SkIntToScalar(2 * fWidth);
129fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
130ef85e3c52c551a66e537cc8bdcbad77bdc87ef19reed@google.com            for (int i = 0; i < N*10; ++i) {
131ef85e3c52c551a66e537cc8bdcbad77bdc87ef19reed@google.com                SkRect r = rect;
132ef85e3c52c551a66e537cc8bdcbad77bdc87ef19reed@google.com                for (int j = 0; j < count; ++j) {
133ef85e3c52c551a66e537cc8bdcbad77bdc87ef19reed@google.com                    canvas->drawRect(r, p);
134ef85e3c52c551a66e537cc8bdcbad77bdc87ef19reed@google.com                    r.offset(dx, 0);
135ef85e3c52c551a66e537cc8bdcbad77bdc87ef19reed@google.com                }
136ef85e3c52c551a66e537cc8bdcbad77bdc87ef19reed@google.com            }
137ef85e3c52c551a66e537cc8bdcbad77bdc87ef19reed@google.com        }
138ef85e3c52c551a66e537cc8bdcbad77bdc87ef19reed@google.com    }
139fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
140ef85e3c52c551a66e537cc8bdcbad77bdc87ef19reed@google.comprivate:
141ef85e3c52c551a66e537cc8bdcbad77bdc87ef19reed@google.com    typedef DashBench INHERITED;
142ef85e3c52c551a66e537cc8bdcbad77bdc87ef19reed@google.com};
143ef85e3c52c551a66e537cc8bdcbad77bdc87ef19reed@google.com
144ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.comstatic void make_unit_star(SkPath* path, int n) {
145ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com    SkScalar rad = -SK_ScalarPI / 2;
146ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com    const SkScalar drad = (n >> 1) * SK_ScalarPI * 2 / n;
147fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
148ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com    path->moveTo(0, -SK_Scalar1);
149ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com    for (int i = 1; i < n; i++) {
150ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com        rad += drad;
151ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com        SkScalar cosV, sinV = SkScalarSinCos(rad, &cosV);
152ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com        path->lineTo(cosV, sinV);
153ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com    }
154ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com    path->close();
155ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com}
156ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com
157ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.comstatic void make_poly(SkPath* path) {
158ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com    make_unit_star(path, 9);
159ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com    SkMatrix matrix;
160ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com    matrix.setScale(SkIntToScalar(100), SkIntToScalar(100));
161ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com    path->transform(matrix);
162ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com}
163ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com
164ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.comstatic void make_quad(SkPath* path) {
165ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com    SkScalar x0 = SkIntToScalar(10);
166ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com    SkScalar y0 = SkIntToScalar(10);
167ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com    path->moveTo(x0, y0);
168ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com    path->quadTo(x0,                    y0 + 400 * SK_Scalar1,
169ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com                 x0 + 600 * SK_Scalar1, y0 + 400 * SK_Scalar1);
170ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com}
171ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com
172ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.comstatic void make_cubic(SkPath* path) {
173ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com    SkScalar x0 = SkIntToScalar(10);
174ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com    SkScalar y0 = SkIntToScalar(10);
175ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com    path->moveTo(x0, y0);
176ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com    path->cubicTo(x0,                    y0 + 400 * SK_Scalar1,
177ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com                  x0 + 600 * SK_Scalar1, y0 + 400 * SK_Scalar1,
178ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com                  x0 + 600 * SK_Scalar1, y0);
179ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com}
180ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com
181ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.comclass MakeDashBench : public SkBenchmark {
182ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com    SkString fName;
183ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com    SkPath   fPath;
184ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com    SkAutoTUnref<SkPathEffect> fPE;
18573bb3bee937ce55b5bcdb9e480e14fb4df809e5dskia.committer@gmail.com
186ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com    enum {
187ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com        N = SkBENCHLOOP(400)
188ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com    };
18973bb3bee937ce55b5bcdb9e480e14fb4df809e5dskia.committer@gmail.com
190ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.compublic:
191ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com    MakeDashBench(void* param, void (*proc)(SkPath*), const char name[]) : INHERITED(param) {
192ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com        fName.printf("makedash_%s", name);
193ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com        proc(&fPath);
19473bb3bee937ce55b5bcdb9e480e14fb4df809e5dskia.committer@gmail.com
195ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com        SkScalar vals[] = { SkIntToScalar(4), SkIntToScalar(4) };
196ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com        fPE.reset(new SkDashPathEffect(vals, 2, 0));
197ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com    }
19873bb3bee937ce55b5bcdb9e480e14fb4df809e5dskia.committer@gmail.com
199ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.comprotected:
200ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com    virtual const char* onGetName() SK_OVERRIDE {
201ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com        return fName.c_str();
202ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com    }
20373bb3bee937ce55b5bcdb9e480e14fb4df809e5dskia.committer@gmail.com
204ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com    virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
205ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com        SkPath dst;
206ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com        for (int i = 0; i < N; ++i) {
207fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com            SkStrokeRec rec(SkStrokeRec::kHairline_InitStyle);
20873bb3bee937ce55b5bcdb9e480e14fb4df809e5dskia.committer@gmail.com
209fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com            fPE->filterPath(&dst, fPath, &rec);
210ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com            dst.rewind();
211ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com        }
212ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com    }
21373bb3bee937ce55b5bcdb9e480e14fb4df809e5dskia.committer@gmail.com
21431e9d64cb1a1fe07cdb2e4a5cd64c817a9373a86reed@google.comprivate:
21531e9d64cb1a1fe07cdb2e4a5cd64c817a9373a86reed@google.com    typedef SkBenchmark INHERITED;
21631e9d64cb1a1fe07cdb2e4a5cd64c817a9373a86reed@google.com};
217fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
2185125d84433599b6103127cd1aaaa0e4e2f5c4e66reed@google.com/*
2195125d84433599b6103127cd1aaaa0e4e2f5c4e66reed@google.com *  We try to special case square dashes (intervals are equal to strokewidth).
2205125d84433599b6103127cd1aaaa0e4e2f5c4e66reed@google.com */
22131e9d64cb1a1fe07cdb2e4a5cd64c817a9373a86reed@google.comclass DashLineBench : public SkBenchmark {
22231e9d64cb1a1fe07cdb2e4a5cd64c817a9373a86reed@google.com    SkString fName;
2235125d84433599b6103127cd1aaaa0e4e2f5c4e66reed@google.com    SkScalar fStrokeWidth;
2245125d84433599b6103127cd1aaaa0e4e2f5c4e66reed@google.com    bool     fIsRound;
22531e9d64cb1a1fe07cdb2e4a5cd64c817a9373a86reed@google.com    SkAutoTUnref<SkPathEffect> fPE;
22673bb3bee937ce55b5bcdb9e480e14fb4df809e5dskia.committer@gmail.com
22731e9d64cb1a1fe07cdb2e4a5cd64c817a9373a86reed@google.com    enum {
22831e9d64cb1a1fe07cdb2e4a5cd64c817a9373a86reed@google.com        N = SkBENCHLOOP(200)
22931e9d64cb1a1fe07cdb2e4a5cd64c817a9373a86reed@google.com    };
23073bb3bee937ce55b5bcdb9e480e14fb4df809e5dskia.committer@gmail.com
23131e9d64cb1a1fe07cdb2e4a5cd64c817a9373a86reed@google.compublic:
2325125d84433599b6103127cd1aaaa0e4e2f5c4e66reed@google.com    DashLineBench(void* param, SkScalar width, bool isRound) : INHERITED(param) {
2335125d84433599b6103127cd1aaaa0e4e2f5c4e66reed@google.com        fName.printf("dashline_%g_%s", SkScalarToFloat(width), isRound ? "circle" : "square");
2345125d84433599b6103127cd1aaaa0e4e2f5c4e66reed@google.com        fStrokeWidth = width;
2355125d84433599b6103127cd1aaaa0e4e2f5c4e66reed@google.com        fIsRound = isRound;
23673bb3bee937ce55b5bcdb9e480e14fb4df809e5dskia.committer@gmail.com
2375125d84433599b6103127cd1aaaa0e4e2f5c4e66reed@google.com        SkScalar vals[] = { SK_Scalar1, SK_Scalar1 };
23831e9d64cb1a1fe07cdb2e4a5cd64c817a9373a86reed@google.com        fPE.reset(new SkDashPathEffect(vals, 2, 0));
23931e9d64cb1a1fe07cdb2e4a5cd64c817a9373a86reed@google.com    }
24073bb3bee937ce55b5bcdb9e480e14fb4df809e5dskia.committer@gmail.com
24131e9d64cb1a1fe07cdb2e4a5cd64c817a9373a86reed@google.comprotected:
24231e9d64cb1a1fe07cdb2e4a5cd64c817a9373a86reed@google.com    virtual const char* onGetName() SK_OVERRIDE {
24331e9d64cb1a1fe07cdb2e4a5cd64c817a9373a86reed@google.com        return fName.c_str();
24431e9d64cb1a1fe07cdb2e4a5cd64c817a9373a86reed@google.com    }
24573bb3bee937ce55b5bcdb9e480e14fb4df809e5dskia.committer@gmail.com
24631e9d64cb1a1fe07cdb2e4a5cd64c817a9373a86reed@google.com    virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
24731e9d64cb1a1fe07cdb2e4a5cd64c817a9373a86reed@google.com        SkPaint paint;
24831e9d64cb1a1fe07cdb2e4a5cd64c817a9373a86reed@google.com        this->setupPaint(&paint);
2495125d84433599b6103127cd1aaaa0e4e2f5c4e66reed@google.com        paint.setStrokeWidth(fStrokeWidth);
2505125d84433599b6103127cd1aaaa0e4e2f5c4e66reed@google.com        paint.setStrokeCap(fIsRound ? SkPaint::kRound_Cap : SkPaint::kSquare_Cap);
25131e9d64cb1a1fe07cdb2e4a5cd64c817a9373a86reed@google.com        paint.setPathEffect(fPE);
25231e9d64cb1a1fe07cdb2e4a5cd64c817a9373a86reed@google.com        for (int i = 0; i < N; ++i) {
2535125d84433599b6103127cd1aaaa0e4e2f5c4e66reed@google.com            canvas->drawLine(10 * SK_Scalar1, 10 * SK_Scalar1,
2545125d84433599b6103127cd1aaaa0e4e2f5c4e66reed@google.com                             640 * SK_Scalar1, 10 * SK_Scalar1, paint);
25531e9d64cb1a1fe07cdb2e4a5cd64c817a9373a86reed@google.com        }
25631e9d64cb1a1fe07cdb2e4a5cd64c817a9373a86reed@google.com    }
25773bb3bee937ce55b5bcdb9e480e14fb4df809e5dskia.committer@gmail.com
258ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.comprivate:
259ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com    typedef SkBenchmark INHERITED;
260ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com};
261ea6f6832dd1c1af5db1a2ff43df627347b3fb8abreed@google.com
262935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.comclass DrawPointsDashingBench : public SkBenchmark {
263935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.com    SkString fName;
264935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.com    int      fStrokeWidth;
265ca47aae7ecfdafb5e88baee13737908b79a4c716robertphillips@google.com    bool     fDoAA;
266935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.com
267935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.com    SkAutoTUnref<SkPathEffect> fPathEffect;
268935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.com
269935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.com    enum {
270935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.com        N = SkBENCHLOOP(480)
271935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.com    };
272935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.com
273935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.compublic:
2740264fb4543b0d8cebe00f1ee32433784f4ceb074skia.committer@gmail.com    DrawPointsDashingBench(void* param, int dashLength, int strokeWidth, bool doAA)
275935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.com        : INHERITED(param) {
276935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.com        fName.printf("drawpointsdash_%d_%d%s", dashLength, strokeWidth, doAA ? "_aa" : "_bw");
277935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.com        fStrokeWidth = strokeWidth;
278ca47aae7ecfdafb5e88baee13737908b79a4c716robertphillips@google.com        fDoAA = doAA;
279935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.com
280935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.com        SkScalar vals[] = { SkIntToScalar(dashLength), SkIntToScalar(dashLength) };
281935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.com        fPathEffect.reset(new SkDashPathEffect(vals, 2, SK_Scalar1, false));
282935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.com    }
283935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.com
284935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.comprotected:
285935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.com    virtual const char* onGetName() SK_OVERRIDE {
286935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.com        return fName.c_str();
287935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.com    }
288935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.com
289935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.com    virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
290935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.com
291935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.com        SkPaint p;
292935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.com        this->setupPaint(&p);
293935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.com        p.setColor(SK_ColorBLACK);
294935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.com        p.setStyle(SkPaint::kStroke_Style);
295935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.com        p.setStrokeWidth(SkIntToScalar(fStrokeWidth));
296935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.com        p.setPathEffect(fPathEffect);
297ca47aae7ecfdafb5e88baee13737908b79a4c716robertphillips@google.com        p.setAntiAlias(fDoAA);
298935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.com
299935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.com        SkPoint pts[2] = {
300935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.com            { SkIntToScalar(10), 0 },
301935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.com            { SkIntToScalar(640), 0 }
302935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.com        };
303935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.com
304935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.com        for (int i = 0; i < N; ++i) {
305935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.com
306935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.com            pts[0].fY = pts[1].fY = SkIntToScalar(i % 480);
307935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.com            canvas->drawPoints(SkCanvas::kLines_PointMode, 2, pts, p);
308935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.com        }
309935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.com    }
310935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.com
311935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.comprivate:
312935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.com    typedef SkBenchmark INHERITED;
313935ad026826fb7d31d562ff7326b84ec3a827456robertphillips@google.com};
314996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com
315e5ceea9232ecdb76d3b2457146e7dcfd28c3d0fbreed@google.com// Want to test how we handle dashing when 99% of the dash is clipped out
316996f64f8e752fb1207d446320c0fcce8505c5611reed@google.comclass GiantDashBench : public SkBenchmark {
317996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com    SkString fName;
318e5ceea9232ecdb76d3b2457146e7dcfd28c3d0fbreed@google.com    SkScalar fStrokeWidth;
319996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com    SkPoint  fPts[2];
320996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com    SkAutoTUnref<SkPathEffect> fPathEffect;
321996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com
322996f64f8e752fb1207d446320c0fcce8505c5611reed@google.compublic:
323996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com    enum LineType {
324996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com        kHori_LineType,
325996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com        kVert_LineType,
326996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com        kDiag_LineType
327996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com    };
328996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com
329996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com    static const char* LineTypeName(LineType lt) {
330996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com        static const char* gNames[] = { "hori", "vert", "diag" };
331996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com        SkASSERT((size_t)lt <= SK_ARRAY_COUNT(gNames));
332996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com        return gNames[lt];
333996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com    }
334996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com
335e5ceea9232ecdb76d3b2457146e7dcfd28c3d0fbreed@google.com    GiantDashBench(void* param, LineType lt, SkScalar width) : INHERITED(param) {
336e5ceea9232ecdb76d3b2457146e7dcfd28c3d0fbreed@google.com        fName.printf("giantdashline_%s_%g", LineTypeName(lt), width);
337e5ceea9232ecdb76d3b2457146e7dcfd28c3d0fbreed@google.com        fStrokeWidth = width;
338e5ceea9232ecdb76d3b2457146e7dcfd28c3d0fbreed@google.com
339996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com        // deliberately pick intervals that won't be caught by asPoints(), so
340996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com        // we can test the filterPath code-path.
341996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com        const SkScalar intervals[] = { 2, 1 };
342996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com        fPathEffect.reset(new SkDashPathEffect(intervals,
343996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com                                               SK_ARRAY_COUNT(intervals), 0));
344996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com
345996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com        SkScalar cx = 640 / 2;  // center X
346996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com        SkScalar cy = 480 / 2;  // center Y
347996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com        SkMatrix matrix;
348996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com
349996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com        switch (lt) {
350996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com            case kHori_LineType:
351996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com                matrix.setIdentity();
352996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com                break;
353996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com            case kVert_LineType:
354996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com                matrix.setRotate(90, cx, cy);
355996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com                break;
356996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com            case kDiag_LineType:
357996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com                matrix.setRotate(45, cx, cy);
358996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com                break;
359996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com        }
360996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com
361e5ceea9232ecdb76d3b2457146e7dcfd28c3d0fbreed@google.com        const SkScalar overshoot = 100*1000;
362996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com        const SkPoint pts[2] = {
363996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com            { -overshoot, cy }, { 640 + overshoot, cy }
364996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com        };
365996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com        matrix.mapPoints(fPts, pts, 2);
366996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com    }
367996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com
368996f64f8e752fb1207d446320c0fcce8505c5611reed@google.comprotected:
369996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com    virtual const char* onGetName() SK_OVERRIDE {
370996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com        return fName.c_str();
371996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com    }
372996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com
373996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com    virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
374996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com        SkPaint p;
375996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com        this->setupPaint(&p);
376996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com        p.setStyle(SkPaint::kStroke_Style);
377e5ceea9232ecdb76d3b2457146e7dcfd28c3d0fbreed@google.com        p.setStrokeWidth(fStrokeWidth);
378996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com        p.setPathEffect(fPathEffect);
379996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com
380e5ceea9232ecdb76d3b2457146e7dcfd28c3d0fbreed@google.com        canvas->drawPoints(SkCanvas::kLines_PointMode, 2, fPts, p);
381996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com    }
382996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com
383996f64f8e752fb1207d446320c0fcce8505c5611reed@google.comprivate:
384996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com    typedef SkBenchmark INHERITED;
385996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com};
386996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com
387996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com
3884aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com///////////////////////////////////////////////////////////////////////////////
3894aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com
3904aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.comstatic const SkScalar gDots[] = { SK_Scalar1, SK_Scalar1 };
3914aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com
3924aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com#define PARAM(array)    array, SK_ARRAY_COUNT(array)
3934aa1a70ab74e841def84367d771ac2b2202f41d2reed@google.com
394a8f23c7e1ede7bba73edbd494ab0d485809e4c5areed@google.comDEF_BENCH( return new DashBench(p, PARAM(gDots), 0); )
395a8f23c7e1ede7bba73edbd494ab0d485809e4c5areed@google.comDEF_BENCH( return new DashBench(p, PARAM(gDots), 1); )
396a8f23c7e1ede7bba73edbd494ab0d485809e4c5areed@google.comDEF_BENCH( return new DashBench(p, PARAM(gDots), 1, true); )
397a8f23c7e1ede7bba73edbd494ab0d485809e4c5areed@google.comDEF_BENCH( return new DashBench(p, PARAM(gDots), 4); )
398a8f23c7e1ede7bba73edbd494ab0d485809e4c5areed@google.comDEF_BENCH( return new MakeDashBench(p, make_poly, "poly"); )
399a8f23c7e1ede7bba73edbd494ab0d485809e4c5areed@google.comDEF_BENCH( return new MakeDashBench(p, make_quad, "quad"); )
400a8f23c7e1ede7bba73edbd494ab0d485809e4c5areed@google.comDEF_BENCH( return new MakeDashBench(p, make_cubic, "cubic"); )
401a8f23c7e1ede7bba73edbd494ab0d485809e4c5areed@google.comDEF_BENCH( return new DashLineBench(p, 0, false); )
402a8f23c7e1ede7bba73edbd494ab0d485809e4c5areed@google.comDEF_BENCH( return new DashLineBench(p, SK_Scalar1, false); )
403a8f23c7e1ede7bba73edbd494ab0d485809e4c5areed@google.comDEF_BENCH( return new DashLineBench(p, 2 * SK_Scalar1, false); )
404a8f23c7e1ede7bba73edbd494ab0d485809e4c5areed@google.comDEF_BENCH( return new DashLineBench(p, 0, true); )
405a8f23c7e1ede7bba73edbd494ab0d485809e4c5areed@google.comDEF_BENCH( return new DashLineBench(p, SK_Scalar1, true); )
406a8f23c7e1ede7bba73edbd494ab0d485809e4c5areed@google.comDEF_BENCH( return new DashLineBench(p, 2 * SK_Scalar1, true); )
407a8f23c7e1ede7bba73edbd494ab0d485809e4c5areed@google.com
408a8f23c7e1ede7bba73edbd494ab0d485809e4c5areed@google.comDEF_BENCH( return new DrawPointsDashingBench(p, 1, 1, false); )
409a8f23c7e1ede7bba73edbd494ab0d485809e4c5areed@google.comDEF_BENCH( return new DrawPointsDashingBench(p, 1, 1, true); )
410a8f23c7e1ede7bba73edbd494ab0d485809e4c5areed@google.comDEF_BENCH( return new DrawPointsDashingBench(p, 3, 1, false); )
411a8f23c7e1ede7bba73edbd494ab0d485809e4c5areed@google.comDEF_BENCH( return new DrawPointsDashingBench(p, 3, 1, true); )
412a8f23c7e1ede7bba73edbd494ab0d485809e4c5areed@google.comDEF_BENCH( return new DrawPointsDashingBench(p, 5, 5, false); )
413a8f23c7e1ede7bba73edbd494ab0d485809e4c5areed@google.comDEF_BENCH( return new DrawPointsDashingBench(p, 5, 5, true); )
414996f64f8e752fb1207d446320c0fcce8505c5611reed@google.com
415e5ceea9232ecdb76d3b2457146e7dcfd28c3d0fbreed@google.comDEF_BENCH( return new GiantDashBench(p, GiantDashBench::kHori_LineType, 0); )
416e5ceea9232ecdb76d3b2457146e7dcfd28c3d0fbreed@google.comDEF_BENCH( return new GiantDashBench(p, GiantDashBench::kVert_LineType, 0); )
417e5ceea9232ecdb76d3b2457146e7dcfd28c3d0fbreed@google.comDEF_BENCH( return new GiantDashBench(p, GiantDashBench::kDiag_LineType, 0); )
418e5ceea9232ecdb76d3b2457146e7dcfd28c3d0fbreed@google.com
419e5ceea9232ecdb76d3b2457146e7dcfd28c3d0fbreed@google.com// pass 2 to explicitly avoid any 1-is-the-same-as-hairline special casing
420e5ceea9232ecdb76d3b2457146e7dcfd28c3d0fbreed@google.com
421e5ceea9232ecdb76d3b2457146e7dcfd28c3d0fbreed@google.com// hori_2 is just too slow to enable at the moment
422e5ceea9232ecdb76d3b2457146e7dcfd28c3d0fbreed@google.com//DEF_BENCH( return new GiantDashBench(p, GiantDashBench::kHori_LineType, 2); )
423e5ceea9232ecdb76d3b2457146e7dcfd28c3d0fbreed@google.comDEF_BENCH( return new GiantDashBench(p, GiantDashBench::kVert_LineType, 2); )
424e5ceea9232ecdb76d3b2457146e7dcfd28c3d0fbreed@google.comDEF_BENCH( return new GiantDashBench(p, GiantDashBench::kDiag_LineType, 2); )
425