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