1
2/*
3 * Copyright 2011 Google Inc.
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
8#include "SampleCode.h"
9#include "SkView.h"
10#include "SkCanvas.h"
11#include "SkGraphics.h"
12#include "SkRandom.h"
13#include "SkDashPathEffect.h"
14#include "SkShader.h"
15
16static void setBitmapDash(SkPaint* paint, int width) {
17    SkColor c = paint->getColor();
18
19    SkBitmap bm;
20    bm.setConfig(SkBitmap::kARGB_8888_Config, 2, 1);
21    bm.allocPixels();
22    bm.lockPixels();
23    *bm.getAddr32(0, 0) = SkPreMultiplyARGB(0xFF, SkColorGetR(c),
24                                            SkColorGetG(c), SkColorGetB(c));
25    *bm.getAddr32(1, 0) = 0;
26    bm.unlockPixels();
27
28    SkMatrix matrix;
29    matrix.setScale(SkIntToScalar(width), SK_Scalar1);
30
31    SkShader* s = SkShader::CreateBitmapShader(bm, SkShader::kRepeat_TileMode,
32                                               SkShader::kClamp_TileMode);
33    s->setLocalMatrix(matrix);
34
35    paint->setShader(s)->unref();
36}
37
38class DashView : public SampleView {
39public:
40    DashView() {
41        this->setBGColor(0xFFDDDDDD);
42    }
43
44protected:
45    // overrides from SkEventSink
46    virtual bool onQuery(SkEvent* evt) {
47        if (SampleCode::TitleQ(*evt)) {
48            SampleCode::TitleR(evt, "Dash");
49            return true;
50        }
51        return this->INHERITED::onQuery(evt);
52    }
53
54    virtual void onDrawContent(SkCanvas* canvas) {
55        static const char* gStr[] = {
56            "11",
57            "44",
58            "112233",
59            "411327463524",
60        };
61
62        SkPaint paint;
63        paint.setStrokeWidth(SkIntToScalar(1));
64
65        SkScalar x0 = SkIntToScalar(10);
66        SkScalar y0 = SkIntToScalar(10);
67        SkScalar x1 = x0 + SkIntToScalar(1000);
68        for (size_t i = 0; i < SK_ARRAY_COUNT(gStr); i++) {
69            SkScalar interval[12];
70            size_t len = SkMin32(strlen(gStr[i]), SK_ARRAY_COUNT(interval));
71            for (size_t j = 0; j < len; j++) {
72                interval[j] = SkIntToScalar(gStr[i][j] - '0');
73            }
74
75            SkDashPathEffect dash(interval, len, 0);
76            paint.setPathEffect(&dash);
77            canvas->drawLine(x0, y0, x1, y0, paint);
78            paint.setPathEffect(NULL);
79
80            y0 += paint.getStrokeWidth() * 3;
81        }
82
83        setBitmapDash(&paint, 3);
84        canvas->drawLine(x0, y0, x1, y0, paint);
85    }
86
87private:
88    typedef SampleView INHERITED;
89};
90
91//////////////////////////////////////////////////////////////////////////////
92
93static SkView* MyFactory() { return new DashView; }
94static SkViewRegister reg(MyFactory);
95
96