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 "SkBlurDrawLooper.h"
14#include "SkGradientShader.h"
15
16typedef SkScalar (*MakePathProc)(SkPath*);
17
18static SkScalar make_frame(SkPath* path) {
19    SkRect r = { 10, 10, 630, 470 };
20    path->addRoundRect(r, 15, 15);
21
22    SkPaint paint;
23    paint.setStyle(SkPaint::kStroke_Style);
24    paint.setStrokeWidth(5);
25    paint.getFillPath(*path, path);
26    return 15;
27}
28
29static SkScalar make_triangle(SkPath* path) {
30    static const int gCoord[] = {
31        10, 20, 15, 5, 30, 30
32    };
33    path->moveTo(SkIntToScalar(gCoord[0]), SkIntToScalar(gCoord[1]));
34    path->lineTo(SkIntToScalar(gCoord[2]), SkIntToScalar(gCoord[3]));
35    path->lineTo(SkIntToScalar(gCoord[4]), SkIntToScalar(gCoord[5]));
36    path->close();
37    path->offset(10, 0);
38    return SkIntToScalar(30);
39}
40
41static SkScalar make_rect(SkPath* path) {
42    SkRect r = { 10, 10, 30, 30 };
43    path->addRect(r);
44    path->offset(10, 0);
45    return SkIntToScalar(30);
46}
47
48static SkScalar make_oval(SkPath* path) {
49    SkRect r = { 10, 10, 30, 30 };
50    path->addOval(r);
51    path->offset(10, 0);
52    return SkIntToScalar(30);
53}
54
55static SkScalar make_sawtooth(SkPath* path) {
56    SkScalar x = SkIntToScalar(20);
57    SkScalar y = SkIntToScalar(20);
58    const SkScalar x0 = x;
59    const SkScalar dx = SK_Scalar1 * 5;
60    const SkScalar dy = SK_Scalar1 * 10;
61
62    path->moveTo(x, y);
63    for (int i = 0; i < 32; i++) {
64        x += dx;
65        path->lineTo(x, y - dy);
66        x += dx;
67        path->lineTo(x, y + dy);
68    }
69    path->lineTo(x, y + 2 * dy);
70    path->lineTo(x0, y + 2 * dy);
71    path->close();
72    return SkIntToScalar(30);
73}
74
75static SkScalar make_star(SkPath* path, int n) {
76    const SkScalar c = SkIntToScalar(45);
77    const SkScalar r = SkIntToScalar(20);
78
79    SkScalar rad = -SK_ScalarPI / 2;
80    const SkScalar drad = (n >> 1) * SK_ScalarPI * 2 / n;
81
82    path->moveTo(c, c - r);
83    for (int i = 1; i < n; i++) {
84        rad += drad;
85        SkScalar cosV, sinV = SkScalarSinCos(rad, &cosV);
86        path->lineTo(c + SkScalarMul(cosV, r), c + SkScalarMul(sinV, r));
87    }
88    path->close();
89    return r * 2 * 6 / 5;
90}
91
92static SkScalar make_star_5(SkPath* path) { return make_star(path, 5); }
93static SkScalar make_star_13(SkPath* path) { return make_star(path, 13); }
94
95static const MakePathProc gProcs[] = {
96    make_frame,
97    make_triangle,
98    make_rect,
99    make_oval,
100    make_sawtooth,
101    make_star_5,
102    make_star_13
103};
104
105#define N   SK_ARRAY_COUNT(gProcs)
106
107class PathFillView : public SampleView {
108    SkPath  fPath[N];
109    SkScalar fDY[N];
110
111public:
112    PathFillView() {
113        for (size_t i = 0; i < N; i++) {
114            fDY[i] = gProcs[i](&fPath[i]);
115        }
116        this->setBGColor(0xFFDDDDDD);
117    }
118
119protected:
120    // overrides from SkEventSink
121    virtual bool onQuery(SkEvent* evt) {
122        if (SampleCode::TitleQ(*evt)) {
123            SampleCode::TitleR(evt, "PathFill");
124            return true;
125        }
126        return this->INHERITED::onQuery(evt);
127    }
128
129    virtual void onDrawContent(SkCanvas* canvas) {
130        SkPaint paint;
131        paint.setAntiAlias(true);
132
133        for (size_t i = 0; i < N; i++) {
134            canvas->drawPath(fPath[i], paint);
135            canvas->translate(0, fDY[i]);
136        }
137    }
138
139private:
140    typedef SampleView INHERITED;
141};
142
143//////////////////////////////////////////////////////////////////////////////
144
145static SkView* MyFactory() { return new PathFillView; }
146static SkViewRegister reg(MyFactory);
147