SampleArc.cpp revision 7e76bff26e7c74902841ca4f607eb0b24a833a4a
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 "SkGradientShader.h"
12#include "SkPath.h"
13#include "SkRegion.h"
14#include "SkShader.h"
15#include "SkUtils.h"
16#include "SkComposeShader.h"
17#include "Sk1DPathEffect.h"
18#include "SkCornerPathEffect.h"
19#include "SkPathMeasure.h"
20#include "SkRandom.h"
21#include "SkColorPriv.h"
22#include "SkColorFilter.h"
23#include "SkLayerRasterizer.h"
24
25#include "SkCanvasDrawable.h"
26
27#include "SkParsePath.h"
28static void testparse() {
29    SkRect r;
30    r.set(0, 0, 10, 10.5f);
31    SkPath p, p2;
32    SkString str, str2;
33
34    p.addRect(r);
35    SkParsePath::ToSVGString(p, &str);
36    SkParsePath::FromSVGString(str.c_str(), &p2);
37    SkParsePath::ToSVGString(p2, &str2);
38}
39
40#include "SkPictureRecorder.h"
41static void test_pictbounds(SkCanvas* canvas) {
42    SkRect r = SkRect::MakeXYWH(100, 50, 100, 100);
43    SkPictureRecorder recorder;
44    {
45        SkCanvas* c = recorder.beginRecording(r, NULL, 0);
46        c->drawOval(r, SkPaint());
47
48        SkIRect ir;
49        c->getClipDeviceBounds(&ir);
50        SkDebugf("devbounds [%d %d %d %d]\n", ir.left(), ir.top(), ir.right(), ir.bottom());
51
52        SkASSERT(!c->quickReject(r));
53    }
54    SkPicture* pic = recorder.endRecording();
55
56    canvas->drawPicture(pic);
57    SkASSERT(pic->cullRect() == r);
58    pic->unref();
59}
60
61class ArcsView : public SampleView {
62    class MyDrawable : public SkCanvasDrawable {
63        SkRect   fR;
64        SkScalar fSweep;
65    public:
66        MyDrawable(const SkRect& r) : fR(r), fSweep(0) {
67        }
68
69        void setSweep(SkScalar sweep) {
70            if (fSweep != sweep) {
71                fSweep = sweep;
72                this->notifyDrawingChanged();
73            }
74        }
75
76        void onDraw(SkCanvas* canvas) SK_OVERRIDE {
77            SkPaint paint;
78            paint.setAntiAlias(true);
79            paint.setStrokeWidth(SkIntToScalar(2));
80
81            paint.setStyle(SkPaint::kFill_Style);
82            paint.setColor(0x800000FF);
83            canvas->drawArc(fR, 0, fSweep, true, paint);
84
85            paint.setColor(0x800FF000);
86            canvas->drawArc(fR, 0, fSweep, false, paint);
87
88            paint.setStyle(SkPaint::kStroke_Style);
89            paint.setColor(SK_ColorRED);
90            canvas->drawArc(fR, 0, fSweep, true, paint);
91
92            paint.setStrokeWidth(0);
93            paint.setColor(SK_ColorBLUE);
94            canvas->drawArc(fR, 0, fSweep, false, paint);
95        }
96
97        SkRect onGetBounds() SK_OVERRIDE {
98            SkRect r(fR);
99            r.outset(2, 2);
100            return r;
101        }
102    };
103
104public:
105    SkRect fRect;
106    MyDrawable* fDrawable;
107
108    ArcsView() {
109        testparse();
110        fSweep = SkIntToScalar(100);
111        this->setBGColor(0xFFDDDDDD);
112
113        fRect.set(0, 0, SkIntToScalar(200), SkIntToScalar(200));
114        fRect.offset(SkIntToScalar(20), SkIntToScalar(20));
115        fDrawable = SkNEW_ARGS(MyDrawable, (fRect));
116    }
117
118    virtual ~ArcsView() SK_OVERRIDE {
119        fDrawable->unref();
120    }
121
122protected:
123    // overrides from SkEventSink
124    virtual bool onQuery(SkEvent* evt) {
125        if (SampleCode::TitleQ(*evt)) {
126            SampleCode::TitleR(evt, "Arcs");
127            return true;
128        }
129        return this->INHERITED::onQuery(evt);
130    }
131
132    static void drawRectWithLines(SkCanvas* canvas, const SkRect& r, const SkPaint& p) {
133        canvas->drawRect(r, p);
134        canvas->drawLine(r.fLeft, r.fTop, r.fRight, r.fBottom, p);
135        canvas->drawLine(r.fLeft, r.fBottom, r.fRight, r.fTop, p);
136        canvas->drawLine(r.fLeft, r.centerY(), r.fRight, r.centerY(), p);
137        canvas->drawLine(r.centerX(), r.fTop, r.centerX(), r.fBottom, p);
138    }
139
140    static void draw_label(SkCanvas* canvas, const SkRect& rect,
141                            int start, int sweep) {
142        SkPaint paint;
143
144        paint.setAntiAlias(true);
145        paint.setTextAlign(SkPaint::kCenter_Align);
146
147        SkString    str;
148
149        str.appendS32(start);
150        str.append(", ");
151        str.appendS32(sweep);
152        canvas->drawText(str.c_str(), str.size(), rect.centerX(),
153                         rect.fBottom + paint.getTextSize() * 5/4, paint);
154    }
155
156    static void drawArcs(SkCanvas* canvas) {
157        SkPaint paint;
158        SkRect  r;
159        SkScalar w = SkIntToScalar(75);
160        SkScalar h = SkIntToScalar(50);
161
162        r.set(0, 0, w, h);
163        paint.setAntiAlias(true);
164        paint.setStyle(SkPaint::kStroke_Style);
165
166        canvas->save();
167        canvas->translate(SkIntToScalar(10), SkIntToScalar(300));
168
169        paint.setStrokeWidth(SkIntToScalar(1));
170
171        static const int gAngles[] = {
172            0, 360,
173            0, 45,
174            0, -45,
175            720, 135,
176            -90, 269,
177            -90, 270,
178            -90, 271,
179            -180, -270,
180            225, 90
181        };
182
183        for (size_t i = 0; i < SK_ARRAY_COUNT(gAngles); i += 2) {
184            paint.setColor(SK_ColorBLACK);
185            drawRectWithLines(canvas, r, paint);
186
187            paint.setColor(SK_ColorRED);
188            canvas->drawArc(r, SkIntToScalar(gAngles[i]),
189                            SkIntToScalar(gAngles[i+1]), false, paint);
190
191            draw_label(canvas, r, gAngles[i], gAngles[i+1]);
192
193            canvas->translate(w * 8 / 7, 0);
194        }
195
196        canvas->restore();
197    }
198
199    virtual void onDrawContent(SkCanvas* canvas) {
200        if (true) { test_pictbounds(canvas); return; }
201
202        fDrawable->setSweep(SampleCode::GetAnimScalar(SkIntToScalar(360)/24,
203                                                      SkIntToScalar(360)));
204
205        SkPaint paint;
206        paint.setAntiAlias(true);
207        paint.setStrokeWidth(SkIntToScalar(2));
208        paint.setStyle(SkPaint::kStroke_Style);
209
210        drawRectWithLines(canvas, fRect, paint);
211
212        canvas->EXPERIMENTAL_drawDrawable(fDrawable);
213
214        drawArcs(canvas);
215        this->inval(NULL);
216    }
217
218    virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y,
219                                              unsigned modi) {
220     //   fSweep += SK_Scalar1;
221        this->inval(NULL);
222        return this->INHERITED::onFindClickHandler(x, y, modi);
223    }
224
225    virtual bool onClick(Click* click) {
226        return this->INHERITED::onClick(click);
227    }
228
229private:
230    SkScalar fSweep;
231
232    typedef SampleView INHERITED;
233};
234
235//////////////////////////////////////////////////////////////////////////////
236
237static SkView* MyFactory() { return new ArcsView; }
238static SkViewRegister reg(MyFactory);
239