blob: 2f0dc6ff25bf037b384b184ad9fe10f5493a2a3d [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001/*
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 */
reed@google.comad89fbd2011-04-11 13:57:34 +00007#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
15typedef SkScalar (*MakePathProc)(SkPath*);
16
17static 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
28static 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
40static 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
47static 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
54static 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;
rmistry@google.comae933ce2012-08-23 18:19:56 +000060
reed@google.comad89fbd2011-04-11 13:57:34 +000061 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
74static 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 + SkScalarMul(cosV, r), c + SkScalarMul(sinV, r));
86 }
87 path->close();
88 return r * 2 * 6 / 5;
89}
90
91static SkScalar make_star_5(SkPath* path) { return make_star(path, 5); }
92static SkScalar make_star_13(SkPath* path) { return make_star(path, 13); }
93
94static 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
reed@google.com03c2ef52011-05-25 20:13:06 +0000106class PathFillView : public SampleView {
reed@google.comad89fbd2011-04-11 13:57:34 +0000107 SkPath fPath[N];
108 SkScalar fDY[N];
109
110public:
111 PathFillView() {
112 for (size_t i = 0; i < N; i++) {
113 fDY[i] = gProcs[i](&fPath[i]);
114 }
reed@google.com03c2ef52011-05-25 20:13:06 +0000115 this->setBGColor(0xFFDDDDDD);
reed@google.comad89fbd2011-04-11 13:57:34 +0000116 }
117
118protected:
119 // overrides from SkEventSink
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
reed@google.com03c2ef52011-05-25 20:13:06 +0000128 virtual void onDrawContent(SkCanvas* canvas) {
reed@google.comad89fbd2011-04-11 13:57:34 +0000129 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
138private:
reed@google.com03c2ef52011-05-25 20:13:06 +0000139 typedef SampleView INHERITED;
reed@google.comad89fbd2011-04-11 13:57:34 +0000140};
141
142//////////////////////////////////////////////////////////////////////////////
143
144static SkView* MyFactory() { return new PathFillView; }
145static SkViewRegister reg(MyFactory);