blob: 385062d377683e3951c32ec533582828b3597a05 [file] [log] [blame]
reed@android.coma3c05882009-04-02 20:49:39 +00001#include "SampleCode.h"
2#include "SkView.h"
3#include "SkCanvas.h"
4#include "SkGradientShader.h"
5
reed@android.com1c12abe2009-07-02 15:01:02 +00006static SkShader* setgrad(const SkRect& r, SkColor c0, SkColor c1) {
7 SkColor colors[] = { c0, c1 };
8 SkPoint pts[] = { { r.fLeft, r.fTop }, { r.fRight, r.fTop } };
9 return SkGradientShader::CreateLinear(pts, colors, NULL, 2,
10 SkShader::kClamp_TileMode, NULL);
11}
12
13static void test_alphagradients(SkCanvas* canvas) {
14 SkRect r;
15 r.set(SkIntToScalar(10), SkIntToScalar(10),
16 SkIntToScalar(410), SkIntToScalar(30));
17 SkPaint p, p2;
18 p2.setStyle(SkPaint::kStroke_Style);
19
20 p.setShader(setgrad(r, 0xFF00FF00, 0x0000FF00))->unref();
21 canvas->drawRect(r, p);
22 canvas->drawRect(r, p2);
23
24 r.offset(0, r.height() + SkIntToScalar(4));
25 p.setShader(setgrad(r, 0xFF00FF00, 0x00000000))->unref();
26 canvas->drawRect(r, p);
27 canvas->drawRect(r, p2);
28
29 r.offset(0, r.height() + SkIntToScalar(4));
30 p.setShader(setgrad(r, 0xFF00FF00, 0x00FF0000))->unref();
31 canvas->drawRect(r, p);
32 canvas->drawRect(r, p2);
33}
34
35///////////////////////////////////////////////////////////////////////////////
36
reed@android.coma3c05882009-04-02 20:49:39 +000037struct GradData {
38 int fCount;
39 const SkColor* fColors;
40 const SkScalar* fPos;
41};
42
43static const SkColor gColors[] = {
44 SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorWHITE, SK_ColorBLACK
45};
46static const SkScalar gPos0[] = { 0, SK_Scalar1 };
47static const SkScalar gPos1[] = { SK_Scalar1/4, SK_Scalar1*3/4 };
48static const SkScalar gPos2[] = {
49 0, SK_Scalar1/8, SK_Scalar1/2, SK_Scalar1*7/8, SK_Scalar1
50};
51
52static const GradData gGradData[] = {
53 { 2, gColors, NULL },
54 { 2, gColors, gPos0 },
55 { 2, gColors, gPos1 },
56 { 5, gColors, NULL },
57 { 5, gColors, gPos2 }
58};
59
60static SkShader* MakeLinear(const SkPoint pts[2], const GradData& data,
61 SkShader::TileMode tm, SkUnitMapper* mapper) {
62 return SkGradientShader::CreateLinear(pts, data.fColors, data.fPos,
63 data.fCount, tm, mapper);
64}
65
66static SkShader* MakeRadial(const SkPoint pts[2], const GradData& data,
67 SkShader::TileMode tm, SkUnitMapper* mapper) {
68 SkPoint center;
69 center.set(SkScalarAve(pts[0].fX, pts[1].fX),
70 SkScalarAve(pts[0].fY, pts[1].fY));
71 return SkGradientShader::CreateRadial(center, center.fX, data.fColors,
72 data.fPos, data.fCount, tm, mapper);
73}
74
75static SkShader* MakeSweep(const SkPoint pts[2], const GradData& data,
76 SkShader::TileMode tm, SkUnitMapper* mapper) {
77 SkPoint center;
78 center.set(SkScalarAve(pts[0].fX, pts[1].fX),
79 SkScalarAve(pts[0].fY, pts[1].fY));
80 return SkGradientShader::CreateSweep(center.fX, center.fY, data.fColors,
81 data.fPos, data.fCount, mapper);
82}
83
reed@android.com8e2af7e2009-09-22 20:14:42 +000084static SkShader* Make2Radial(const SkPoint pts[2], const GradData& data,
85 SkShader::TileMode tm, SkUnitMapper* mapper) {
86 SkPoint center0, center1;
87 center0.set(SkScalarAve(pts[0].fX, pts[1].fX),
88 SkScalarAve(pts[0].fY, pts[1].fY));
89 center1.set(SkScalarInterp(pts[0].fX, pts[1].fX, SkIntToScalar(3)/5),
90 SkScalarInterp(pts[0].fY, pts[1].fY, SkIntToScalar(1)/4));
91 return SkGradientShader::CreateTwoPointRadial(
92 center1, (pts[1].fX - pts[0].fX) / 7,
93 center0, (pts[1].fX - pts[0].fX) / 2,
94 data.fColors, data.fPos, data.fCount, tm, mapper);
95}
96
bsalomon@google.comdc66c422011-04-06 19:35:37 +000097static SkShader* Make2RadialConcentric(const SkPoint pts[2], const GradData& data,
98 SkShader::TileMode tm, SkUnitMapper* mapper) {
99 SkPoint center;
100 center.set(SkScalarAve(pts[0].fX, pts[1].fX),
101 SkScalarAve(pts[0].fY, pts[1].fY));
102 return SkGradientShader::CreateTwoPointRadial(
103 center, (pts[1].fX - pts[0].fX) / 7,
104 center, (pts[1].fX - pts[0].fX) / 2,
105 data.fColors, data.fPos, data.fCount, tm, mapper);
106}
107
reed@android.coma3c05882009-04-02 20:49:39 +0000108typedef SkShader* (*GradMaker)(const SkPoint pts[2], const GradData& data,
109 SkShader::TileMode tm, SkUnitMapper* mapper);
110static const GradMaker gGradMakers[] = {
bsalomon@google.comdc66c422011-04-06 19:35:37 +0000111 MakeLinear, MakeRadial, MakeSweep, Make2Radial, Make2RadialConcentric
reed@android.coma3c05882009-04-02 20:49:39 +0000112};
113
114///////////////////////////////////////////////////////////////////////////////
115
116class GradientsView : public SkView {
117public:
118 GradientsView() {}
119
120protected:
121 // overrides from SkEventSink
122 virtual bool onQuery(SkEvent* evt) {
123 if (SampleCode::TitleQ(*evt)) {
124 SampleCode::TitleR(evt, "Gradients");
125 return true;
126 }
127 return this->INHERITED::onQuery(evt);
128 }
129
130 void drawBG(SkCanvas* canvas) {
131 canvas->drawColor(0xFFDDDDDD);
132 }
133
134 virtual void onDraw(SkCanvas* canvas) {
135 this->drawBG(canvas);
136
137 SkPoint pts[2] = {
138 { 0, 0 },
139 { SkIntToScalar(100), SkIntToScalar(100) }
140 };
reed@android.coma3c05882009-04-02 20:49:39 +0000141 SkRect r = { 0, 0, SkIntToScalar(100), SkIntToScalar(100) };
142 SkPaint paint;
reed@android.com32a42492009-07-10 03:33:52 +0000143 paint.setDither(true);
reed@android.com1c12abe2009-07-02 15:01:02 +0000144
145 canvas->save();
reed@android.com8e2af7e2009-09-22 20:14:42 +0000146 canvas->translate(SkIntToScalar(20), SkIntToScalar(10));
bsalomon@google.comdc66c422011-04-06 19:35:37 +0000147
148 for (int tm = 0; tm < SkShader::kTileModeCount; ++tm) {
reed@android.coma3c05882009-04-02 20:49:39 +0000149 canvas->save();
bsalomon@google.comdc66c422011-04-06 19:35:37 +0000150 for (size_t i = 0; i < SK_ARRAY_COUNT(gGradData); i++) {
151 canvas->save();
152 for (size_t j = 0; j < SK_ARRAY_COUNT(gGradMakers); j++) {
153 SkShader* shader;
154 shader = gGradMakers[j](pts, gGradData[i], (SkShader::TileMode)tm, NULL);
155 paint.setShader(shader)->unref();
156 canvas->drawRect(r, paint);
157 canvas->translate(0, SkIntToScalar(120));
158 }
159 canvas->restore();
160 canvas->translate(SkIntToScalar(120), 0);
reed@android.coma3c05882009-04-02 20:49:39 +0000161 }
162 canvas->restore();
bsalomon@google.comdc66c422011-04-06 19:35:37 +0000163 canvas->translate(SK_ARRAY_COUNT(gGradData)*SkIntToScalar(120), 0);
reed@android.coma3c05882009-04-02 20:49:39 +0000164 }
reed@android.com1c12abe2009-07-02 15:01:02 +0000165 canvas->restore();
166
167 canvas->translate(0, SkIntToScalar(370));
reed@android.com8e2af7e2009-09-22 20:14:42 +0000168 // test_alphagradients(canvas);
reed@android.comf2b98d62010-12-20 18:26:13 +0000169 this->inval(NULL);
reed@android.coma3c05882009-04-02 20:49:39 +0000170 }
171
172private:
173 typedef SkView INHERITED;
174};
175
176///////////////////////////////////////////////////////////////////////////////
177
178static SkView* MyFactory() { return new GradientsView; }
179static SkViewRegister reg(MyFactory);
180