135a81dfdb2796ca47703b17173c933ece933b953reed@google.com/*
235a81dfdb2796ca47703b17173c933ece933b953reed@google.com * Copyright 2012 Google Inc.
335a81dfdb2796ca47703b17173c933ece933b953reed@google.com *
435a81dfdb2796ca47703b17173c933ece933b953reed@google.com * Use of this source code is governed by a BSD-style license that can be
535a81dfdb2796ca47703b17173c933ece933b953reed@google.com * found in the LICENSE file.
635a81dfdb2796ca47703b17173c933ece933b953reed@google.com */
735a81dfdb2796ca47703b17173c933ece933b953reed@google.com
835a81dfdb2796ca47703b17173c933ece933b953reed@google.com#include "gm.h"
935a81dfdb2796ca47703b17173c933ece933b953reed@google.com#include "SkCanvas.h"
1035a81dfdb2796ca47703b17173c933ece933b953reed@google.com#include "SkPaint.h"
1135a81dfdb2796ca47703b17173c933ece933b953reed@google.com#include "SkDashPathEffect.h"
1235a81dfdb2796ca47703b17173c933ece933b953reed@google.com
13de1837bb96b0f72dad7482786d6e577013d4a85breed@google.comstatic void drawline(SkCanvas* canvas, int on, int off, const SkPaint& paint,
14628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org                     SkScalar finalX = SkIntToScalar(600), SkScalar finalY = SkIntToScalar(0),
15e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips                     SkScalar phase = SkIntToScalar(0),
16e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips                     SkScalar startX = SkIntToScalar(0), SkScalar startY = SkIntToScalar(0)) {
1735a81dfdb2796ca47703b17173c933ece933b953reed@google.com    SkPaint p(paint);
1835a81dfdb2796ca47703b17173c933ece933b953reed@google.com
1935a81dfdb2796ca47703b17173c933ece933b953reed@google.com    const SkScalar intervals[] = {
2035a81dfdb2796ca47703b17173c933ece933b953reed@google.com        SkIntToScalar(on),
2135a81dfdb2796ca47703b17173c933ece933b953reed@google.com        SkIntToScalar(off),
2235a81dfdb2796ca47703b17173c933ece933b953reed@google.com    };
2335a81dfdb2796ca47703b17173c933ece933b953reed@google.com
24628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org    p.setPathEffect(SkDashPathEffect::Create(intervals, 2, phase))->unref();
25e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips    canvas->drawLine(startX, startY, finalX, finalY, p);
26de1837bb96b0f72dad7482786d6e577013d4a85breed@google.com}
27de1837bb96b0f72dad7482786d6e577013d4a85breed@google.com
28de1837bb96b0f72dad7482786d6e577013d4a85breed@google.com// earlier bug stopped us from drawing very long single-segment dashes, because
29de1837bb96b0f72dad7482786d6e577013d4a85breed@google.com// SkPathMeasure was skipping very small delta-T values (nearlyzero). This is
30de1837bb96b0f72dad7482786d6e577013d4a85breed@google.com// now fixes, so this giant dash should appear.
31de1837bb96b0f72dad7482786d6e577013d4a85breed@google.comstatic void show_giant_dash(SkCanvas* canvas) {
32de1837bb96b0f72dad7482786d6e577013d4a85breed@google.com    SkPaint paint;
33de1837bb96b0f72dad7482786d6e577013d4a85breed@google.com
34de1837bb96b0f72dad7482786d6e577013d4a85breed@google.com    drawline(canvas, 1, 1, paint, SkIntToScalar(20 * 1000));
3535a81dfdb2796ca47703b17173c933ece933b953reed@google.com}
3635a81dfdb2796ca47703b17173c933ece933b953reed@google.com
37e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillipsstatic void show_zero_len_dash(SkCanvas* canvas) {
38e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips    SkPaint paint;
39e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips
40e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips    drawline(canvas, 2, 2, paint, SkIntToScalar(0));
41e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips    paint.setStyle(SkPaint::kStroke_Style);
42e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips    paint.setStrokeWidth(SkIntToScalar(2));
43e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips    canvas->translate(0, SkIntToScalar(20));
44e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips    drawline(canvas, 4, 4, paint, SkIntToScalar(0));
45e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips}
46e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips
4721384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.comclass DashingGM : public skiagm::GM {
4835a81dfdb2796ca47703b17173c933ece933b953reed@google.compublic:
4935a81dfdb2796ca47703b17173c933ece933b953reed@google.com    DashingGM() {}
5035a81dfdb2796ca47703b17173c933ece933b953reed@google.com
5135a81dfdb2796ca47703b17173c933ece933b953reed@google.comprotected:
52a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org    virtual uint32_t onGetFlags() const SK_OVERRIDE {
53a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org        return kSkipTiled_Flag;
54a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org    }
55a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org
5635a81dfdb2796ca47703b17173c933ece933b953reed@google.com    SkString onShortName() {
5735a81dfdb2796ca47703b17173c933ece933b953reed@google.com        return SkString("dashing");
5835a81dfdb2796ca47703b17173c933ece933b953reed@google.com    }
5935a81dfdb2796ca47703b17173c933ece933b953reed@google.com
60f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina    SkISize onISize() { return SkISize::Make(640, 300); }
6135a81dfdb2796ca47703b17173c933ece933b953reed@google.com
6235a81dfdb2796ca47703b17173c933ece933b953reed@google.com    virtual void onDraw(SkCanvas* canvas) {
6335a81dfdb2796ca47703b17173c933ece933b953reed@google.com        static const struct {
6435a81dfdb2796ca47703b17173c933ece933b953reed@google.com            int fOnInterval;
6535a81dfdb2796ca47703b17173c933ece933b953reed@google.com            int fOffInterval;
6635a81dfdb2796ca47703b17173c933ece933b953reed@google.com        } gData[] = {
6735a81dfdb2796ca47703b17173c933ece933b953reed@google.com            { 1, 1 },
6835a81dfdb2796ca47703b17173c933ece933b953reed@google.com            { 4, 1 },
6935a81dfdb2796ca47703b17173c933ece933b953reed@google.com        };
70ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
7135a81dfdb2796ca47703b17173c933ece933b953reed@google.com        SkPaint paint;
7235a81dfdb2796ca47703b17173c933ece933b953reed@google.com        paint.setStyle(SkPaint::kStroke_Style);
7335a81dfdb2796ca47703b17173c933ece933b953reed@google.com
7435a81dfdb2796ca47703b17173c933ece933b953reed@google.com        canvas->translate(SkIntToScalar(20), SkIntToScalar(20));
7535a81dfdb2796ca47703b17173c933ece933b953reed@google.com        canvas->translate(0, SK_ScalarHalf);
7635a81dfdb2796ca47703b17173c933ece933b953reed@google.com        for (int width = 0; width <= 2; ++width) {
7735a81dfdb2796ca47703b17173c933ece933b953reed@google.com            for (size_t data = 0; data < SK_ARRAY_COUNT(gData); ++data) {
7835a81dfdb2796ca47703b17173c933ece933b953reed@google.com                for (int aa = 0; aa <= 1; ++aa) {
7935a81dfdb2796ca47703b17173c933ece933b953reed@google.com                    int w = width * width * width;
8035a81dfdb2796ca47703b17173c933ece933b953reed@google.com                    paint.setAntiAlias(SkToBool(aa));
8135a81dfdb2796ca47703b17173c933ece933b953reed@google.com                    paint.setStrokeWidth(SkIntToScalar(w));
82ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
8335a81dfdb2796ca47703b17173c933ece933b953reed@google.com                    int scale = w ? w : 1;
8435a81dfdb2796ca47703b17173c933ece933b953reed@google.com
8535a81dfdb2796ca47703b17173c933ece933b953reed@google.com                    drawline(canvas, gData[data].fOnInterval * scale,
8635a81dfdb2796ca47703b17173c933ece933b953reed@google.com                             gData[data].fOffInterval * scale,
8735a81dfdb2796ca47703b17173c933ece933b953reed@google.com                             paint);
8835a81dfdb2796ca47703b17173c933ece933b953reed@google.com                    canvas->translate(0, SkIntToScalar(20));
8935a81dfdb2796ca47703b17173c933ece933b953reed@google.com                }
9035a81dfdb2796ca47703b17173c933ece933b953reed@google.com            }
9135a81dfdb2796ca47703b17173c933ece933b953reed@google.com        }
92ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
93de1837bb96b0f72dad7482786d6e577013d4a85breed@google.com        show_giant_dash(canvas);
94e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips        canvas->translate(0, SkIntToScalar(20));
95e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips        show_zero_len_dash(canvas);
9635a81dfdb2796ca47703b17173c933ece933b953reed@google.com    }
9721384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com};
9821384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com
9921384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com///////////////////////////////////////////////////////////////////////////////
10021384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com
10121384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.comstatic void make_unit_star(SkPath* path, int n) {
10221384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com    SkScalar rad = -SK_ScalarPI / 2;
10321384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com    const SkScalar drad = (n >> 1) * SK_ScalarPI * 2 / n;
104ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
10521384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com    path->moveTo(0, -SK_Scalar1);
10621384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com    for (int i = 1; i < n; i++) {
10721384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com        rad += drad;
10821384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com        SkScalar cosV, sinV = SkScalarSinCos(rad, &cosV);
10921384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com        path->lineTo(cosV, sinV);
11021384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com    }
11121384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com    path->close();
11221384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com}
11321384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com
11421384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.comstatic void make_path_line(SkPath* path, const SkRect& bounds) {
11521384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com    path->moveTo(bounds.left(), bounds.top());
11621384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com    path->lineTo(bounds.right(), bounds.bottom());
11721384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com}
11821384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com
11921384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.comstatic void make_path_rect(SkPath* path, const SkRect& bounds) {
12021384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com    path->addRect(bounds);
12121384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com}
12221384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com
12321384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.comstatic void make_path_oval(SkPath* path, const SkRect& bounds) {
12421384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com    path->addOval(bounds);
12521384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com}
12621384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com
12721384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.comstatic void make_path_star(SkPath* path, const SkRect& bounds) {
12821384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com    make_unit_star(path, 5);
12921384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com    SkMatrix matrix;
13021384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com    matrix.setRectToRect(path->getBounds(), bounds, SkMatrix::kCenter_ScaleToFit);
13121384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com    path->transform(matrix);
13221384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com}
13321384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com
13421384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.comclass Dashing2GM : public skiagm::GM {
13521384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.compublic:
13621384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com    Dashing2GM() {}
137ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
13821384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.comprotected:
139a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org    virtual uint32_t onGetFlags() const SK_OVERRIDE {
140a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org        return kSkipTiled_Flag;
141a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org    }
142a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org
14321384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com    SkString onShortName() {
14421384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com        return SkString("dashing2");
14521384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com    }
146ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
147f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina    SkISize onISize() { return SkISize::Make(640, 480); }
148ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
14921384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com    virtual void onDraw(SkCanvas* canvas) {
15021384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com        static const int gIntervals[] = {
15121384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com            3,  // 3 dashes: each count [0] followed by intervals [1..count]
15221384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com            2,  10, 10,
15321384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com            4,  20, 5, 5, 5,
15421384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com            2,  2, 2
15521384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com        };
15635a81dfdb2796ca47703b17173c933ece933b953reed@google.com
15721384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com        void (*gProc[])(SkPath*, const SkRect&) = {
15821384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com            make_path_line, make_path_rect, make_path_oval, make_path_star,
15921384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com        };
160ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
16121384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com        SkPaint paint;
16221384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com        paint.setAntiAlias(true);
16321384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com        paint.setStyle(SkPaint::kStroke_Style);
16421384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com        paint.setStrokeWidth(SkIntToScalar(6));
165ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
16621384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com        SkRect bounds = SkRect::MakeWH(SkIntToScalar(120), SkIntToScalar(120));
16721384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com        bounds.offset(SkIntToScalar(20), SkIntToScalar(20));
16821384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com        SkScalar dx = bounds.width() * 4 / 3;
16921384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com        SkScalar dy = bounds.height() * 4 / 3;
17021384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com
17121384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com        const int* intervals = &gIntervals[1];
17221384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com        for (int y = 0; y < gIntervals[0]; ++y) {
17321384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com            SkScalar vals[SK_ARRAY_COUNT(gIntervals)];  // more than enough
17421384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com            int count = *intervals++;
17521384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com            for (int i = 0; i < count; ++i) {
17621384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com                vals[i] = SkIntToScalar(*intervals++);
17721384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com            }
17821384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com            SkScalar phase = vals[0] / 2;
1790a2bf90dccba3bde188e0386a7f0c60e6dde1ae9commit-bot@chromium.org            paint.setPathEffect(SkDashPathEffect::Create(vals, count, phase))->unref();
180ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
18121384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com            for (size_t x = 0; x < SK_ARRAY_COUNT(gProc); ++x) {
18221384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com                SkPath path;
18321384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com                SkRect r = bounds;
18421384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com                r.offset(x * dx, y * dy);
18521384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com                gProc[x](&path, r);
186ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
18721384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com                canvas->drawPath(path, paint);
18821384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com            }
18921384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com        }
19021384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com    }
19135a81dfdb2796ca47703b17173c933ece933b953reed@google.com};
19235a81dfdb2796ca47703b17173c933ece933b953reed@google.com
19335a81dfdb2796ca47703b17173c933ece933b953reed@google.com//////////////////////////////////////////////////////////////////////////////
19435a81dfdb2796ca47703b17173c933ece933b953reed@google.com
195629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com// Test out the on/off line dashing Chrome if fond of
196629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.comclass Dashing3GM : public skiagm::GM {
197629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.compublic:
198629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com    Dashing3GM() {}
199629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com
200629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.comprotected:
201a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org    virtual uint32_t onGetFlags() const SK_OVERRIDE {
202a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org        return kSkipTiled_Flag;
203a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org    }
204a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org
205629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com    SkString onShortName() {
206629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com        return SkString("dashing3");
207629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com    }
208629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com
209f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina    SkISize onISize() { return SkISize::Make(640, 480); }
210629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com
211629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com    // Draw a 100x100 block of dashed lines. The horizontal ones are BW
212629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com    // while the vertical ones are AA.
21373b140a9f668c189b0682cc5f82d9fb57ff8bc15skia.committer@gmail.com    void drawDashedLines(SkCanvas* canvas,
21473b140a9f668c189b0682cc5f82d9fb57ff8bc15skia.committer@gmail.com                         SkScalar lineLength,
2158c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com                         SkScalar phase,
2168c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com                         SkScalar dashLength,
2178c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com                         int strokeWidth,
2188c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com                         bool circles) {
219629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com        SkPaint p;
220629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com        p.setColor(SK_ColorBLACK);
221629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com        p.setStyle(SkPaint::kStroke_Style);
2228c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com        p.setStrokeWidth(SkIntToScalar(strokeWidth));
223629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com
2248c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com        if (circles) {
2258c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com            p.setStrokeCap(SkPaint::kRound_Cap);
2268c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com        }
2278c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com
2288c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com        SkScalar intervals[2] = { dashLength, dashLength };
229629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com
23035c03fbf101306e8e82141853de4c664cbafedbbcommit-bot@chromium.org        p.setPathEffect(SkDashPathEffect::Create(intervals, 2, phase))->unref();
231629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com
232629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com        SkPoint pts[2];
233629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com
2348c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com        for (int y = 0; y < 100; y += 10*strokeWidth) {
235629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com            pts[0].set(0, SkIntToScalar(y));
2368c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com            pts[1].set(lineLength, SkIntToScalar(y));
237629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com
238629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com            canvas->drawPoints(SkCanvas::kLines_PointMode, 2, pts, p);
239629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com        }
240629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com
241629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com        p.setAntiAlias(true);
242629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com
2438c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com        for (int x = 0; x < 100; x += 14*strokeWidth) {
244629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com            pts[0].set(SkIntToScalar(x), 0);
2458c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com            pts[1].set(SkIntToScalar(x), lineLength);
246629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com
247629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com            canvas->drawPoints(SkCanvas::kLines_PointMode, 2, pts, p);
248629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com        }
249629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com    }
250629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com
251629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com    virtual void onDraw(SkCanvas* canvas) {
2528c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com        // 1on/1off 1x1 squares with phase of 0 - points fastpath
2538c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com        canvas->save();
2548c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com            canvas->translate(2, 0);
2558c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com            this->drawDashedLines(canvas, 100, 0, SK_Scalar1, 1, false);
2568c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com        canvas->restore();
2578c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com
2588c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com        // 1on/1off 1x1 squares with phase of .5 - rects fastpath (due to partial squares)
2598c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com        canvas->save();
2608c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com            canvas->translate(112, 0);
2618c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com            this->drawDashedLines(canvas, 100, SK_ScalarHalf, SK_Scalar1, 1, false);
2628c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com        canvas->restore();
2638c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com
2648c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com        // 1on/1off 1x1 squares with phase of 1 - points fastpath
2658c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com        canvas->save();
2668c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com            canvas->translate(222, 0);
2678c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com            this->drawDashedLines(canvas, 100, SK_Scalar1, SK_Scalar1, 1, false);
2688c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com        canvas->restore();
2698c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com
2708c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com        // 1on/1off 1x1 squares with phase of 1 and non-integer length - rects fastpath
2718c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com        canvas->save();
2728c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com            canvas->translate(332, 0);
273140d7286c5a40058932696eaa28818c313bd2ddfreed@google.com            this->drawDashedLines(canvas, 99.5f, SK_ScalarHalf, SK_Scalar1, 1, false);
2748c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com        canvas->restore();
2758c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com
2765c4d5582c9d47ea47c7699fe69b9f95d0117dbd5robertphillips@google.com        // 255on/255off 1x1 squares with phase of 0 - rects fast path
2775c4d5582c9d47ea47c7699fe69b9f95d0117dbd5robertphillips@google.com        canvas->save();
2785c4d5582c9d47ea47c7699fe69b9f95d0117dbd5robertphillips@google.com            canvas->translate(446, 0);
2795c4d5582c9d47ea47c7699fe69b9f95d0117dbd5robertphillips@google.com            this->drawDashedLines(canvas, 100, 0, SkIntToScalar(255), 1, false);
2805c4d5582c9d47ea47c7699fe69b9f95d0117dbd5robertphillips@google.com        canvas->restore();
2815c4d5582c9d47ea47c7699fe69b9f95d0117dbd5robertphillips@google.com
2828c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com        // 1on/1off 3x3 squares with phase of 0 - points fast path
283629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com        canvas->save();
2848c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com            canvas->translate(2, 110);
2858c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com            this->drawDashedLines(canvas, 100, 0, SkIntToScalar(3), 3, false);
286629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com        canvas->restore();
287629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com
2888c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com        // 1on/1off 3x3 squares with phase of 1.5 - rects fast path
289629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com        canvas->save();
2908c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com            canvas->translate(112, 110);
2914b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org            this->drawDashedLines(canvas, 100, 1.5f, SkIntToScalar(3), 3, false);
292629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com        canvas->restore();
293629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com
2948c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com        // 1on/1off 1x1 circles with phase of 1 - no fast path yet
295629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com        canvas->save();
2968c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com            canvas->translate(2, 220);
2978c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com            this->drawDashedLines(canvas, 100, SK_Scalar1, SK_Scalar1, 1, true);
298629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com        canvas->restore();
299629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com
3008c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com        // 1on/1off 3x3 circles with phase of 1 - no fast path yet
301629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com        canvas->save();
3028c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com            canvas->translate(112, 220);
3038c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com            this->drawDashedLines(canvas, 100, 0, SkIntToScalar(3), 3, true);
3048c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com        canvas->restore();
3058c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com
3068c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com        // 1on/1off 1x1 squares with rotation - should break fast path
3078c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com        canvas->save();
3088c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com            canvas->translate(332+SK_ScalarRoot2Over2*100, 110+SK_ScalarRoot2Over2*100);
309629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com            canvas->rotate(45);
310629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com            canvas->translate(-50, -50);
311629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com
3128c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com            this->drawDashedLines(canvas, 100, SK_Scalar1, SK_Scalar1, 1, false);
313629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com        canvas->restore();
314629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com
3158c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com        // 3on/3off 3x1 rects - should use rect fast path regardless of phase
3168c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com        for (int phase = 0; phase <= 3; ++phase) {
3178c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com            canvas->save();
31873b140a9f668c189b0682cc5f82d9fb57ff8bc15skia.committer@gmail.com                canvas->translate(SkIntToScalar(phase*110+2),
3198c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com                                  SkIntToScalar(330));
3208c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com                this->drawDashedLines(canvas, 100, SkIntToScalar(phase), SkIntToScalar(3), 1, false);
3218c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com            canvas->restore();
3228c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com        }
323629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com    }
324629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com
325629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com};
326629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com
327629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com//////////////////////////////////////////////////////////////////////////////
328629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com
329628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.orgclass Dashing4GM : public skiagm::GM {
330628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.orgpublic:
331628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org    Dashing4GM() {}
332628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org
333628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.orgprotected:
334628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org    virtual uint32_t onGetFlags() const SK_OVERRIDE {
335628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org        return kSkipTiled_Flag;
336628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org    }
337628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org
338628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org    SkString onShortName() {
339628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org        return SkString("dashing4");
340628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org    }
341628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org
342f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina    SkISize onISize() { return SkISize::Make(640, 950); }
343628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org
344628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org    virtual void onDraw(SkCanvas* canvas) {
345628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org        static const struct {
346628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org            int fOnInterval;
347628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org            int fOffInterval;
348628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org        } gData[] = {
349628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org            { 1, 1 },
350628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org            { 4, 2 },
351628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org            { 0, 4 }, // test for zero length on interval
352628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org        };
353628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org
354628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org        SkPaint paint;
355628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org        paint.setStyle(SkPaint::kStroke_Style);
356628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org
357628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org        canvas->translate(SkIntToScalar(20), SkIntToScalar(20));
358628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org        canvas->translate(0, SK_ScalarHalf);
359628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org
360628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org        for (int width = 0; width <= 2; ++width) {
361628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org            for (size_t data = 0; data < SK_ARRAY_COUNT(gData); ++data) {
362628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org                for (int aa = 0; aa <= 1; ++aa) {
363628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org                    for (int cap = 0; cap <= 1; ++cap) {
364628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org                        int w = width * width * width;
365628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org                        paint.setAntiAlias(SkToBool(aa));
366628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org                        paint.setStrokeWidth(SkIntToScalar(w));
367628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org
368628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org                        SkToBool(cap) ? paint.setStrokeCap(SkPaint::kSquare_Cap)
369628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org                            : paint.setStrokeCap(SkPaint::kRound_Cap);
370628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org
371628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org                        int scale = w ? w : 1;
372628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org
373628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org                        drawline(canvas, gData[data].fOnInterval * scale,
374628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org                                 gData[data].fOffInterval * scale,
375628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org                                 paint);
376628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org                        canvas->translate(0, SkIntToScalar(20));
377628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org                    }
378628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org                }
379628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org            }
380628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org        }
381628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org
382628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org        for (int aa = 0; aa <= 1; ++aa) {
383628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org            paint.setAntiAlias(SkToBool(aa));
384628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org            paint.setStrokeWidth(8.f);
385628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org            paint.setStrokeCap(SkPaint::kSquare_Cap);
386628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org            // Single dash element that is cut off at start and end
38771db88225d4e26303b5c3ad2c44305f6a5660754commit-bot@chromium.org            drawline(canvas, 32, 16, paint, 20.f, 0, 5.f);
388628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org            canvas->translate(0, SkIntToScalar(20));
389628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org
390628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org            // Two dash elements where each one is cut off at beginning and end respectively
39171db88225d4e26303b5c3ad2c44305f6a5660754commit-bot@chromium.org            drawline(canvas, 32, 16, paint, 56.f, 0, 5.f);
392628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org            canvas->translate(0, SkIntToScalar(20));
393628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org
394628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org            // Many dash elements where first and last are cut off at beginning and end respectively
39571db88225d4e26303b5c3ad2c44305f6a5660754commit-bot@chromium.org            drawline(canvas, 32, 16, paint, 584.f, 0, 5.f);
396628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org            canvas->translate(0, SkIntToScalar(20));
397628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org
398628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org            // Diagonal dash line where src pnts are not axis aligned (as apposed to being diagonal from
399628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org            // a canvas rotation)
40071db88225d4e26303b5c3ad2c44305f6a5660754commit-bot@chromium.org            drawline(canvas, 32, 16, paint, 600.f, 30.f);
401628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org            canvas->translate(0, SkIntToScalar(20));
402628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org
403628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org            // Case where only the off interval exists on the line. Thus nothing should be drawn
40471db88225d4e26303b5c3ad2c44305f6a5660754commit-bot@chromium.org            drawline(canvas, 32, 16, paint, 8.f, 0.f, 40.f);
405628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org            canvas->translate(0, SkIntToScalar(20));
406628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org        }
407628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org    }
408628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org};
409628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org
410628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org//////////////////////////////////////////////////////////////////////////////
411628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org
412e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillipsclass Dashing5GM : public skiagm::GM {
413e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillipspublic:
414e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips    Dashing5GM(bool doAA) : fDoAA(doAA) {}
415e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips
416e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillipsprotected:
417e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips    virtual uint32_t onGetFlags() const SK_OVERRIDE { return kAsBench_Flag | kSkipTiled_Flag; }
418e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips
419e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips    virtual SkString onShortName() SK_OVERRIDE {
420e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips        if (fDoAA) {
421e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips            return SkString("dashing5_aa");
422e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips        } else {
423e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips            return SkString("dashing5_bw");
424e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips        }
425e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips    }
426e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips
427e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips    virtual SkISize onISize() SK_OVERRIDE { return SkISize::Make(400, 200); }
428e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips
429e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips    virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
430e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips        static const int kOn = 4;
431e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips        static const int kOff = 4;
432e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips        static const int kIntervalLength = kOn + kOff;
433e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips
434e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips        static const SkColor gColors[kIntervalLength] = {
435e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips            SK_ColorRED,
436e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips            SK_ColorGREEN,
437e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips            SK_ColorBLUE,
438e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips            SK_ColorCYAN,
439e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips            SK_ColorMAGENTA,
440e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips            SK_ColorYELLOW,
441e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips            SK_ColorGRAY,
442e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips            SK_ColorDKGRAY
443e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips        };
444e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips
445e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips        SkPaint paint;
446e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips        paint.setStyle(SkPaint::kStroke_Style);
447e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips
448e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips        paint.setAntiAlias(fDoAA);
449e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips
450e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips        SkMatrix rot;
451e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips        rot.setRotate(90);
452e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips        SkASSERT(rot.rectStaysRect());
453e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips
454e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips        canvas->concat(rot);
455e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips
456e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips        int sign;       // used to toggle the direction of the lines
457e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips        int phase = 0;
458e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips
459e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips        for (int x = 0; x < 200; x += 10) {
460e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips            paint.setStrokeWidth(SkIntToScalar(phase+1));
461e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips            paint.setColor(gColors[phase]);
462e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips            sign = (x % 20) ? 1 : -1;
463e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips            drawline(canvas, kOn, kOff, paint,
464e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips                     SkIntToScalar(x), -sign * SkIntToScalar(10003),
465e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips                     SkIntToScalar(phase),
466e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips                     SkIntToScalar(x),  sign * SkIntToScalar(10003));
467e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips            phase = (phase + 1) % kIntervalLength;
468e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips        }
469e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips
470e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips        for (int y = -400; y < 0; y += 10) {
471e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips            paint.setStrokeWidth(SkIntToScalar(phase+1));
472e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips            paint.setColor(gColors[phase]);
473e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips            sign = (y % 20) ? 1 : -1;
474e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips            drawline(canvas, kOn, kOff, paint,
475e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips                     -sign * SkIntToScalar(10003), SkIntToScalar(y),
476e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips                     SkIntToScalar(phase),
477e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips                      sign * SkIntToScalar(10003), SkIntToScalar(y));
478e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips            phase = (phase + 1) % kIntervalLength;
479e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips        }
480e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips    }
481e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips
482e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillipsprivate:
483e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips    bool fDoAA;
484e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips};
485e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips
486e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips//////////////////////////////////////////////////////////////////////////////
487e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert Phillips
488e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert PhillipsDEF_GM(return SkNEW(DashingGM);)
489e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert PhillipsDEF_GM(return SkNEW(Dashing2GM);)
490e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert PhillipsDEF_GM(return SkNEW(Dashing3GM);)
491e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert PhillipsDEF_GM(return SkNEW(Dashing4GM);)
492e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert PhillipsDEF_GM(return SkNEW_ARGS(Dashing5GM, (true));)
493e12770148a7d170e4845ebfae75ac38ae9cf4f32Robert PhillipsDEF_GM(return SkNEW_ARGS(Dashing5GM, (false));)
49421384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com
495