1 #include "SampleCode.h"
2 #include "SkView.h"
3 #include "SkCanvas.h"
4 #include "SkGradientShader.h"
5 #include "SkPath.h"
6 #include "SkRegion.h"
7 #include "SkShader.h"
8 #include "SkUtils.h"
9 #include "SkComposeShader.h"
10 #include "Sk1DPathEffect.h"
11 #include "SkCornerPathEffect.h"
12 #include "SkPathMeasure.h"
13 #include "SkRandom.h"
14 #include "SkColorPriv.h"
15 #include "SkColorFilter.h"
16 #include "SkLayerRasterizer.h"
17
18 #include "SkParsePath.h"
testparse()19 static void testparse() {
20 SkRect r;
21 r.set(0, 0, SkFloatToScalar(10), SkFloatToScalar(10.5));
22 SkPath p, p2;
23 SkString str, str2;
24
25 p.addRect(r);
26 SkParsePath::ToSVGString(p, &str);
27 SkParsePath::FromSVGString(str.c_str(), &p2);
28 SkParsePath::ToSVGString(p2, &str2);
29 }
30
31 class ArcsView : public SampleView {
32 public:
ArcsView()33 ArcsView() {
34 testparse();
35 fSweep = SkIntToScalar(100);
36 this->setBGColor(0xFFDDDDDD);
37 }
38
39 protected:
40 // overrides from SkEventSink
onQuery(SkEvent * evt)41 virtual bool onQuery(SkEvent* evt) {
42 if (SampleCode::TitleQ(*evt)) {
43 SampleCode::TitleR(evt, "Arcs");
44 return true;
45 }
46 return this->INHERITED::onQuery(evt);
47 }
48
drawRectWithLines(SkCanvas * canvas,const SkRect & r,const SkPaint & p)49 static void drawRectWithLines(SkCanvas* canvas, const SkRect& r, const SkPaint& p) {
50 canvas->drawRect(r, p);
51 canvas->drawLine(r.fLeft, r.fTop, r.fRight, r.fBottom, p);
52 canvas->drawLine(r.fLeft, r.fBottom, r.fRight, r.fTop, p);
53 canvas->drawLine(r.fLeft, r.centerY(), r.fRight, r.centerY(), p);
54 canvas->drawLine(r.centerX(), r.fTop, r.centerX(), r.fBottom, p);
55 }
56
draw_label(SkCanvas * canvas,const SkRect & rect,int start,int sweep)57 static void draw_label(SkCanvas* canvas, const SkRect& rect,
58 int start, int sweep) {
59 SkPaint paint;
60
61 paint.setAntiAlias(true);
62 paint.setTextAlign(SkPaint::kCenter_Align);
63
64 SkString str;
65
66 str.appendS32(start);
67 str.append(", ");
68 str.appendS32(sweep);
69 canvas->drawText(str.c_str(), str.size(), rect.centerX(),
70 rect.fBottom + paint.getTextSize() * 5/4, paint);
71 }
72
drawArcs(SkCanvas * canvas)73 static void drawArcs(SkCanvas* canvas) {
74 SkPaint paint;
75 SkRect r;
76 SkScalar w = SkIntToScalar(75);
77 SkScalar h = SkIntToScalar(50);
78
79 r.set(0, 0, w, h);
80 paint.setAntiAlias(true);
81 paint.setStyle(SkPaint::kStroke_Style);
82
83 canvas->save();
84 canvas->translate(SkIntToScalar(10), SkIntToScalar(300));
85
86 paint.setStrokeWidth(SkIntToScalar(1));
87
88 static const int gAngles[] = {
89 0, 360,
90 0, 45,
91 0, -45,
92 720, 135,
93 -90, 269,
94 -90, 270,
95 -90, 271,
96 -180, -270,
97 225, 90
98 };
99
100 for (size_t i = 0; i < SK_ARRAY_COUNT(gAngles); i += 2) {
101 paint.setColor(SK_ColorBLACK);
102 drawRectWithLines(canvas, r, paint);
103
104 paint.setColor(SK_ColorRED);
105 canvas->drawArc(r, SkIntToScalar(gAngles[i]),
106 SkIntToScalar(gAngles[i+1]), false, paint);
107
108 draw_label(canvas, r, gAngles[i], gAngles[i+1]);
109
110 canvas->translate(w * 8 / 7, 0);
111 }
112
113 canvas->restore();
114 }
115
onDrawContent(SkCanvas * canvas)116 virtual void onDrawContent(SkCanvas* canvas) {
117 fSweep = SampleCode::GetAnimScalar(SkIntToScalar(360)/24,
118 SkIntToScalar(360));
119 // fSweep = SkFloatToScalar(359.99f);
120
121 SkRect r;
122 SkPaint paint;
123
124 paint.setAntiAlias(true);
125 paint.setStrokeWidth(SkIntToScalar(2));
126 paint.setStyle(SkPaint::kStroke_Style);
127
128 r.set(0, 0, SkIntToScalar(200), SkIntToScalar(200));
129 r.offset(SkIntToScalar(20), SkIntToScalar(20));
130
131 if (false) {
132 const SkScalar d = SkIntToScalar(3);
133 const SkScalar rad[] = { d, d, d, d, d, d, d, d };
134 SkPath path;
135 path.addRoundRect(r, rad);
136 canvas->drawPath(path, paint);
137 return;
138 }
139
140 drawRectWithLines(canvas, r, paint);
141
142 // printf("----- sweep %g %X\n", SkScalarToFloat(fSweep), SkDegreesToRadians(fSweep));
143
144
145 paint.setStyle(SkPaint::kFill_Style);
146 paint.setColor(0x800000FF);
147 canvas->drawArc(r, 0, fSweep, true, paint);
148
149 paint.setColor(0x800FF000);
150 canvas->drawArc(r, 0, fSweep, false, paint);
151
152 paint.setStyle(SkPaint::kStroke_Style);
153 paint.setColor(SK_ColorRED);
154 canvas->drawArc(r, 0, fSweep, true, paint);
155
156 paint.setStrokeWidth(0);
157 paint.setColor(SK_ColorBLUE);
158 canvas->drawArc(r, 0, fSweep, false, paint);
159
160 drawArcs(canvas);
161 this->inval(NULL);
162 }
163
onFindClickHandler(SkScalar x,SkScalar y)164 virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y) {
165 // fSweep += SK_Scalar1;
166 this->inval(NULL);
167 return this->INHERITED::onFindClickHandler(x, y);
168 }
169
onClick(Click * click)170 virtual bool onClick(Click* click) {
171 return this->INHERITED::onClick(click);
172 }
173
174 private:
175 SkScalar fSweep;
176
177 typedef SampleView INHERITED;
178 };
179
180 //////////////////////////////////////////////////////////////////////////////
181
MyFactory()182 static SkView* MyFactory() { return new ArcsView; }
183 static SkViewRegister reg(MyFactory);
184
185