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),
159f2251c73ed6f417dd1057d487bf523e04488440robertphillips                     SkScalar phase = SkIntToScalar(0),
169f2251c73ed6f417dd1057d487bf523e04488440robertphillips                     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();
259f2251c73ed6f417dd1057d487bf523e04488440robertphillips    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
3721402e3851454e90329bad52893f29959da086f7egdanielstatic void show_zero_len_dash(SkCanvas* canvas) {
3821402e3851454e90329bad52893f29959da086f7egdaniel    SkPaint paint;
3921402e3851454e90329bad52893f29959da086f7egdaniel
4021402e3851454e90329bad52893f29959da086f7egdaniel    drawline(canvas, 2, 2, paint, SkIntToScalar(0));
4121402e3851454e90329bad52893f29959da086f7egdaniel    paint.setStyle(SkPaint::kStroke_Style);
4221402e3851454e90329bad52893f29959da086f7egdaniel    paint.setStrokeWidth(SkIntToScalar(2));
4321402e3851454e90329bad52893f29959da086f7egdaniel    canvas->translate(0, SkIntToScalar(20));
4421402e3851454e90329bad52893f29959da086f7egdaniel    drawline(canvas, 4, 4, paint, SkIntToScalar(0));
4521402e3851454e90329bad52893f29959da086f7egdaniel}
4621402e3851454e90329bad52893f29959da086f7egdaniel
4721384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.comclass DashingGM : public skiagm::GM {
4835a81dfdb2796ca47703b17173c933ece933b953reed@google.compublic:
4935a81dfdb2796ca47703b17173c933ece933b953reed@google.com    DashingGM() {}
5035a81dfdb2796ca47703b17173c933ece933b953reed@google.com
5135a81dfdb2796ca47703b17173c933ece933b953reed@google.comprotected:
52a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org
5335a81dfdb2796ca47703b17173c933ece933b953reed@google.com    SkString onShortName() {
5435a81dfdb2796ca47703b17173c933ece933b953reed@google.com        return SkString("dashing");
5535a81dfdb2796ca47703b17173c933ece933b953reed@google.com    }
5635a81dfdb2796ca47703b17173c933ece933b953reed@google.com
57f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina    SkISize onISize() { return SkISize::Make(640, 300); }
5835a81dfdb2796ca47703b17173c933ece933b953reed@google.com
5935a81dfdb2796ca47703b17173c933ece933b953reed@google.com    virtual void onDraw(SkCanvas* canvas) {
6035a81dfdb2796ca47703b17173c933ece933b953reed@google.com        static const struct {
6135a81dfdb2796ca47703b17173c933ece933b953reed@google.com            int fOnInterval;
6235a81dfdb2796ca47703b17173c933ece933b953reed@google.com            int fOffInterval;
6335a81dfdb2796ca47703b17173c933ece933b953reed@google.com        } gData[] = {
6435a81dfdb2796ca47703b17173c933ece933b953reed@google.com            { 1, 1 },
6535a81dfdb2796ca47703b17173c933ece933b953reed@google.com            { 4, 1 },
6635a81dfdb2796ca47703b17173c933ece933b953reed@google.com        };
67ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
6835a81dfdb2796ca47703b17173c933ece933b953reed@google.com        SkPaint paint;
6935a81dfdb2796ca47703b17173c933ece933b953reed@google.com        paint.setStyle(SkPaint::kStroke_Style);
7035a81dfdb2796ca47703b17173c933ece933b953reed@google.com
7135a81dfdb2796ca47703b17173c933ece933b953reed@google.com        canvas->translate(SkIntToScalar(20), SkIntToScalar(20));
7235a81dfdb2796ca47703b17173c933ece933b953reed@google.com        canvas->translate(0, SK_ScalarHalf);
7335a81dfdb2796ca47703b17173c933ece933b953reed@google.com        for (int width = 0; width <= 2; ++width) {
7435a81dfdb2796ca47703b17173c933ece933b953reed@google.com            for (size_t data = 0; data < SK_ARRAY_COUNT(gData); ++data) {
7535a81dfdb2796ca47703b17173c933ece933b953reed@google.com                for (int aa = 0; aa <= 1; ++aa) {
7635a81dfdb2796ca47703b17173c933ece933b953reed@google.com                    int w = width * width * width;
7735a81dfdb2796ca47703b17173c933ece933b953reed@google.com                    paint.setAntiAlias(SkToBool(aa));
7835a81dfdb2796ca47703b17173c933ece933b953reed@google.com                    paint.setStrokeWidth(SkIntToScalar(w));
79ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
8035a81dfdb2796ca47703b17173c933ece933b953reed@google.com                    int scale = w ? w : 1;
8135a81dfdb2796ca47703b17173c933ece933b953reed@google.com
8235a81dfdb2796ca47703b17173c933ece933b953reed@google.com                    drawline(canvas, gData[data].fOnInterval * scale,
8335a81dfdb2796ca47703b17173c933ece933b953reed@google.com                             gData[data].fOffInterval * scale,
8435a81dfdb2796ca47703b17173c933ece933b953reed@google.com                             paint);
8535a81dfdb2796ca47703b17173c933ece933b953reed@google.com                    canvas->translate(0, SkIntToScalar(20));
8635a81dfdb2796ca47703b17173c933ece933b953reed@google.com                }
8735a81dfdb2796ca47703b17173c933ece933b953reed@google.com            }
8835a81dfdb2796ca47703b17173c933ece933b953reed@google.com        }
89ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
90de1837bb96b0f72dad7482786d6e577013d4a85breed@google.com        show_giant_dash(canvas);
9121402e3851454e90329bad52893f29959da086f7egdaniel        canvas->translate(0, SkIntToScalar(20));
9221402e3851454e90329bad52893f29959da086f7egdaniel        show_zero_len_dash(canvas);
9335a81dfdb2796ca47703b17173c933ece933b953reed@google.com    }
9421384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com};
9521384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com
9621384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com///////////////////////////////////////////////////////////////////////////////
9721384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com
9821384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.comstatic void make_unit_star(SkPath* path, int n) {
9921384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com    SkScalar rad = -SK_ScalarPI / 2;
10021384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com    const SkScalar drad = (n >> 1) * SK_ScalarPI * 2 / n;
101ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
10221384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com    path->moveTo(0, -SK_Scalar1);
10321384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com    for (int i = 1; i < n; i++) {
10421384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com        rad += drad;
10521384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com        SkScalar cosV, sinV = SkScalarSinCos(rad, &cosV);
10621384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com        path->lineTo(cosV, sinV);
10721384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com    }
10821384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com    path->close();
10921384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com}
11021384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com
11121384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.comstatic void make_path_line(SkPath* path, const SkRect& bounds) {
11221384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com    path->moveTo(bounds.left(), bounds.top());
11321384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com    path->lineTo(bounds.right(), bounds.bottom());
11421384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com}
11521384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com
11621384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.comstatic void make_path_rect(SkPath* path, const SkRect& bounds) {
11721384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com    path->addRect(bounds);
11821384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com}
11921384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com
12021384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.comstatic void make_path_oval(SkPath* path, const SkRect& bounds) {
12121384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com    path->addOval(bounds);
12221384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com}
12321384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com
12421384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.comstatic void make_path_star(SkPath* path, const SkRect& bounds) {
12521384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com    make_unit_star(path, 5);
12621384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com    SkMatrix matrix;
12721384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com    matrix.setRectToRect(path->getBounds(), bounds, SkMatrix::kCenter_ScaleToFit);
12821384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com    path->transform(matrix);
12921384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com}
13021384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com
13121384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.comclass Dashing2GM : public skiagm::GM {
13221384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.compublic:
13321384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com    Dashing2GM() {}
134ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
13521384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.comprotected:
136a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org
13721384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com    SkString onShortName() {
13821384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com        return SkString("dashing2");
13921384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com    }
140ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
141f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina    SkISize onISize() { return SkISize::Make(640, 480); }
142ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
14321384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com    virtual void onDraw(SkCanvas* canvas) {
14421384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com        static const int gIntervals[] = {
14521384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com            3,  // 3 dashes: each count [0] followed by intervals [1..count]
14621384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com            2,  10, 10,
14721384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com            4,  20, 5, 5, 5,
14821384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com            2,  2, 2
14921384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com        };
15035a81dfdb2796ca47703b17173c933ece933b953reed@google.com
15121384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com        void (*gProc[])(SkPath*, const SkRect&) = {
15221384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com            make_path_line, make_path_rect, make_path_oval, make_path_star,
15321384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com        };
154ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
15521384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com        SkPaint paint;
15621384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com        paint.setAntiAlias(true);
15721384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com        paint.setStyle(SkPaint::kStroke_Style);
15821384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com        paint.setStrokeWidth(SkIntToScalar(6));
159ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
16021384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com        SkRect bounds = SkRect::MakeWH(SkIntToScalar(120), SkIntToScalar(120));
16121384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com        bounds.offset(SkIntToScalar(20), SkIntToScalar(20));
16221384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com        SkScalar dx = bounds.width() * 4 / 3;
16321384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com        SkScalar dy = bounds.height() * 4 / 3;
16421384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com
16521384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com        const int* intervals = &gIntervals[1];
16621384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com        for (int y = 0; y < gIntervals[0]; ++y) {
16721384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com            SkScalar vals[SK_ARRAY_COUNT(gIntervals)];  // more than enough
16821384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com            int count = *intervals++;
16921384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com            for (int i = 0; i < count; ++i) {
17021384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com                vals[i] = SkIntToScalar(*intervals++);
17121384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com            }
17221384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com            SkScalar phase = vals[0] / 2;
1730a2bf90dccba3bde188e0386a7f0c60e6dde1ae9commit-bot@chromium.org            paint.setPathEffect(SkDashPathEffect::Create(vals, count, phase))->unref();
174ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
17521384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com            for (size_t x = 0; x < SK_ARRAY_COUNT(gProc); ++x) {
17621384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com                SkPath path;
17721384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com                SkRect r = bounds;
17821384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com                r.offset(x * dx, y * dy);
17921384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com                gProc[x](&path, r);
180ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
18121384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com                canvas->drawPath(path, paint);
18221384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com            }
18321384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com        }
18421384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com    }
18535a81dfdb2796ca47703b17173c933ece933b953reed@google.com};
18635a81dfdb2796ca47703b17173c933ece933b953reed@google.com
18735a81dfdb2796ca47703b17173c933ece933b953reed@google.com//////////////////////////////////////////////////////////////////////////////
18835a81dfdb2796ca47703b17173c933ece933b953reed@google.com
189629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com// Test out the on/off line dashing Chrome if fond of
190629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.comclass Dashing3GM : public skiagm::GM {
191629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.compublic:
192629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com    Dashing3GM() {}
193629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com
194629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.comprotected:
195a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org
196629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com    SkString onShortName() {
197629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com        return SkString("dashing3");
198629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com    }
199629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com
200f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina    SkISize onISize() { return SkISize::Make(640, 480); }
201629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com
202629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com    // Draw a 100x100 block of dashed lines. The horizontal ones are BW
203629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com    // while the vertical ones are AA.
20473b140a9f668c189b0682cc5f82d9fb57ff8bc15skia.committer@gmail.com    void drawDashedLines(SkCanvas* canvas,
20573b140a9f668c189b0682cc5f82d9fb57ff8bc15skia.committer@gmail.com                         SkScalar lineLength,
2068c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com                         SkScalar phase,
2078c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com                         SkScalar dashLength,
2088c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com                         int strokeWidth,
2098c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com                         bool circles) {
210629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com        SkPaint p;
211629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com        p.setColor(SK_ColorBLACK);
212629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com        p.setStyle(SkPaint::kStroke_Style);
2138c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com        p.setStrokeWidth(SkIntToScalar(strokeWidth));
214629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com
2158c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com        if (circles) {
2168c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com            p.setStrokeCap(SkPaint::kRound_Cap);
2178c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com        }
2188c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com
2198c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com        SkScalar intervals[2] = { dashLength, dashLength };
220629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com
22135c03fbf101306e8e82141853de4c664cbafedbbcommit-bot@chromium.org        p.setPathEffect(SkDashPathEffect::Create(intervals, 2, phase))->unref();
222629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com
223629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com        SkPoint pts[2];
224629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com
2258c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com        for (int y = 0; y < 100; y += 10*strokeWidth) {
226629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com            pts[0].set(0, SkIntToScalar(y));
2278c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com            pts[1].set(lineLength, SkIntToScalar(y));
228629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com
229629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com            canvas->drawPoints(SkCanvas::kLines_PointMode, 2, pts, p);
230629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com        }
231629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com
232629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com        p.setAntiAlias(true);
233629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com
2348c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com        for (int x = 0; x < 100; x += 14*strokeWidth) {
235629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com            pts[0].set(SkIntToScalar(x), 0);
2368c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com            pts[1].set(SkIntToScalar(x), lineLength);
237629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com
238629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com            canvas->drawPoints(SkCanvas::kLines_PointMode, 2, pts, p);
239629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com        }
240629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com    }
241629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com
242629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com    virtual void onDraw(SkCanvas* canvas) {
2438c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com        // 1on/1off 1x1 squares with phase of 0 - points fastpath
2448c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com        canvas->save();
2458c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com            canvas->translate(2, 0);
2468c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com            this->drawDashedLines(canvas, 100, 0, SK_Scalar1, 1, false);
2478c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com        canvas->restore();
2488c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com
2498c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com        // 1on/1off 1x1 squares with phase of .5 - rects fastpath (due to partial squares)
2508c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com        canvas->save();
2518c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com            canvas->translate(112, 0);
2528c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com            this->drawDashedLines(canvas, 100, SK_ScalarHalf, SK_Scalar1, 1, false);
2538c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com        canvas->restore();
2548c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com
2558c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com        // 1on/1off 1x1 squares with phase of 1 - points fastpath
2568c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com        canvas->save();
2578c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com            canvas->translate(222, 0);
2588c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com            this->drawDashedLines(canvas, 100, SK_Scalar1, SK_Scalar1, 1, false);
2598c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com        canvas->restore();
2608c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com
2618c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com        // 1on/1off 1x1 squares with phase of 1 and non-integer length - rects fastpath
2628c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com        canvas->save();
2638c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com            canvas->translate(332, 0);
264140d7286c5a40058932696eaa28818c313bd2ddfreed@google.com            this->drawDashedLines(canvas, 99.5f, SK_ScalarHalf, SK_Scalar1, 1, false);
2658c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com        canvas->restore();
2668c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com
2675c4d5582c9d47ea47c7699fe69b9f95d0117dbd5robertphillips@google.com        // 255on/255off 1x1 squares with phase of 0 - rects fast path
2685c4d5582c9d47ea47c7699fe69b9f95d0117dbd5robertphillips@google.com        canvas->save();
2695c4d5582c9d47ea47c7699fe69b9f95d0117dbd5robertphillips@google.com            canvas->translate(446, 0);
2705c4d5582c9d47ea47c7699fe69b9f95d0117dbd5robertphillips@google.com            this->drawDashedLines(canvas, 100, 0, SkIntToScalar(255), 1, false);
2715c4d5582c9d47ea47c7699fe69b9f95d0117dbd5robertphillips@google.com        canvas->restore();
2725c4d5582c9d47ea47c7699fe69b9f95d0117dbd5robertphillips@google.com
2738c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com        // 1on/1off 3x3 squares with phase of 0 - points fast path
274629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com        canvas->save();
2758c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com            canvas->translate(2, 110);
2768c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com            this->drawDashedLines(canvas, 100, 0, SkIntToScalar(3), 3, false);
277629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com        canvas->restore();
278629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com
2798c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com        // 1on/1off 3x3 squares with phase of 1.5 - rects fast path
280629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com        canvas->save();
2818c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com            canvas->translate(112, 110);
2824b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org            this->drawDashedLines(canvas, 100, 1.5f, SkIntToScalar(3), 3, false);
283629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com        canvas->restore();
284629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com
2858c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com        // 1on/1off 1x1 circles with phase of 1 - no fast path yet
286629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com        canvas->save();
2878c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com            canvas->translate(2, 220);
2888c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com            this->drawDashedLines(canvas, 100, SK_Scalar1, SK_Scalar1, 1, true);
289629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com        canvas->restore();
290629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com
2918c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com        // 1on/1off 3x3 circles with phase of 1 - no fast path yet
292629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com        canvas->save();
2938c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com            canvas->translate(112, 220);
2948c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com            this->drawDashedLines(canvas, 100, 0, SkIntToScalar(3), 3, true);
2958c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com        canvas->restore();
2968c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com
2978c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com        // 1on/1off 1x1 squares with rotation - should break fast path
2988c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com        canvas->save();
2998c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com            canvas->translate(332+SK_ScalarRoot2Over2*100, 110+SK_ScalarRoot2Over2*100);
300629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com            canvas->rotate(45);
301629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com            canvas->translate(-50, -50);
302629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com
3038c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com            this->drawDashedLines(canvas, 100, SK_Scalar1, SK_Scalar1, 1, false);
304629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com        canvas->restore();
305629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com
3068c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com        // 3on/3off 3x1 rects - should use rect fast path regardless of phase
3078c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com        for (int phase = 0; phase <= 3; ++phase) {
3088c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com            canvas->save();
30973b140a9f668c189b0682cc5f82d9fb57ff8bc15skia.committer@gmail.com                canvas->translate(SkIntToScalar(phase*110+2),
3108c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com                                  SkIntToScalar(330));
3118c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com                this->drawDashedLines(canvas, 100, SkIntToScalar(phase), SkIntToScalar(3), 1, false);
3128c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com            canvas->restore();
3138c685c5d7594c5e8a5e6edf363cd07e325f603b7robertphillips@google.com        }
314629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com    }
315629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com
316629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com};
317629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com
318629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com//////////////////////////////////////////////////////////////////////////////
319629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com
320628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.orgclass Dashing4GM : public skiagm::GM {
321628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.orgpublic:
322628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org    Dashing4GM() {}
323628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org
324628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.orgprotected:
325628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org
326628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org    SkString onShortName() {
327628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org        return SkString("dashing4");
328628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org    }
329628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org
330f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina    SkISize onISize() { return SkISize::Make(640, 950); }
331628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org
332628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org    virtual void onDraw(SkCanvas* canvas) {
333628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org        static const struct {
334628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org            int fOnInterval;
335628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org            int fOffInterval;
336628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org        } gData[] = {
337628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org            { 1, 1 },
338628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org            { 4, 2 },
339628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org            { 0, 4 }, // test for zero length on interval
340628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org        };
341628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org
342628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org        SkPaint paint;
343628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org        paint.setStyle(SkPaint::kStroke_Style);
344628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org
345628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org        canvas->translate(SkIntToScalar(20), SkIntToScalar(20));
346628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org        canvas->translate(0, SK_ScalarHalf);
347628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org
348628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org        for (int width = 0; width <= 2; ++width) {
349628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org            for (size_t data = 0; data < SK_ARRAY_COUNT(gData); ++data) {
350628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org                for (int aa = 0; aa <= 1; ++aa) {
351628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org                    for (int cap = 0; cap <= 1; ++cap) {
352628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org                        int w = width * width * width;
353628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org                        paint.setAntiAlias(SkToBool(aa));
354628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org                        paint.setStrokeWidth(SkIntToScalar(w));
355628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org
356628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org                        SkToBool(cap) ? paint.setStrokeCap(SkPaint::kSquare_Cap)
357628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org                            : paint.setStrokeCap(SkPaint::kRound_Cap);
358628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org
359628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org                        int scale = w ? w : 1;
360628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org
361628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org                        drawline(canvas, gData[data].fOnInterval * scale,
362628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org                                 gData[data].fOffInterval * scale,
363628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org                                 paint);
364628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org                        canvas->translate(0, SkIntToScalar(20));
365628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org                    }
366628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org                }
367628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org            }
368628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org        }
369628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org
370628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org        for (int aa = 0; aa <= 1; ++aa) {
371628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org            paint.setAntiAlias(SkToBool(aa));
372628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org            paint.setStrokeWidth(8.f);
373628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org            paint.setStrokeCap(SkPaint::kSquare_Cap);
374628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org            // Single dash element that is cut off at start and end
37571db88225d4e26303b5c3ad2c44305f6a5660754commit-bot@chromium.org            drawline(canvas, 32, 16, paint, 20.f, 0, 5.f);
376628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org            canvas->translate(0, SkIntToScalar(20));
377628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org
378628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org            // Two dash elements where each one is cut off at beginning and end respectively
37971db88225d4e26303b5c3ad2c44305f6a5660754commit-bot@chromium.org            drawline(canvas, 32, 16, paint, 56.f, 0, 5.f);
380628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org            canvas->translate(0, SkIntToScalar(20));
381628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org
382628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org            // Many dash elements where first and last are cut off at beginning and end respectively
38371db88225d4e26303b5c3ad2c44305f6a5660754commit-bot@chromium.org            drawline(canvas, 32, 16, paint, 584.f, 0, 5.f);
384628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org            canvas->translate(0, SkIntToScalar(20));
385628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org
386628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org            // Diagonal dash line where src pnts are not axis aligned (as apposed to being diagonal from
387628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org            // a canvas rotation)
38871db88225d4e26303b5c3ad2c44305f6a5660754commit-bot@chromium.org            drawline(canvas, 32, 16, paint, 600.f, 30.f);
389628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org            canvas->translate(0, SkIntToScalar(20));
390628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org
391628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org            // Case where only the off interval exists on the line. Thus nothing should be drawn
39271db88225d4e26303b5c3ad2c44305f6a5660754commit-bot@chromium.org            drawline(canvas, 32, 16, paint, 8.f, 0.f, 40.f);
393628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org            canvas->translate(0, SkIntToScalar(20));
394628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org        }
395628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org    }
396628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org};
397628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org
398628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org//////////////////////////////////////////////////////////////////////////////
399628ed0b22045a9544b56e00e73137d6050ce900ccommit-bot@chromium.org
4009f2251c73ed6f417dd1057d487bf523e04488440robertphillipsclass Dashing5GM : public skiagm::GM {
4019f2251c73ed6f417dd1057d487bf523e04488440robertphillipspublic:
4029f2251c73ed6f417dd1057d487bf523e04488440robertphillips    Dashing5GM(bool doAA) : fDoAA(doAA) {}
4039f2251c73ed6f417dd1057d487bf523e04488440robertphillips
4049f2251c73ed6f417dd1057d487bf523e04488440robertphillipsprotected:
4059f2251c73ed6f417dd1057d487bf523e04488440robertphillips
40636352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    bool runAsBench() const override { return true; }
407cf5d9c993dcbd75d4cefe2d1de25c2b9645f6957mtklein
40836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    SkString onShortName() override {
4099f2251c73ed6f417dd1057d487bf523e04488440robertphillips        if (fDoAA) {
4109f2251c73ed6f417dd1057d487bf523e04488440robertphillips            return SkString("dashing5_aa");
4119f2251c73ed6f417dd1057d487bf523e04488440robertphillips        } else {
4129f2251c73ed6f417dd1057d487bf523e04488440robertphillips            return SkString("dashing5_bw");
4139f2251c73ed6f417dd1057d487bf523e04488440robertphillips        }
4149f2251c73ed6f417dd1057d487bf523e04488440robertphillips    }
4159f2251c73ed6f417dd1057d487bf523e04488440robertphillips
41636352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    SkISize onISize() override { return SkISize::Make(400, 200); }
4179f2251c73ed6f417dd1057d487bf523e04488440robertphillips
41836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onDraw(SkCanvas* canvas) override {
4199f2251c73ed6f417dd1057d487bf523e04488440robertphillips        static const int kOn = 4;
4209f2251c73ed6f417dd1057d487bf523e04488440robertphillips        static const int kOff = 4;
4219f2251c73ed6f417dd1057d487bf523e04488440robertphillips        static const int kIntervalLength = kOn + kOff;
4229f2251c73ed6f417dd1057d487bf523e04488440robertphillips
4239f2251c73ed6f417dd1057d487bf523e04488440robertphillips        static const SkColor gColors[kIntervalLength] = {
4249f2251c73ed6f417dd1057d487bf523e04488440robertphillips            SK_ColorRED,
4259f2251c73ed6f417dd1057d487bf523e04488440robertphillips            SK_ColorGREEN,
4269f2251c73ed6f417dd1057d487bf523e04488440robertphillips            SK_ColorBLUE,
4279f2251c73ed6f417dd1057d487bf523e04488440robertphillips            SK_ColorCYAN,
4289f2251c73ed6f417dd1057d487bf523e04488440robertphillips            SK_ColorMAGENTA,
4299f2251c73ed6f417dd1057d487bf523e04488440robertphillips            SK_ColorYELLOW,
4309f2251c73ed6f417dd1057d487bf523e04488440robertphillips            SK_ColorGRAY,
4319f2251c73ed6f417dd1057d487bf523e04488440robertphillips            SK_ColorDKGRAY
4329f2251c73ed6f417dd1057d487bf523e04488440robertphillips        };
4339f2251c73ed6f417dd1057d487bf523e04488440robertphillips
4349f2251c73ed6f417dd1057d487bf523e04488440robertphillips        SkPaint paint;
4359f2251c73ed6f417dd1057d487bf523e04488440robertphillips        paint.setStyle(SkPaint::kStroke_Style);
4369f2251c73ed6f417dd1057d487bf523e04488440robertphillips
4379f2251c73ed6f417dd1057d487bf523e04488440robertphillips        paint.setAntiAlias(fDoAA);
4389f2251c73ed6f417dd1057d487bf523e04488440robertphillips
4399f2251c73ed6f417dd1057d487bf523e04488440robertphillips        SkMatrix rot;
4409f2251c73ed6f417dd1057d487bf523e04488440robertphillips        rot.setRotate(90);
4419f2251c73ed6f417dd1057d487bf523e04488440robertphillips        SkASSERT(rot.rectStaysRect());
4429f2251c73ed6f417dd1057d487bf523e04488440robertphillips
4439f2251c73ed6f417dd1057d487bf523e04488440robertphillips        canvas->concat(rot);
4449f2251c73ed6f417dd1057d487bf523e04488440robertphillips
4459f2251c73ed6f417dd1057d487bf523e04488440robertphillips        int sign;       // used to toggle the direction of the lines
4469f2251c73ed6f417dd1057d487bf523e04488440robertphillips        int phase = 0;
4479f2251c73ed6f417dd1057d487bf523e04488440robertphillips
4489f2251c73ed6f417dd1057d487bf523e04488440robertphillips        for (int x = 0; x < 200; x += 10) {
4499f2251c73ed6f417dd1057d487bf523e04488440robertphillips            paint.setStrokeWidth(SkIntToScalar(phase+1));
4509f2251c73ed6f417dd1057d487bf523e04488440robertphillips            paint.setColor(gColors[phase]);
4519f2251c73ed6f417dd1057d487bf523e04488440robertphillips            sign = (x % 20) ? 1 : -1;
4529f2251c73ed6f417dd1057d487bf523e04488440robertphillips            drawline(canvas, kOn, kOff, paint,
4539f2251c73ed6f417dd1057d487bf523e04488440robertphillips                     SkIntToScalar(x), -sign * SkIntToScalar(10003),
4549f2251c73ed6f417dd1057d487bf523e04488440robertphillips                     SkIntToScalar(phase),
4559f2251c73ed6f417dd1057d487bf523e04488440robertphillips                     SkIntToScalar(x),  sign * SkIntToScalar(10003));
4569f2251c73ed6f417dd1057d487bf523e04488440robertphillips            phase = (phase + 1) % kIntervalLength;
4579f2251c73ed6f417dd1057d487bf523e04488440robertphillips        }
4589f2251c73ed6f417dd1057d487bf523e04488440robertphillips
4599f2251c73ed6f417dd1057d487bf523e04488440robertphillips        for (int y = -400; y < 0; y += 10) {
4609f2251c73ed6f417dd1057d487bf523e04488440robertphillips            paint.setStrokeWidth(SkIntToScalar(phase+1));
4619f2251c73ed6f417dd1057d487bf523e04488440robertphillips            paint.setColor(gColors[phase]);
4629f2251c73ed6f417dd1057d487bf523e04488440robertphillips            sign = (y % 20) ? 1 : -1;
4639f2251c73ed6f417dd1057d487bf523e04488440robertphillips            drawline(canvas, kOn, kOff, paint,
4649f2251c73ed6f417dd1057d487bf523e04488440robertphillips                     -sign * SkIntToScalar(10003), SkIntToScalar(y),
4659f2251c73ed6f417dd1057d487bf523e04488440robertphillips                     SkIntToScalar(phase),
4669f2251c73ed6f417dd1057d487bf523e04488440robertphillips                      sign * SkIntToScalar(10003), SkIntToScalar(y));
4679f2251c73ed6f417dd1057d487bf523e04488440robertphillips            phase = (phase + 1) % kIntervalLength;
4689f2251c73ed6f417dd1057d487bf523e04488440robertphillips        }
4699f2251c73ed6f417dd1057d487bf523e04488440robertphillips    }
4709f2251c73ed6f417dd1057d487bf523e04488440robertphillips
4719f2251c73ed6f417dd1057d487bf523e04488440robertphillipsprivate:
4729f2251c73ed6f417dd1057d487bf523e04488440robertphillips    bool fDoAA;
4739f2251c73ed6f417dd1057d487bf523e04488440robertphillips};
4749f2251c73ed6f417dd1057d487bf523e04488440robertphillips
4759f2251c73ed6f417dd1057d487bf523e04488440robertphillips//////////////////////////////////////////////////////////////////////////////
4769f2251c73ed6f417dd1057d487bf523e04488440robertphillips
4779f2251c73ed6f417dd1057d487bf523e04488440robertphillipsDEF_GM(return SkNEW(DashingGM);)
4789f2251c73ed6f417dd1057d487bf523e04488440robertphillipsDEF_GM(return SkNEW(Dashing2GM);)
4799f2251c73ed6f417dd1057d487bf523e04488440robertphillipsDEF_GM(return SkNEW(Dashing3GM);)
4809f2251c73ed6f417dd1057d487bf523e04488440robertphillipsDEF_GM(return SkNEW(Dashing4GM);)
4819f2251c73ed6f417dd1057d487bf523e04488440robertphillipsDEF_GM(return SkNEW_ARGS(Dashing5GM, (true));)
4829f2251c73ed6f417dd1057d487bf523e04488440robertphillipsDEF_GM(return SkNEW_ARGS(Dashing5GM, (false));)
48321384df037e5bf0529cff6b0a5da2b22d59a9c73reed@google.com
484