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