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
setgrad(const SkRect & r,SkColor c0,SkColor c1)13 static SkShader* setgrad(const SkRect& r, SkColor c0, SkColor c1) {
14 SkColor colors[] = { c0, c1 };
15 SkPoint pts[] = { { r.fLeft, r.fTop }, { r.fRight, r.fTop } };
16 return SkGradientShader::CreateLinear(pts, colors, NULL, 2,
17 SkShader::kClamp_TileMode, NULL);
18 }
19
test_alphagradients(SkCanvas * canvas)20 static void test_alphagradients(SkCanvas* canvas) {
21 SkRect r;
22 r.set(SkIntToScalar(10), SkIntToScalar(10),
23 SkIntToScalar(410), SkIntToScalar(30));
24 SkPaint p, p2;
25 p2.setStyle(SkPaint::kStroke_Style);
26
27 p.setShader(setgrad(r, 0xFF00FF00, 0x0000FF00))->unref();
28 canvas->drawRect(r, p);
29 canvas->drawRect(r, p2);
30
31 r.offset(0, r.height() + SkIntToScalar(4));
32 p.setShader(setgrad(r, 0xFF00FF00, 0x00000000))->unref();
33 canvas->drawRect(r, p);
34 canvas->drawRect(r, p2);
35
36 r.offset(0, r.height() + SkIntToScalar(4));
37 p.setShader(setgrad(r, 0xFF00FF00, 0x00FF0000))->unref();
38 canvas->drawRect(r, p);
39 canvas->drawRect(r, p2);
40 }
41
42 ///////////////////////////////////////////////////////////////////////////////
43
44 struct GradData {
45 int fCount;
46 const SkColor* fColors;
47 const SkScalar* fPos;
48 };
49
50 static const SkColor gColors[] = {
51 SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorWHITE, SK_ColorBLACK
52 };
53 static const SkScalar gPos0[] = { 0, SK_Scalar1 };
54 static const SkScalar gPos1[] = { SK_Scalar1/4, SK_Scalar1*3/4 };
55 static const SkScalar gPos2[] = {
56 0, SK_Scalar1/8, SK_Scalar1/2, SK_Scalar1*7/8, SK_Scalar1
57 };
58
59 static const GradData gGradData[] = {
60 { 2, gColors, NULL },
61 { 2, gColors, gPos0 },
62 { 2, gColors, gPos1 },
63 { 5, gColors, NULL },
64 { 5, gColors, gPos2 }
65 };
66
MakeLinear(const SkPoint pts[2],const GradData & data,SkShader::TileMode tm,SkUnitMapper * mapper)67 static SkShader* MakeLinear(const SkPoint pts[2], const GradData& data,
68 SkShader::TileMode tm, SkUnitMapper* mapper) {
69 return SkGradientShader::CreateLinear(pts, data.fColors, data.fPos,
70 data.fCount, tm, mapper);
71 }
72
MakeRadial(const SkPoint pts[2],const GradData & data,SkShader::TileMode tm,SkUnitMapper * mapper)73 static SkShader* MakeRadial(const SkPoint pts[2], const GradData& data,
74 SkShader::TileMode tm, SkUnitMapper* mapper) {
75 SkPoint center;
76 center.set(SkScalarAve(pts[0].fX, pts[1].fX),
77 SkScalarAve(pts[0].fY, pts[1].fY));
78 return SkGradientShader::CreateRadial(center, center.fX, data.fColors,
79 data.fPos, data.fCount, tm, mapper);
80 }
81
MakeSweep(const SkPoint pts[2],const GradData & data,SkShader::TileMode tm,SkUnitMapper * mapper)82 static SkShader* MakeSweep(const SkPoint pts[2], const GradData& data,
83 SkShader::TileMode tm, SkUnitMapper* mapper) {
84 SkPoint center;
85 center.set(SkScalarAve(pts[0].fX, pts[1].fX),
86 SkScalarAve(pts[0].fY, pts[1].fY));
87 return SkGradientShader::CreateSweep(center.fX, center.fY, data.fColors,
88 data.fPos, data.fCount, mapper);
89 }
90
Make2Radial(const SkPoint pts[2],const GradData & data,SkShader::TileMode tm,SkUnitMapper * mapper)91 static SkShader* Make2Radial(const SkPoint pts[2], const GradData& data,
92 SkShader::TileMode tm, SkUnitMapper* mapper) {
93 SkPoint center0, center1;
94 center0.set(SkScalarAve(pts[0].fX, pts[1].fX),
95 SkScalarAve(pts[0].fY, pts[1].fY));
96 center1.set(SkScalarInterp(pts[0].fX, pts[1].fX, SkIntToScalar(3)/5),
97 SkScalarInterp(pts[0].fY, pts[1].fY, SkIntToScalar(1)/4));
98 return SkGradientShader::CreateTwoPointRadial(
99 center1, (pts[1].fX - pts[0].fX) / 7,
100 center0, (pts[1].fX - pts[0].fX) / 2,
101 data.fColors, data.fPos, data.fCount, tm, mapper);
102 }
103
Make2RadialConcentric(const SkPoint pts[2],const GradData & data,SkShader::TileMode tm,SkUnitMapper * mapper)104 static SkShader* Make2RadialConcentric(const SkPoint pts[2], const GradData& data,
105 SkShader::TileMode tm, SkUnitMapper* mapper) {
106 SkPoint center;
107 center.set(SkScalarAve(pts[0].fX, pts[1].fX),
108 SkScalarAve(pts[0].fY, pts[1].fY));
109 return SkGradientShader::CreateTwoPointRadial(
110 center, (pts[1].fX - pts[0].fX) / 7,
111 center, (pts[1].fX - pts[0].fX) / 2,
112 data.fColors, data.fPos, data.fCount, tm, mapper);
113 }
114
115 typedef SkShader* (*GradMaker)(const SkPoint pts[2], const GradData& data,
116 SkShader::TileMode tm, SkUnitMapper* mapper);
117 static const GradMaker gGradMakers[] = {
118 MakeLinear, MakeRadial, MakeSweep, Make2Radial, Make2RadialConcentric
119 };
120
121 ///////////////////////////////////////////////////////////////////////////////
122
123 class GradientsView : public SampleView {
124 public:
GradientsView()125 GradientsView() {
126 this->setBGColor(0xFFDDDDDD);
127 }
128
129 protected:
130 // overrides from SkEventSink
onQuery(SkEvent * evt)131 virtual bool onQuery(SkEvent* evt) {
132 if (SampleCode::TitleQ(*evt)) {
133 SampleCode::TitleR(evt, "Gradients");
134 return true;
135 }
136 return this->INHERITED::onQuery(evt);
137 }
138
onDrawContent(SkCanvas * canvas)139 virtual void onDrawContent(SkCanvas* canvas) {
140 SkPoint pts[2] = {
141 { 0, 0 },
142 { SkIntToScalar(100), SkIntToScalar(100) }
143 };
144 SkRect r = { 0, 0, SkIntToScalar(100), SkIntToScalar(100) };
145 SkPaint paint;
146 paint.setDither(true);
147
148 canvas->save();
149 canvas->translate(SkIntToScalar(20), SkIntToScalar(10));
150
151 for (int tm = 0; tm < SkShader::kTileModeCount; ++tm) {
152 canvas->save();
153 for (size_t i = 0; i < SK_ARRAY_COUNT(gGradData); i++) {
154 canvas->save();
155 for (size_t j = 0; j < SK_ARRAY_COUNT(gGradMakers); j++) {
156 SkShader* shader;
157 shader = gGradMakers[j](pts, gGradData[i], (SkShader::TileMode)tm, NULL);
158 paint.setShader(shader)->unref();
159 canvas->drawRect(r, paint);
160 canvas->translate(0, SkIntToScalar(120));
161 }
162 canvas->restore();
163 canvas->translate(SkIntToScalar(120), 0);
164 }
165 canvas->restore();
166 canvas->translate(SK_ARRAY_COUNT(gGradData)*SkIntToScalar(120), 0);
167 }
168 canvas->restore();
169
170 canvas->translate(0, SkIntToScalar(370));
171 // test_alphagradients(canvas);
172 this->inval(NULL);
173 }
174
175 private:
176 typedef SampleView INHERITED;
177 };
178
179 ///////////////////////////////////////////////////////////////////////////////
180
MyFactory()181 static SkView* MyFactory() { return new GradientsView; }
182 static SkViewRegister reg(MyFactory);
183
184