blob: 4513934ab6b695454ce330898c7dd1e5094e0add [file] [log] [blame]
bsalomon@google.com0b26c152012-04-16 14:19:32 +00001
2/*
3 * Copyright 2012 Intel 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 "gm.h"
9#include "SkTArray.h"
10#include "SkRandom.h"
11#include "SkMatrix.h"
12#include "SkBlurMaskFilter.h"
13#include "SkGradientShader.h"
14#include "SkBlurDrawLooper.h"
15
16namespace skiagm {
17
18class CircleGM : public GM {
19public:
20 CircleGM() {
21 this->setBGColor(0xFF000000);
22 this->makePaints();
23 this->makeMatrices();
24 }
25
26protected:
27 virtual SkString onShortName() SK_OVERRIDE {
28 return SkString("circles");
29 }
30
31 virtual SkISize onISize() SK_OVERRIDE {
32 return make_isize(1200, 900);
33 }
34
35 void makePaints() {
36 {
37 // no AA
38 SkPaint p;
39 fPaints.push_back(p);
40 }
41
42 {
43 // AA
44 SkPaint p;
45 p.setAntiAlias(true);
46 fPaints.push_back(p);
47 }
48
49 {
50 // AA with mask filter
51 SkPaint p;
52 p.setAntiAlias(true);
53 SkMaskFilter* mf = SkBlurMaskFilter::Create(SkIntToScalar(5),
54 SkBlurMaskFilter::kNormal_BlurStyle,
55 SkBlurMaskFilter::kHighQuality_BlurFlag);
56 p.setMaskFilter(mf)->unref();
57 fPaints.push_back(p);
58 }
59
60 {
61 // AA with radial shader
62 SkPaint p;
63 p.setAntiAlias(true);
64 SkPoint center = SkPoint::Make(SkIntToScalar(40), SkIntToScalar(40));
65 SkColor colors[] = { SK_ColorBLUE, SK_ColorRED, SK_ColorGREEN };
66 SkScalar pos[] = { 0, SK_ScalarHalf, SK_Scalar1 };
67 SkShader* s = SkGradientShader::CreateRadial(center,
68 SkIntToScalar(20),
69 colors,
70 pos,
71 SK_ARRAY_COUNT(colors),
72 SkShader::kClamp_TileMode);
73 p.setShader(s)->unref();
74 fPaints.push_back(p);
75 }
76
77 {
78 // AA with blur
79 SkPaint p;
80 p.setAntiAlias(true);
81 SkBlurDrawLooper* shadowLooper =
82 new SkBlurDrawLooper (SkIntToScalar(10), SkIntToScalar(5),
83 SkIntToScalar(10), 0xFF0000FF,
84 SkBlurDrawLooper::kIgnoreTransform_BlurFlag |
85 SkBlurDrawLooper::kOverrideColor_BlurFlag |
86 SkBlurDrawLooper::kHighQuality_BlurFlag );
87 SkAutoUnref aurL0(shadowLooper);
88 p.setLooper(shadowLooper);
89 fPaints.push_back(p);
90 }
91
92 {
93 // AA with stroke style
94 SkPaint p;
95 p.setAntiAlias(true);
96 p.setStyle(SkPaint::kStroke_Style);
97 p.setStrokeWidth(SkIntToScalar(3));
98 fPaints.push_back(p);
99 }
100
101 {
102 // AA with stroke style, width = 0
103 SkPaint p;
104 p.setAntiAlias(true);
105 p.setStyle(SkPaint::kStroke_Style);
106 fPaints.push_back(p);
107 }
108
109 {
110 // AA with stroke and fill style
111 SkPaint p;
112 p.setAntiAlias(true);
113 p.setStyle(SkPaint::kStrokeAndFill_Style);
114 p.setStrokeWidth(SkIntToScalar(2));
115 fPaints.push_back(p);
116 }
117 }
118
119 void makeMatrices() {
120 {
121 SkMatrix m;
122 m.setScale(SkIntToScalar(2), SkIntToScalar(3));
123 fMatrices.push_back(m);
124 }
125
126 {
127 SkMatrix m;
128 m.setScale(SkIntToScalar(2), SkIntToScalar(2));
129 fMatrices.push_back(m);
130 }
131
132 {
133 SkMatrix m;
134 m.setSkew(SkIntToScalar(2), SkIntToScalar(3));
135 fMatrices.push_back(m);
136 }
137
138 {
139 SkMatrix m;
140 m.setSkew(SkIntToScalar(2), SkIntToScalar(2));
141 fMatrices.push_back(m);
142 }
143
144 {
145 SkMatrix m;
146 m.setRotate(SkIntToScalar(30));
147 fMatrices.push_back(m);
148 }
149 }
150
151 virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
152 SkRandom rand;
153 canvas->translate(20 * SK_Scalar1, 20 * SK_Scalar1);
154
155 int i;
156 for (i = 0; i < fPaints.count(); ++i) {
157 canvas->save();
158 // position the path, and make it at off-integer coords.
159 canvas->translate(SK_Scalar1 * 200 * (i % 5) + SK_Scalar1 / 4,
160 SK_Scalar1 * 200 * (i / 5) + 3 * SK_Scalar1 / 4);
161 SkColor color = rand.nextU();
162 color |= 0xff000000;
163 fPaints[i].setColor(color);
164
165 canvas->drawCircle(SkIntToScalar(40), SkIntToScalar(40),
166 SkIntToScalar(20),
167 fPaints[i]);
168 canvas->restore();
169 }
170
171 for (int j = 0; j < fMatrices.count(); ++j, ++i) {
172 canvas->save();
173
174 canvas->translate(SK_Scalar1 * 200 * (i % 5) + SK_Scalar1 / 4,
175 SK_Scalar1 * 200 * (i / 5) + 3 * SK_Scalar1 / 4);
176
177 canvas->concat(fMatrices[j]);
178
179 SkPaint paint;
180 paint.setAntiAlias(true);
181
182 SkColor color = rand.nextU();
183 color |= 0xff000000;
184 paint.setColor(color);
185
186 canvas->drawCircle(SkIntToScalar(40), SkIntToScalar(40),
187 SkIntToScalar(20),
188 paint);
189
190 canvas->restore();
191 }
192 }
193
194private:
195 typedef GM INHERITED;
196 SkTArray<SkPaint> fPaints;
197 SkTArray<SkMatrix> fMatrices;
198};
199
200//////////////////////////////////////////////////////////////////////////////
201
202static GM* MyFactory(void*) { return new CircleGM; }
203static GMRegistry reg(MyFactory);
204
205}