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