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