| Index: gm/dashing.cpp
|
| diff --git a/gm/dashing.cpp b/gm/dashing.cpp
|
| index 2f5be081597d55a940405b9c1fc5d323f1e68760..23de24d26b7fce6be551de705a0b86204b869dc6 100644
|
| --- a/gm/dashing.cpp
|
| +++ b/gm/dashing.cpp
|
| @@ -11,7 +11,8 @@
|
| #include "SkDashPathEffect.h"
|
|
|
| static void drawline(SkCanvas* canvas, int on, int off, const SkPaint& paint,
|
| - SkScalar finalX = SkIntToScalar(600)) {
|
| + SkScalar finalX = SkIntToScalar(600), SkScalar finalY = SkIntToScalar(0),
|
| + SkScalar phase = SkIntToScalar(0)) {
|
| SkPaint p(paint);
|
|
|
| const SkScalar intervals[] = {
|
| @@ -19,8 +20,8 @@ static void drawline(SkCanvas* canvas, int on, int off, const SkPaint& paint,
|
| SkIntToScalar(off),
|
| };
|
|
|
| - p.setPathEffect(SkDashPathEffect::Create(intervals, 2, 0))->unref();
|
| - canvas->drawLine(0, 0, finalX, 0, p);
|
| + p.setPathEffect(SkDashPathEffect::Create(intervals, 2, phase))->unref();
|
| + canvas->drawLine(0, 0, finalX, finalY, p);
|
| }
|
|
|
| // earlier bug stopped us from drawing very long single-segment dashes, because
|
| @@ -233,6 +234,7 @@ protected:
|
|
|
| canvas->drawPoints(SkCanvas::kLines_PointMode, 2, pts, p);
|
| }
|
| +
|
| }
|
|
|
| virtual void onDraw(SkCanvas* canvas) {
|
| @@ -313,10 +315,96 @@ protected:
|
|
|
| //////////////////////////////////////////////////////////////////////////////
|
|
|
| +class Dashing4GM : public skiagm::GM {
|
| +public:
|
| + Dashing4GM() {}
|
| +
|
| +protected:
|
| + virtual uint32_t onGetFlags() const SK_OVERRIDE {
|
| + return kSkipTiled_Flag;
|
| + }
|
| +
|
| + SkString onShortName() {
|
| + return SkString("dashing4");
|
| + }
|
| +
|
| + SkISize onISize() { return skiagm::make_isize(640, 950); }
|
| +
|
| + virtual void onDraw(SkCanvas* canvas) {
|
| + static const struct {
|
| + int fOnInterval;
|
| + int fOffInterval;
|
| + } gData[] = {
|
| + { 1, 1 },
|
| + { 4, 2 },
|
| + { 0, 4 }, // test for zero length on interval
|
| + };
|
| +
|
| + SkPaint paint;
|
| + paint.setStyle(SkPaint::kStroke_Style);
|
| +
|
| + canvas->translate(SkIntToScalar(20), SkIntToScalar(20));
|
| + canvas->translate(0, SK_ScalarHalf);
|
| +
|
| + for (int width = 0; width <= 2; ++width) {
|
| + for (size_t data = 0; data < SK_ARRAY_COUNT(gData); ++data) {
|
| + for (int aa = 0; aa <= 1; ++aa) {
|
| + for (int cap = 0; cap <= 1; ++cap) {
|
| + int w = width * width * width;
|
| + paint.setAntiAlias(SkToBool(aa));
|
| + paint.setStrokeWidth(SkIntToScalar(w));
|
| +
|
| + SkToBool(cap) ? paint.setStrokeCap(SkPaint::kSquare_Cap)
|
| + : paint.setStrokeCap(SkPaint::kRound_Cap);
|
| +
|
| + int scale = w ? w : 1;
|
| +
|
| + drawline(canvas, gData[data].fOnInterval * scale,
|
| + gData[data].fOffInterval * scale,
|
| + paint);
|
| + canvas->translate(0, SkIntToScalar(20));
|
| + }
|
| + }
|
| + }
|
| + }
|
| +
|
| + for (int aa = 0; aa <= 1; ++aa) {
|
| + paint.setAntiAlias(SkToBool(aa));
|
| + paint.setStrokeWidth(8.f);
|
| + paint.setStrokeCap(SkPaint::kSquare_Cap);
|
| +
|
| + // Single dash element that is cut off at start and end
|
| + drawline(canvas, 32.f, 16.f, paint, 20.f, 0, 5.f);
|
| + canvas->translate(0, SkIntToScalar(20));
|
| +
|
| + // Two dash elements where each one is cut off at beginning and end respectively
|
| + drawline(canvas, 32.f, 16.f, paint, 56.f, 0, 5.f);
|
| + canvas->translate(0, SkIntToScalar(20));
|
| +
|
| + // Many dash elements where first and last are cut off at beginning and end respectively
|
| + drawline(canvas, 32.f, 16.f, paint, 584.f, 0, 5.f);
|
| + canvas->translate(0, SkIntToScalar(20));
|
| +
|
| + // Diagonal dash line where src pnts are not axis aligned (as apposed to being diagonal from
|
| + // a canvas rotation)
|
| + drawline(canvas, 32.f, 16.f, paint, 600.f, 30.f);
|
| + canvas->translate(0, SkIntToScalar(20));
|
| +
|
| + // Case where only the off interval exists on the line. Thus nothing should be drawn
|
| + drawline(canvas, 32.f, 16.f, paint, 8.f, 0.f, 40.f);
|
| + canvas->translate(0, SkIntToScalar(20));
|
| + }
|
| + }
|
| +};
|
| +
|
| +//////////////////////////////////////////////////////////////////////////////
|
| +
|
| static skiagm::GM* F0(void*) { return new DashingGM; }
|
| static skiagm::GM* F1(void*) { return new Dashing2GM; }
|
| static skiagm::GM* F2(void*) { return new Dashing3GM; }
|
| +static skiagm::GM* F3(void*) { return new Dashing4GM; }
|
|
|
| static skiagm::GMRegistry gR0(F0);
|
| static skiagm::GMRegistry gR1(F1);
|
| static skiagm::GMRegistry gR2(F2);
|
| +static skiagm::GMRegistry gR3(F3);
|
|
|