blob: 71a45e407012d26166a8660bb85760ee1427dab7 [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001
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 */
reed@google.comc2807002011-04-11 13:57:04 +00008#include "gm.h"
9#include "SkPicture.h"
10#include "SkRectShape.h"
11#include "SkGroupShape.h"
12
13typedef SkScalar (*MakePathProc)(SkPath*);
14
15static SkScalar make_frame(SkPath* path) {
bungeman@google.com3c14d0f2011-05-20 14:05:03 +000016 SkRect r = { SkIntToScalar(10), SkIntToScalar(10),
17 SkIntToScalar(630), SkIntToScalar(470) };
18 path->addRoundRect(r, SkIntToScalar(15), SkIntToScalar(15));
reed@google.comc2807002011-04-11 13:57:04 +000019
20 SkPaint paint;
21 paint.setStyle(SkPaint::kStroke_Style);
bungeman@google.com3c14d0f2011-05-20 14:05:03 +000022 paint.setStrokeWidth(SkIntToScalar(5));
reed@google.comc2807002011-04-11 13:57:04 +000023 paint.getFillPath(*path, path);
bungeman@google.com3c14d0f2011-05-20 14:05:03 +000024 return SkIntToScalar(15);
reed@google.comc2807002011-04-11 13:57:04 +000025}
26
27static SkScalar make_triangle(SkPath* path) {
28 static const int gCoord[] = {
29 10, 20, 15, 5, 30, 30
30 };
31 path->moveTo(SkIntToScalar(gCoord[0]), SkIntToScalar(gCoord[1]));
32 path->lineTo(SkIntToScalar(gCoord[2]), SkIntToScalar(gCoord[3]));
33 path->lineTo(SkIntToScalar(gCoord[4]), SkIntToScalar(gCoord[5]));
34 path->close();
bungeman@google.com3c14d0f2011-05-20 14:05:03 +000035 path->offset(SkIntToScalar(10), SkIntToScalar(0));
reed@google.comc2807002011-04-11 13:57:04 +000036 return SkIntToScalar(30);
37}
38
39static SkScalar make_rect(SkPath* path) {
bungeman@google.com3c14d0f2011-05-20 14:05:03 +000040 SkRect r = { SkIntToScalar(10), SkIntToScalar(10),
41 SkIntToScalar(30), SkIntToScalar(30) };
reed@google.comc2807002011-04-11 13:57:04 +000042 path->addRect(r);
bungeman@google.com3c14d0f2011-05-20 14:05:03 +000043 path->offset(SkIntToScalar(10), SkIntToScalar(0));
reed@google.comc2807002011-04-11 13:57:04 +000044 return SkIntToScalar(30);
45}
46
47static SkScalar make_oval(SkPath* path) {
bungeman@google.com3c14d0f2011-05-20 14:05:03 +000048 SkRect r = { SkIntToScalar(10), SkIntToScalar(10),
49 SkIntToScalar(30), SkIntToScalar(30) };
reed@google.comc2807002011-04-11 13:57:04 +000050 path->addOval(r);
bungeman@google.com3c14d0f2011-05-20 14:05:03 +000051 path->offset(SkIntToScalar(10), SkIntToScalar(0));
reed@google.comc2807002011-04-11 13:57:04 +000052 return SkIntToScalar(30);
53}
54
55static SkScalar make_sawtooth(SkPath* path) {
56 SkScalar x = SkIntToScalar(20);
57 SkScalar y = SkIntToScalar(20);
58 const SkScalar x0 = x;
59 const SkScalar dx = SK_Scalar1 * 5;
60 const SkScalar dy = SK_Scalar1 * 10;
61
62 path->moveTo(x, y);
63 for (int i = 0; i < 32; i++) {
64 x += dx;
65 path->lineTo(x, y - dy);
66 x += dx;
67 path->lineTo(x, y + dy);
68 }
bungeman@google.com3c14d0f2011-05-20 14:05:03 +000069 path->lineTo(x, y + (2 * dy));
70 path->lineTo(x0, y + (2 * dy));
reed@google.comc2807002011-04-11 13:57:04 +000071 path->close();
72 return SkIntToScalar(30);
73}
74
75static SkScalar make_star(SkPath* path, int n) {
76 const SkScalar c = SkIntToScalar(45);
77 const SkScalar r = SkIntToScalar(20);
78
79 SkScalar rad = -SK_ScalarPI / 2;
80 const SkScalar drad = (n >> 1) * SK_ScalarPI * 2 / n;
81
82 path->moveTo(c, c - r);
83 for (int i = 1; i < n; i++) {
84 rad += drad;
85 SkScalar cosV, sinV = SkScalarSinCos(rad, &cosV);
86 path->lineTo(c + SkScalarMul(cosV, r), c + SkScalarMul(sinV, r));
87 }
88 path->close();
89 return r * 2 * 6 / 5;
90}
91
92static SkScalar make_star_5(SkPath* path) { return make_star(path, 5); }
93static SkScalar make_star_13(SkPath* path) { return make_star(path, 13); }
94
95static const MakePathProc gProcs[] = {
96 make_frame,
97 make_triangle,
98 make_rect,
99 make_oval,
100 make_sawtooth,
101 make_star_5,
102 make_star_13
103};
104
105#define N SK_ARRAY_COUNT(gProcs)
106
107namespace skiagm {
108
109class PathFillGM : public GM {
110 SkPath fPath[N];
111 SkScalar fDY[N];
112public:
bungeman@google.com3c14d0f2011-05-20 14:05:03 +0000113 PathFillGM() {
reed@google.comc2807002011-04-11 13:57:04 +0000114 for (size_t i = 0; i < N; i++) {
115 fDY[i] = gProcs[i](&fPath[i]);
116 }
117 }
118
119protected:
120 virtual SkString onShortName() {
121 return SkString("pathfill");
122 }
123
bungeman@google.com3c14d0f2011-05-20 14:05:03 +0000124 virtual SkISize onISize() {
reed@google.comc2807002011-04-11 13:57:04 +0000125 return make_isize(640, 480);
126 }
127
128 void drawBG(SkCanvas* canvas) {
129 canvas->drawColor(SK_ColorWHITE);
130 }
131
132 virtual void onDraw(SkCanvas* canvas) {
133 this->drawBG(canvas);
134
135 SkPaint paint;
136 paint.setAntiAlias(true);
137
138 for (size_t i = 0; i < N; i++) {
139 canvas->drawPath(fPath[i], paint);
bungeman@google.com3c14d0f2011-05-20 14:05:03 +0000140 canvas->translate(SkIntToScalar(0), fDY[i]);
reed@google.comc2807002011-04-11 13:57:04 +0000141 }
142 }
143
144private:
145 typedef GM INHERITED;
146};
147
148///////////////////////////////////////////////////////////////////////////////
149
150static GM* MyFactory(void*) { return new PathFillGM; }
151static GMRegistry reg(MyFactory);
152
153}