1b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org/*
2b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org * Copyright 2012 Google Inc.
3b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org *
4b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org * Use of this source code is governed by a BSD-style license that can be
5b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org * found in the LICENSE file.
6b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org */
7b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org
8b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org#include "SampleCode.h"
9b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org#include "SkView.h"
10b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org#include "SkCanvas.h"
11b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org#include "SkRandom.h"
1261490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org#include "SkRRect.h"
1361490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org#include "SkColorPriv.h"
14b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org
15b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.orgstatic void rotateAbout(SkCanvas* canvas, SkScalar degrees,
16b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org                        SkScalar cx, SkScalar cy) {
17b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org    canvas->translate(cx, cy);
18b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org    canvas->rotate(degrees);
19b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org    canvas->translate(-cx, -cy);
20b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org}
21b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org
22b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.orgclass RotateCirclesView : public SampleView {
23b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.orgpublic:
24b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org    RotateCirclesView() {
25b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org        this->setBGColor(SK_ColorLTGRAY);
2615ed90f6ee939055ce6e2e1ace0292e7c3d9cbfcskia.committer@gmail.com
27b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org        fAngle = 0;
28b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org    }
29b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org
30b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.orgprotected:
31b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org    // overrides from SkEventSink
32b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org    virtual bool onQuery(SkEvent* evt) {
33b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org        if (SampleCode::TitleQ(*evt)) {
34b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org            SampleCode::TitleR(evt, "RotateCircles");
35b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org            return true;
36b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org        }
37b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org        return this->INHERITED::onQuery(evt);
38b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org    }
39b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org
40b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org    virtual void onDrawContent(SkCanvas* canvas) {
41e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org        SkRandom rand;
42b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org        SkPaint paint;
43b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org        paint.setAntiAlias(true);
44b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org        paint.setStrokeWidth(20);
45b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org
46b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org        SkScalar cx = 240;
47b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org        SkScalar cy = 240;
48b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org        SkScalar DX = 240 * 2;
49b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org        SkColor color = 0;
50b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org
51b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org        float scale = 1;
52b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org        float sign = 0.3f;
53b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org        for (SkScalar rad = 200; rad >= 20; rad -= 15) {
54b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org            sign = -sign;
55b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org            scale += 0.2f;
56b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org
57b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org            paint.setColor(rand.nextU());
58b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org            paint.setAlpha(0xFF);
59b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org            color = ~color;
6015ed90f6ee939055ce6e2e1ace0292e7c3d9cbfcskia.committer@gmail.com
61b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org            paint.setStyle(SkPaint::kFill_Style);
62b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org
63b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org            canvas->save();
64b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org            rotateAbout(canvas, fAngle * scale * sign, cx, cy);
65b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org            canvas->drawCircle(cx, cy, rad, paint);
66b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org            canvas->restore();
67b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org
68b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org            paint.setStyle(SkPaint::kStroke_Style);
69b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org            paint.setStrokeWidth(rad*2);
702157983513e45613431d5e13f2be3b6aacaf757cskia.committer@gmail.com
71b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org            canvas->save();
72b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org            rotateAbout(canvas, fAngle * scale * sign, cx + DX, cy);
73b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org            canvas->drawCircle(cx + DX, cy, 10, paint);
74b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org            canvas->restore();
7515ed90f6ee939055ce6e2e1ace0292e7c3d9cbfcskia.committer@gmail.com
7661490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org            canvas->save();
7761490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org            rotateAbout(canvas, fAngle * scale * sign, cx + DX, cy + DX);
7861490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org            canvas->drawCircle(cx + DX, cy + DX, 10, paint);
7961490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org            canvas->restore();
802157983513e45613431d5e13f2be3b6aacaf757cskia.committer@gmail.com
81b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org        }
8215ed90f6ee939055ce6e2e1ace0292e7c3d9cbfcskia.committer@gmail.com
83b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org        fAngle = (fAngle + 1) % 360;
84b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org        this->inval(NULL);
85b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org    }
86b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org
87b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.orgprivate:
88b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org    int fAngle;
89b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org    typedef SkView INHERITED;
90b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org};
91b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.org
9261490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.orgclass TestCirclesView : public SampleView {
9361490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.orgpublic:
9461490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org    TestCirclesView() {
9561490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org    }
962157983513e45613431d5e13f2be3b6aacaf757cskia.committer@gmail.com
9761490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.orgprotected:
9861490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org    virtual bool onQuery(SkEvent* evt) SK_OVERRIDE {
9961490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        if (SampleCode::TitleQ(*evt)) {
10061490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org            SampleCode::TitleR(evt, "RotateCircles2");
10161490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org            return true;
10261490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        }
10361490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        return this->INHERITED::onQuery(evt);
10461490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org    }
10561490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org
10661490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org    void draw_real_circle(SkCanvas* canvas, SkScalar radius) {
10761490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        int w = SkScalarCeilToInt(radius * 2);
10861490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        int h = w;
1092157983513e45613431d5e13f2be3b6aacaf757cskia.committer@gmail.com
11061490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        SkBitmap bm;
111a8c183125f2861067daf432cada06d431a795cd0commit-bot@chromium.org        bm.allocN32Pixels(w, h);
11261490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        bm.eraseColor(0);
1132157983513e45613431d5e13f2be3b6aacaf757cskia.committer@gmail.com
11461490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        SkAutoLockPixels alp(bm);
11561490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org
11661490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        SkScalar cx = radius;
11761490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        SkScalar cy = radius;
11861490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        for (int y = 0; y < h; y += 1) {
11961490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org            for (int x = 0; x < w; x += 1) {
12061490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org                float d = sqrtf((x - cx)*(x - cx) + (y - cy)*(y - cy));
12161490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org                if (d <= radius) {
12261490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org                    *bm.getAddr32(x, y) = SkPackARGB32(0xFF, 0, 0, 0);
12361490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org                }
12461490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org            }
12561490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        }
1262157983513e45613431d5e13f2be3b6aacaf757cskia.committer@gmail.com
12761490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        canvas->drawBitmap(bm, 0, 0, NULL);
12861490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org    }
12961490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org
13061490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org    virtual void onDrawContent(SkCanvas* canvas) {
13161490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        SkScalar radius = 256;
13261490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        canvas->translate(10, 10);
13361490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org
13461490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        draw_real_circle(canvas, radius);
1352157983513e45613431d5e13f2be3b6aacaf757cskia.committer@gmail.com
13661490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        SkPaint paint;
13761490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        paint.setAntiAlias(true);
13861490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org
13961490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        paint.setColor(0x80FF0000);
14061490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        canvas->drawCircle(radius, radius, radius, paint);
14161490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org
14261490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        paint.setStyle(SkPaint::kStroke_Style);
14361490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        paint.setStrokeWidth(radius);
14461490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        paint.setColor(0x8000FF00);
14561490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        canvas->drawCircle(radius, radius, radius/2, paint);
14661490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org    }
1472157983513e45613431d5e13f2be3b6aacaf757cskia.committer@gmail.com
14861490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.orgprivate:
14961490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org    typedef SkView INHERITED;
15061490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org};
15161490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org
15261490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.orgstatic bool hittest(const SkPoint& target, SkScalar x, SkScalar y) {
15361490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org    const SkScalar TOL = 7;
15461490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org    return SkPoint::Distance(target, SkPoint::Make(x, y)) <= TOL;
15561490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org}
15661490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org
15761490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.orgstatic int getOnCurvePoints(const SkPath& path, SkPoint storage[]) {
15861490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org    SkPath::RawIter iter(path);
15961490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org    SkPoint pts[4];
16061490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org    SkPath::Verb verb;
16161490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org
16261490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org    int count = 0;
16361490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org    while ((verb = iter.next(pts)) != SkPath::kDone_Verb) {
16461490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        switch (verb) {
16561490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org            case SkPath::kMove_Verb:
16661490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org            case SkPath::kLine_Verb:
16761490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org            case SkPath::kQuad_Verb:
16861490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org            case SkPath::kCubic_Verb:
16961490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org                storage[count++] = pts[0];
17061490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org                break;
17161490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org            default:
17261490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org                break;
17361490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        }
17461490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org    }
17561490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org    return count;
17661490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org}
17761490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org
17861490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org#include "SkPathMeasure.h"
17961490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org
18061490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.orgclass TestStrokeView : public SampleView {
18161490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org    enum {
18261490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        SKELETON_COLOR = 0xFF0000FF,
18361490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        WIREFRAME_COLOR = 0x80FF0000
18461490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org    };
18561490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org
18661490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org    enum {
18761490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        kCount = 9
18861490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org    };
18961490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org    SkPoint fPts[kCount];
19061490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org    SkScalar fWidth, fDWidth;
19161490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.orgpublic:
19261490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org    TestStrokeView() {
19361490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        this->setBGColor(SK_ColorLTGRAY);
19461490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org
19561490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        fPts[0].set(50, 200);
19661490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        fPts[1].set(50, 100);
19761490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        fPts[2].set(150, 50);
19861490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        fPts[3].set(300, 50);
1992157983513e45613431d5e13f2be3b6aacaf757cskia.committer@gmail.com
20061490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        fPts[4].set(350, 200);
20161490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        fPts[5].set(350, 100);
20261490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        fPts[6].set(450, 50);
2032157983513e45613431d5e13f2be3b6aacaf757cskia.committer@gmail.com
20461490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        fPts[7].set(200, 200);
20561490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        fPts[8].set(400, 400);
2062157983513e45613431d5e13f2be3b6aacaf757cskia.committer@gmail.com
20761490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        fWidth = 50;
20861490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        fDWidth = 0.25f;
20961490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org    }
2102157983513e45613431d5e13f2be3b6aacaf757cskia.committer@gmail.com
21161490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.orgprotected:
21261490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org    virtual bool onQuery(SkEvent* evt) SK_OVERRIDE {
21361490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        if (SampleCode::TitleQ(*evt)) {
21461490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org            SampleCode::TitleR(evt, "RotateCircles3");
21561490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org            return true;
21661490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        }
21761490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        return this->INHERITED::onQuery(evt);
21861490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org    }
21961490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org
22061490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org    void draw_points(SkCanvas* canvas, const SkPath& path, SkColor color,
22161490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org                     bool show_lines) {
22261490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        SkPaint paint;
22361490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        paint.setColor(color);
22461490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        paint.setAlpha(0x80);
2252157983513e45613431d5e13f2be3b6aacaf757cskia.committer@gmail.com
22661490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        int n = path.countPoints();
22761490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        SkAutoSTArray<32, SkPoint> pts(n);
22861490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        if (show_lines) {
22961490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org            path.getPoints(pts.get(), n);
23061490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org            canvas->drawPoints(SkCanvas::kPolygon_PointMode, n, pts.get(), paint);
23161490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        } else {
23261490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org            n = getOnCurvePoints(path, pts.get());
23361490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        }
23461490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        paint.setStrokeWidth(5);
23561490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        canvas->drawPoints(SkCanvas::kPoints_PointMode, n, pts.get(), paint);
23661490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org    }
23761490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org
23861490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org    void draw_ribs(SkCanvas* canvas, const SkPath& path, SkScalar width,
23961490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org                   SkColor color) {
24061490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        const SkScalar radius = width / 2;
24161490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org
24261490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        SkPathMeasure meas(path, false);
24361490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        SkScalar total = meas.getLength();
2442157983513e45613431d5e13f2be3b6aacaf757cskia.committer@gmail.com
24561490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        SkScalar delta = 8;
24661490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        SkPaint paint;
24761490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        paint.setColor(color);
24861490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org
24961490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        SkPoint pos, tan;
25061490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        for (SkScalar dist = 0; dist <= total; dist += delta) {
251140d7286c5a40058932696eaa28818c313bd2ddfreed@google.com            if (meas.getPosTan(dist, &pos, &tan)) {
252140d7286c5a40058932696eaa28818c313bd2ddfreed@google.com                tan.scale(radius);
253140d7286c5a40058932696eaa28818c313bd2ddfreed@google.com                tan.rotateCCW();
254140d7286c5a40058932696eaa28818c313bd2ddfreed@google.com                canvas->drawLine(pos.x() + tan.x(), pos.y() + tan.y(),
255140d7286c5a40058932696eaa28818c313bd2ddfreed@google.com                                 pos.x() - tan.x(), pos.y() - tan.y(), paint);
256140d7286c5a40058932696eaa28818c313bd2ddfreed@google.com            }
25761490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        }
25861490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org    }
25961490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org
26061490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org    void draw_stroke(SkCanvas* canvas, const SkPath& path, SkScalar width) {
26161490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        SkPaint paint;
26261490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        paint.setAntiAlias(true);
26361490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        paint.setStyle(SkPaint::kStroke_Style);
26461490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org
26561490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        paint.setColor(SKELETON_COLOR);
26661490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        canvas->drawPath(path, paint);
26761490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        draw_points(canvas, path, SKELETON_COLOR, true);
26861490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org
26961490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        draw_ribs(canvas, path, width, 0xFF00FF00);
27061490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org
27161490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        SkPath fill;
27261490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org
27361490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        SkPaint p;
27461490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        p.setStyle(SkPaint::kStroke_Style);
27561490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        p.setStrokeWidth(width);
27661490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        p.getFillPath(path, &fill);
27761490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org
27861490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        paint.setColor(WIREFRAME_COLOR);
27961490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        canvas->drawPath(fill, paint);
28061490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        draw_points(canvas, fill, WIREFRAME_COLOR, false);
28161490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org    }
28261490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org
28361490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org    virtual void onDrawContent(SkCanvas* canvas) {
28461490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        SkPath path;
28561490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        SkScalar width = fWidth;
2862157983513e45613431d5e13f2be3b6aacaf757cskia.committer@gmail.com
28761490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        path.moveTo(fPts[0]);
28861490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        path.cubicTo(fPts[1], fPts[2], fPts[3]);
28961490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        draw_stroke(canvas, path, width);
29061490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org
29161490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        path.reset();
29261490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        path.moveTo(fPts[4]);
29361490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        path.quadTo(fPts[5], fPts[6]);
29461490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        draw_stroke(canvas, path, width);
29561490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org
29661490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        SkScalar rad = 32;
29761490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        SkRect r;
29861490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        r.set(&fPts[7], 2);
29961490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        path.reset();
30061490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        SkRRect rr;
30161490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        rr.setRectXY(r, rad, rad);
30261490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        path.addRRect(rr);
30361490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        draw_stroke(canvas, path, width);
3042157983513e45613431d5e13f2be3b6aacaf757cskia.committer@gmail.com
30561490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        path.reset();
30661490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        SkRRect rr2;
30761490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        rr.inset(width/2, width/2, &rr2);
30861490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        path.addRRect(rr2, SkPath::kCCW_Direction);
30961490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        rr.inset(-width/2, -width/2, &rr2);
31061490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        path.addRRect(rr2, SkPath::kCW_Direction);
31161490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        SkPaint paint;
31261490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        paint.setAntiAlias(true);
31361490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        paint.setColor(0x40FF8844);
31461490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        canvas->drawPath(path, paint);
3152157983513e45613431d5e13f2be3b6aacaf757cskia.committer@gmail.com
31661490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        fWidth += fDWidth;
31761490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        if (fDWidth > 0 && fWidth > 100) {
31861490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org            fDWidth = -fDWidth;
31961490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        } else if (fDWidth < 0 && fWidth < 10) {
32061490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org            fDWidth = -fDWidth;
32161490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        }
32261490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        this->inval(NULL);
32361490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org    }
32461490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org
32561490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org    class MyClick : public Click {
32661490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org    public:
32761490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        int fIndex;
32861490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        MyClick(SkView* target, int index) : Click(target), fIndex(index) {}
32961490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org    };
33061490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org
3314d5c26de0a24f86c37c1da8b0e30d11a550ea67breed@google.com    virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y,
3324d5c26de0a24f86c37c1da8b0e30d11a550ea67breed@google.com                                              unsigned modi) SK_OVERRIDE {
33361490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        for (size_t i = 0; i < SK_ARRAY_COUNT(fPts); ++i) {
33461490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org            if (hittest(fPts[i], x, y)) {
3357fa2a65c0cfc714364490cb715171461143024e0reed@google.com                return new MyClick(this, (int)i);
33661490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org            }
33761490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        }
3384d5c26de0a24f86c37c1da8b0e30d11a550ea67breed@google.com        return this->INHERITED::onFindClickHandler(x, y, modi);
33961490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org    }
3402157983513e45613431d5e13f2be3b6aacaf757cskia.committer@gmail.com
34161490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org    virtual bool onClick(Click* click) {
34261490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        int index = ((MyClick*)click)->fIndex;
3439c81bd5540119b61756239a540216b108c11b6c5jvanverth@google.com        fPts[index].offset(SkIntToScalar(click->fICurr.fX - click->fIPrev.fX),
3449c81bd5540119b61756239a540216b108c11b6c5jvanverth@google.com                           SkIntToScalar(click->fICurr.fY - click->fIPrev.fY));
34561490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        this->inval(NULL);
34661490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org        return true;
34761490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org    }
34861490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org
34961490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.orgprivate:
35061490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org    typedef SkView INHERITED;
35161490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org};
35261490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org
35361490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org///////////////////////////////////////////////////////////////////////////////
35461490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.org
355b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.orgstatic SkView* F0() { return new RotateCirclesView; }
356b56370930867d157ee49a6a9f2f5f58fe5145559mike@reedtribe.orgstatic SkViewRegister gR0(F0);
35761490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.orgstatic SkView* F1() { return new TestCirclesView; }
35861490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.orgstatic SkViewRegister gR1(F1);
35961490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.orgstatic SkView* F2() { return new TestStrokeView; }
36061490fa4d20f44e049d8252a9e11d80626b608d2mike@reedtribe.orgstatic SkViewRegister gR2(F2);
361