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