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