• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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