180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/*
380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright 2011 Google Inc.
480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *
580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Use of this source code is governed by a BSD-style license that can be
680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * found in the LICENSE file.
780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */
880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkBenchmark.h"
980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkBitmap.h"
1080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkCanvas.h"
1180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkDashPathEffect.h"
1280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkPaint.h"
1380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkPath.h"
1480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkRandom.h"
1580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkString.h"
1680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkTDArray.h"
1780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/*
2080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *  Cases to consider:
2180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *
2280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *  1. antialiasing on/off (esp. width <= 1)
2380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *  2. strokewidth == 0, 1, 2
2480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *  3. hline, vline, diagonal, rect, oval
2580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *  4. dots [1,1] ([N,N] where N=strokeWidth?) or arbitrary (e.g. [2,1] or [1,2,3,2])
2680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */
2780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic void path_hline(SkPath* path) {
2880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    path->moveTo(SkIntToScalar(10), SkIntToScalar(10));
2980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    path->lineTo(SkIntToScalar(600), SkIntToScalar(10));
3080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
3180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
3280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass DashBench : public SkBenchmark {
3380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprotected:
3480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkString            fName;
3580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkTDArray<SkScalar> fIntervals;
3680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    int                 fWidth;
3780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkPoint             fPts[2];
3880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    bool                fDoClip;
3980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
4080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic:
410a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    DashBench(const SkScalar intervals[], int count, int width,
420a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger              bool doClip = false)  {
4380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        fIntervals.append(count, intervals);
4480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        for (int i = 0; i < count; ++i) {
4580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            fIntervals[i] *= width;
4680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
4780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        fWidth = width;
4880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        fName.printf("dash_%d_%s", width, doClip ? "clipped" : "noclip");
4980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        fDoClip = doClip;
5080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
5180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        fPts[0].set(SkIntToScalar(10), SkIntToScalar(10));
5280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        fPts[1].set(SkIntToScalar(600), SkIntToScalar(10));
5380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
5480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
5580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual void makePath(SkPath* path) {
5680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        path_hline(path);
5780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
5880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
5980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprotected:
6080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual const char* onGetName() SK_OVERRIDE {
6180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        return fName.c_str();
6280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
6380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
64910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger    virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE {
6580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkPaint paint;
6680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        this->setupPaint(&paint);
6780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        paint.setStyle(SkPaint::kStroke_Style);
6880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        paint.setStrokeWidth(SkIntToScalar(fWidth));
6980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        paint.setAntiAlias(false);
7080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
7180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkPath path;
7280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        this->makePath(&path);
7380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
7480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        paint.setPathEffect(new SkDashPathEffect(fIntervals.begin(),
7580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                                                 fIntervals.count(), 0))->unref();
7680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
7780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        if (fDoClip) {
7880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            SkRect r = path.getBounds();
7980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            r.inset(-SkIntToScalar(20), -SkIntToScalar(20));
8080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            // now move it so we don't intersect
8180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            r.offset(0, r.height() * 3 / 2);
8280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            canvas->clipRect(r);
8380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
8480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
85910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger        this->handlePath(canvas, path, paint, loops);
8680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
8780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
8880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual void handlePath(SkCanvas* canvas, const SkPath& path,
8980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                            const SkPaint& paint, int N) {
9080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        for (int i = 0; i < N; ++i) {
9180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru//            canvas->drawPoints(SkCanvas::kLines_PointMode, 2, fPts, paint);
9280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            canvas->drawPath(path, paint);
9380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
9480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
9580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
9680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprivate:
9780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    typedef SkBenchmark INHERITED;
9880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru};
9980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
10080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass RectDashBench : public DashBench {
10180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic:
1020a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    RectDashBench(const SkScalar intervals[], int count, int width)
1030a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    : INHERITED(intervals, count, width) {
10480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        fName.append("_rect");
10580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
10680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
10780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprotected:
10880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual void handlePath(SkCanvas* canvas, const SkPath& path,
10980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                            const SkPaint& paint, int N) SK_OVERRIDE {
11080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkPoint pts[2];
11180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        if (!path.isLine(pts) || pts[0].fY != pts[1].fY) {
11280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            this->INHERITED::handlePath(canvas, path, paint, N);
11380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        } else {
11480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            SkRect rect;
11580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            rect.fLeft = pts[0].fX;
11680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            rect.fTop = pts[0].fY - paint.getStrokeWidth() / 2;
11780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            rect.fRight = rect.fLeft + SkIntToScalar(fWidth);
11880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            rect.fBottom = rect.fTop + paint.getStrokeWidth();
11980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
12080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            SkPaint p(paint);
12180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            p.setStyle(SkPaint::kFill_Style);
12280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            p.setPathEffect(NULL);
12380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
12480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            int count = SkScalarRoundToInt((pts[1].fX - pts[0].fX) / (2*fWidth));
12580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            SkScalar dx = SkIntToScalar(2 * fWidth);
12680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
12780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            for (int i = 0; i < N*10; ++i) {
12880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                SkRect r = rect;
12980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                for (int j = 0; j < count; ++j) {
13080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                    canvas->drawRect(r, p);
13180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                    r.offset(dx, 0);
13280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                }
13380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            }
13480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
13580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
13680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
13780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprivate:
13880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    typedef DashBench INHERITED;
13980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru};
14080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
14180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic void make_unit_star(SkPath* path, int n) {
14280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkScalar rad = -SK_ScalarPI / 2;
14380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    const SkScalar drad = (n >> 1) * SK_ScalarPI * 2 / n;
14480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
14580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    path->moveTo(0, -SK_Scalar1);
14680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    for (int i = 1; i < n; i++) {
14780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        rad += drad;
14880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkScalar cosV, sinV = SkScalarSinCos(rad, &cosV);
14980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        path->lineTo(cosV, sinV);
15080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
15180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    path->close();
15280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
15380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
15480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic void make_poly(SkPath* path) {
15580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    make_unit_star(path, 9);
15680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkMatrix matrix;
15780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    matrix.setScale(SkIntToScalar(100), SkIntToScalar(100));
15880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    path->transform(matrix);
15980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
16080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
16180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic void make_quad(SkPath* path) {
16280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkScalar x0 = SkIntToScalar(10);
16380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkScalar y0 = SkIntToScalar(10);
16480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    path->moveTo(x0, y0);
16580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    path->quadTo(x0,                    y0 + 400 * SK_Scalar1,
16680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                 x0 + 600 * SK_Scalar1, y0 + 400 * SK_Scalar1);
16780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
16880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
16980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic void make_cubic(SkPath* path) {
17080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkScalar x0 = SkIntToScalar(10);
17180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkScalar y0 = SkIntToScalar(10);
17280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    path->moveTo(x0, y0);
17380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    path->cubicTo(x0,                    y0 + 400 * SK_Scalar1,
17480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                  x0 + 600 * SK_Scalar1, y0 + 400 * SK_Scalar1,
17580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                  x0 + 600 * SK_Scalar1, y0);
17680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
17780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
17880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass MakeDashBench : public SkBenchmark {
17980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkString fName;
18080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkPath   fPath;
18180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkAutoTUnref<SkPathEffect> fPE;
18280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
18380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic:
1840a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    MakeDashBench(void (*proc)(SkPath*), const char name[])  {
18580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        fName.printf("makedash_%s", name);
18680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        proc(&fPath);
18780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
18880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkScalar vals[] = { SkIntToScalar(4), SkIntToScalar(4) };
18980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        fPE.reset(new SkDashPathEffect(vals, 2, 0));
19080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
19180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
19280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprotected:
19380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual const char* onGetName() SK_OVERRIDE {
19480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        return fName.c_str();
19580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
19680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
197910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger    virtual void onDraw(const int loops, SkCanvas*) SK_OVERRIDE {
19880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkPath dst;
199910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger        for (int i = 0; i < loops; ++i) {
20080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            SkStrokeRec rec(SkStrokeRec::kHairline_InitStyle);
20180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
202d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger            fPE->filterPath(&dst, fPath, &rec, NULL);
20380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            dst.rewind();
20480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
20580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
20680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
20780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprivate:
20880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    typedef SkBenchmark INHERITED;
20980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru};
21080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
21180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/*
21280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *  We try to special case square dashes (intervals are equal to strokewidth).
21380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */
21480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass DashLineBench : public SkBenchmark {
21580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkString fName;
21680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkScalar fStrokeWidth;
21780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    bool     fIsRound;
21880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkAutoTUnref<SkPathEffect> fPE;
21980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
22080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic:
2210a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    DashLineBench(SkScalar width, bool isRound)  {
22280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        fName.printf("dashline_%g_%s", SkScalarToFloat(width), isRound ? "circle" : "square");
22380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        fStrokeWidth = width;
22480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        fIsRound = isRound;
22580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
22680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkScalar vals[] = { SK_Scalar1, SK_Scalar1 };
22780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        fPE.reset(new SkDashPathEffect(vals, 2, 0));
22880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
22980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
23080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprotected:
23180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual const char* onGetName() SK_OVERRIDE {
23280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        return fName.c_str();
23380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
23480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
235910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger    virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE {
23680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkPaint paint;
23780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        this->setupPaint(&paint);
23880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        paint.setStrokeWidth(fStrokeWidth);
23980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        paint.setStrokeCap(fIsRound ? SkPaint::kRound_Cap : SkPaint::kSquare_Cap);
24080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        paint.setPathEffect(fPE);
241910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger        for (int i = 0; i < loops; ++i) {
24280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            canvas->drawLine(10 * SK_Scalar1, 10 * SK_Scalar1,
24380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                             640 * SK_Scalar1, 10 * SK_Scalar1, paint);
24480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
24580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
24680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
24780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprivate:
24880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    typedef SkBenchmark INHERITED;
24980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru};
25080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
251363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerclass DrawPointsDashingBench : public SkBenchmark {
252363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    SkString fName;
253363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    int      fStrokeWidth;
254363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    bool     fDoAA;
255363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
256363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    SkAutoTUnref<SkPathEffect> fPathEffect;
257363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
258363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerpublic:
2590a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    DrawPointsDashingBench(int dashLength, int strokeWidth, bool doAA)
2600a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger         {
261363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        fName.printf("drawpointsdash_%d_%d%s", dashLength, strokeWidth, doAA ? "_aa" : "_bw");
262363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        fStrokeWidth = strokeWidth;
263363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        fDoAA = doAA;
264363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
265363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        SkScalar vals[] = { SkIntToScalar(dashLength), SkIntToScalar(dashLength) };
266363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        fPathEffect.reset(new SkDashPathEffect(vals, 2, SK_Scalar1, false));
267363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    }
268363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
269363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerprotected:
270363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    virtual const char* onGetName() SK_OVERRIDE {
271363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        return fName.c_str();
272363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    }
273363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
274910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger    virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE {
275363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        SkPaint p;
276363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        this->setupPaint(&p);
277363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        p.setColor(SK_ColorBLACK);
278363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        p.setStyle(SkPaint::kStroke_Style);
279363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        p.setStrokeWidth(SkIntToScalar(fStrokeWidth));
280363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        p.setPathEffect(fPathEffect);
281363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        p.setAntiAlias(fDoAA);
282363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
283363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        SkPoint pts[2] = {
284363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger            { SkIntToScalar(10), 0 },
285363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger            { SkIntToScalar(640), 0 }
286363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        };
287363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
288910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger        for (int i = 0; i < loops; ++i) {
289363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger            pts[0].fY = pts[1].fY = SkIntToScalar(i % 480);
290363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger            canvas->drawPoints(SkCanvas::kLines_PointMode, 2, pts, p);
291363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        }
292363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    }
293363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
294363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerprivate:
295363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    typedef SkBenchmark INHERITED;
296363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger};
297d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger
298d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger// Want to test how we handle dashing when 99% of the dash is clipped out
299d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenbergerclass GiantDashBench : public SkBenchmark {
300d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger    SkString fName;
301d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger    SkScalar fStrokeWidth;
302d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger    SkPoint  fPts[2];
303d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger    SkAutoTUnref<SkPathEffect> fPathEffect;
304d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger
305d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenbergerpublic:
306d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger    enum LineType {
307d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger        kHori_LineType,
308d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger        kVert_LineType,
3097839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        kDiag_LineType,
3107839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        kLineTypeCount
311d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger    };
312d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger
313d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger    static const char* LineTypeName(LineType lt) {
314d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger        static const char* gNames[] = { "hori", "vert", "diag" };
3157839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        SK_COMPILE_ASSERT(kLineTypeCount == SK_ARRAY_COUNT(gNames), names_wrong_size);
316d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger        return gNames[lt];
317d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger    }
318d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger
3190a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    GiantDashBench(LineType lt, SkScalar width)  {
320d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger        fName.printf("giantdashline_%s_%g", LineTypeName(lt), width);
321d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger        fStrokeWidth = width;
322d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger
323d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger        // deliberately pick intervals that won't be caught by asPoints(), so
324d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger        // we can test the filterPath code-path.
325d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger        const SkScalar intervals[] = { 2, 1, 1, 1 };
326d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger        fPathEffect.reset(new SkDashPathEffect(intervals,
327d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger                                               SK_ARRAY_COUNT(intervals), 0));
328d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger
329d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger        SkScalar cx = 640 / 2;  // center X
330d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger        SkScalar cy = 480 / 2;  // center Y
331d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger        SkMatrix matrix;
332d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger
333d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger        switch (lt) {
334d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger            case kHori_LineType:
335d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger                matrix.setIdentity();
336d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger                break;
337d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger            case kVert_LineType:
338d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger                matrix.setRotate(90, cx, cy);
339d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger                break;
340d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger            case kDiag_LineType:
341d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger                matrix.setRotate(45, cx, cy);
342d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger                break;
3437839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            case kLineTypeCount:
3447839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                // Not a real enum value.
3457839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                break;
346d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger        }
347d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger
348d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger        const SkScalar overshoot = 100*1000;
349d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger        const SkPoint pts[2] = {
350d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger            { -overshoot, cy }, { 640 + overshoot, cy }
351d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger        };
352d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger        matrix.mapPoints(fPts, pts, 2);
353d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger    }
354d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger
355d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenbergerprotected:
356d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger    virtual const char* onGetName() SK_OVERRIDE {
357d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger        return fName.c_str();
358d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger    }
359d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger
360910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger    virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE {
361d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger        SkPaint p;
362d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger        this->setupPaint(&p);
363d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger        p.setStyle(SkPaint::kStroke_Style);
364d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger        p.setStrokeWidth(fStrokeWidth);
365d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger        p.setPathEffect(fPathEffect);
366d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger
367910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger        for (int i = 0; i < loops; i++) {
3680a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger            canvas->drawPoints(SkCanvas::kLines_PointMode, 2, fPts, p);
3690a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger        }
370d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger    }
371d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger
372d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenbergerprivate:
373d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger    typedef SkBenchmark INHERITED;
374d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger};
375d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger
376d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger
37780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru///////////////////////////////////////////////////////////////////////////////
37880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
37980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic const SkScalar gDots[] = { SK_Scalar1, SK_Scalar1 };
38080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
38180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#define PARAM(array)    array, SK_ARRAY_COUNT(array)
38280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
3830a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH( return new DashBench(PARAM(gDots), 0); )
3840a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH( return new DashBench(PARAM(gDots), 1); )
3850a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH( return new DashBench(PARAM(gDots), 1, true); )
3860a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH( return new DashBench(PARAM(gDots), 4); )
3870a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH( return new MakeDashBench(make_poly, "poly"); )
3880a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH( return new MakeDashBench(make_quad, "quad"); )
3890a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH( return new MakeDashBench(make_cubic, "cubic"); )
3900a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH( return new DashLineBench(0, false); )
3910a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH( return new DashLineBench(SK_Scalar1, false); )
3920a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH( return new DashLineBench(2 * SK_Scalar1, false); )
3930a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH( return new DashLineBench(0, true); )
3940a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH( return new DashLineBench(SK_Scalar1, true); )
3950a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH( return new DashLineBench(2 * SK_Scalar1, true); )
3960a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger
3970a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH( return new DrawPointsDashingBench(1, 1, false); )
3980a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH( return new DrawPointsDashingBench(1, 1, true); )
3990a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH( return new DrawPointsDashingBench(3, 1, false); )
4000a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH( return new DrawPointsDashingBench(3, 1, true); )
4010a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH( return new DrawPointsDashingBench(5, 5, false); )
4020a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH( return new DrawPointsDashingBench(5, 5, true); )
403d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger
40458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger/* Disable the GiantDashBench for Android devices until we can better control
40558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger * the memory usage. (https://code.google.com/p/skia/issues/detail?id=1430)
40658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger */
40758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger#ifndef SK_BUILD_FOR_ANDROID
4080a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH( return new GiantDashBench(GiantDashBench::kHori_LineType, 0); )
4090a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH( return new GiantDashBench(GiantDashBench::kVert_LineType, 0); )
4100a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH( return new GiantDashBench(GiantDashBench::kDiag_LineType, 0); )
411d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger
412d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger// pass 2 to explicitly avoid any 1-is-the-same-as-hairline special casing
413d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger
414d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger// hori_2 is just too slow to enable at the moment
4150a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH( return new GiantDashBench(GiantDashBench::kHori_LineType, 2); )
4160a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH( return new GiantDashBench(GiantDashBench::kVert_LineType, 2); )
4170a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH( return new GiantDashBench(GiantDashBench::kDiag_LineType, 2); )
41858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger#endif
419