• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2011 Google Inc.
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7 
8 #include "include/core/SkCanvas.h"
9 #include "include/core/SkColorFilter.h"
10 #include "include/core/SkColorPriv.h"
11 #include "include/core/SkImage.h"
12 #include "include/core/SkMaskFilter.h"
13 #include "include/core/SkPath.h"
14 #include "include/core/SkRegion.h"
15 #include "include/core/SkShader.h"
16 #include "include/core/SkTime.h"
17 #include "include/core/SkTypeface.h"
18 #include "include/effects/SkGradientShader.h"
19 #include "include/utils/SkCamera.h"
20 #include "samplecode/Sample.h"
21 #include "src/utils/SkUTF.h"
22 
make_paint(SkPaint * paint,const SkMatrix & localMatrix)23 static void make_paint(SkPaint* paint, const SkMatrix& localMatrix) {
24     SkColor colors[] = { 0, SK_ColorWHITE };
25     SkPoint pts[] = { { 0, 0 }, { 0, SK_Scalar1*20 } };
26     paint->setShader(SkGradientShader::MakeLinear(pts, colors, nullptr, 2,
27                                                   SkTileMode::kClamp, 0, &localMatrix));
28     paint->setBlendMode(SkBlendMode::kDstIn);
29 }
30 
31 // test drawing with strips of fading gradient above and below
test_fade(SkCanvas * canvas)32 static void test_fade(SkCanvas* canvas) {
33     SkAutoCanvasRestore ar(canvas, true);
34 
35     SkRect r;
36 
37     SkAutoCanvasRestore ar2(canvas, false);
38 
39     // create the layers
40 
41     r.setWH(100, 100);
42     canvas->clipRect(r);
43 
44     r.fBottom = SkIntToScalar(20);
45     canvas->saveLayer(&r, nullptr);
46 
47     r.fTop = SkIntToScalar(80);
48     r.fBottom = SkIntToScalar(100);
49     canvas->saveLayer(&r, nullptr);
50 
51     // now draw the "content"
52 
53     if (true) {
54         r.setWH(100, 100);
55 
56         canvas->saveLayerAlpha(&r, 0x80);
57 
58         SkPaint p;
59         p.setColor(SK_ColorRED);
60         p.setAntiAlias(true);
61         canvas->drawOval(r, p);
62 
63         canvas->restore();
64     } else {
65         r.setWH(100, 100);
66 
67         SkPaint p;
68         p.setColor(SK_ColorRED);
69         p.setAntiAlias(true);
70         canvas->drawOval(r, p);
71     }
72 
73 //    return;
74 
75     // now apply an effect
76     SkMatrix m;
77     m.setScale(SK_Scalar1, -SK_Scalar1);
78     m.postTranslate(0, SkIntToScalar(100));
79 
80     SkPaint paint;
81     make_paint(&paint, m);
82     r.setWH(100, 20);
83 //    SkDebugf("--------- draw top grad\n");
84     canvas->drawRect(r, paint);
85 
86     r.fTop = SkIntToScalar(80);
87     r.fBottom = SkIntToScalar(100);
88 //    SkDebugf("--------- draw bot grad\n");
89     canvas->drawRect(r, paint);
90 }
91 
92 class LayersView : public Sample {
93 public:
LayersView()94     LayersView() {}
95 
96 protected:
name()97     SkString name() override { return SkString("Layers"); }
98 
drawBG(SkCanvas * canvas)99     void drawBG(SkCanvas* canvas) {
100         canvas->drawColor(SK_ColorGRAY);
101     }
102 
onDrawContent(SkCanvas * canvas)103     void onDrawContent(SkCanvas* canvas) override {
104         this->drawBG(canvas);
105 
106         if (true) {
107             SkRect r;
108             r.setWH(220, 120);
109             SkPaint p;
110             canvas->saveLayer(&r, &p);
111             canvas->drawColor(0xFFFF0000);
112             p.setAlpha(0);  // or 0
113             p.setBlendMode(SkBlendMode::kSrc);
114             canvas->drawOval(r, p);
115             canvas->restore();
116             return;
117         }
118 
119         if (false) {
120             SkRect r;
121             r.setWH(220, 120);
122             SkPaint p;
123             p.setAlpha(0x88);
124             p.setAntiAlias(true);
125 
126             if (true) {
127                 canvas->saveLayer(&r, &p);
128                 p.setColor(0xFFFF0000);
129                 canvas->drawOval(r, p);
130                 canvas->restore();
131             }
132 
133             p.setColor(0xFF0000FF);
134             r.offset(SkIntToScalar(20), SkIntToScalar(50));
135             canvas->drawOval(r, p);
136         }
137 
138         if (false) {
139             SkPaint p;
140             p.setAlpha(0x88);
141             p.setAntiAlias(true);
142 
143             canvas->translate(SkIntToScalar(300), 0);
144 
145             SkRect r;
146             r.setWH(220, 60);
147 
148             canvas->saveLayer(&r, &p);
149 
150             r.setWH(220, 120);
151             p.setColor(SK_ColorBLUE);
152             canvas->drawOval(r, p);
153             canvas->restore();
154             return;
155         }
156 
157         test_fade(canvas);
158     }
159 
160 private:
161     using INHERITED = Sample;
162 };
163 DEF_SAMPLE( return new LayersView; )
164 
165 //////////////////////////////////////////////////////////////////////////////
166 
167 #include "include/effects/SkImageFilters.h"
168 
169 #include "tools/Resources.h"
170 
171 class BackdropView : public Sample {
172     SkPoint fCenter;
173     SkScalar fAngle;
174     sk_sp<SkImage> fImage;
175     sk_sp<SkImageFilter> fFilter;
176 public:
BackdropView()177     BackdropView() {
178         fCenter.set(200, 150);
179         fAngle = 0;
180         fImage = GetResourceAsImage("images/mandrill_512.png");
181         fFilter = SkImageFilters::Dilate(8, 8, nullptr);
182     }
183 
184 protected:
name()185     SkString name() override { return SkString("Backdrop"); }
186 
onDrawContent(SkCanvas * canvas)187     void onDrawContent(SkCanvas* canvas) override {
188         canvas->drawImage(fImage.get(), 0, 0);
189 
190         const SkScalar w = 250;
191         const SkScalar h = 150;
192         SkPath path;
193         path.addOval(SkRect::MakeXYWH(-w/2, -h/2, w, h));
194         SkMatrix m;
195         m.setRotate(fAngle);
196         m.postTranslate(fCenter.x(), fCenter.y());
197         path.transform(m);
198 
199         canvas->clipPath(path, SkClipOp::kIntersect, true);
200         const SkRect bounds = path.getBounds();
201 
202         SkPaint paint;
203         paint.setAlpha(0xCC);
204         canvas->saveLayer(SkCanvas::SaveLayerRec(&bounds, &paint, fFilter.get(), 0));
205 
206         canvas->restore();
207     }
208 
onAnimate(double nanos)209     bool onAnimate(double nanos) override {
210         fAngle = SkDoubleToScalar(fmod(1e-9 * nanos * 360 / 5, 360));
211         return true;
212     }
213 
onFindClickHandler(SkScalar x,SkScalar y,skui::ModifierKey modi)214     Sample::Click* onFindClickHandler(SkScalar x, SkScalar y, skui::ModifierKey modi) override {
215         return new Click();
216     }
217 
onClick(Click * click)218     bool onClick(Click* click) override {
219         fCenter = click->fCurr;
220         return true;
221     }
222 
223 private:
224     using INHERITED = Sample;
225 };
226 DEF_SAMPLE( return new BackdropView; )
227