blob: 37dae888f97bb5968ce3d93dfeee2e601842591d [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001/*
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 */
reed8a21c9f2016-03-08 18:50:00 -08007
reed@android.com8a1c16f2008-12-17 15:59:43 +00008#include "SampleCode.h"
9#include "SkView.h"
10#include "SkCanvas.h"
11#include "SkBlurMaskFilter.h"
12#include "SkCamera.h"
13#include "SkColorFilter.h"
14#include "SkColorPriv.h"
reed@android.com8a1c16f2008-12-17 15:59:43 +000015#include "SkGradientShader.h"
msarettd15750c2016-03-18 15:48:49 -070016#include "SkImage.h"
reed@android.com8a1c16f2008-12-17 15:59:43 +000017#include "SkInterpolator.h"
18#include "SkMaskFilter.h"
19#include "SkPath.h"
20#include "SkRegion.h"
21#include "SkShader.h"
reed@android.com8a1c16f2008-12-17 15:59:43 +000022#include "SkTime.h"
23#include "SkTypeface.h"
24#include "SkUtils.h"
reed@android.com8a1c16f2008-12-17 15:59:43 +000025#include "SkDrawFilter.h"
Mike Reedebfce6d2016-12-12 10:02:12 -050026#include "SkClipOpPriv.h"
reed@android.com8a1c16f2008-12-17 15:59:43 +000027
commit-bot@chromium.org9c9005a2014-04-28 14:55:39 +000028static void make_paint(SkPaint* paint, const SkMatrix& localMatrix) {
reed@android.com8a1c16f2008-12-17 15:59:43 +000029 SkColor colors[] = { 0, SK_ColorWHITE };
senorblanco@chromium.org64cc5792011-05-19 19:58:58 +000030 SkPoint pts[] = { { 0, 0 }, { 0, SK_Scalar1*20 } };
reed8a21c9f2016-03-08 18:50:00 -080031 paint->setShader(SkGradientShader::MakeLinear(pts, colors, nullptr, 2,
32 SkShader::kClamp_TileMode, 0, &localMatrix));
reed374772b2016-10-05 17:33:02 -070033 paint->setBlendMode(SkBlendMode::kDstIn);
reed@android.com8a1c16f2008-12-17 15:59:43 +000034}
35
reed@android.com8a1c16f2008-12-17 15:59:43 +000036// test drawing with strips of fading gradient above and below
37static void test_fade(SkCanvas* canvas) {
38 SkAutoCanvasRestore ar(canvas, true);
39
40 SkRect r;
rmistry@google.comae933ce2012-08-23 18:19:56 +000041
reed@android.com8a1c16f2008-12-17 15:59:43 +000042 SkPaint p;
43 p.setAlpha(0x88);
44
commit-bot@chromium.orge61a86c2013-11-18 16:03:59 +000045 SkAutoCanvasRestore ar2(canvas, false);
reed@android.com8a1c16f2008-12-17 15:59:43 +000046
47 // create the layers
48
49 r.set(0, 0, SkIntToScalar(100), SkIntToScalar(100));
50 canvas->clipRect(r);
rmistry@google.comae933ce2012-08-23 18:19:56 +000051
reed@android.com8a1c16f2008-12-17 15:59:43 +000052 r.fBottom = SkIntToScalar(20);
halcanary96fcdcc2015-08-27 07:41:13 -070053 canvas->saveLayer(&r, nullptr);
reed@android.com8a1c16f2008-12-17 15:59:43 +000054
55 r.fTop = SkIntToScalar(80);
56 r.fBottom = SkIntToScalar(100);
halcanary96fcdcc2015-08-27 07:41:13 -070057 canvas->saveLayer(&r, nullptr);
rmistry@google.comae933ce2012-08-23 18:19:56 +000058
59 // now draw the "content"
reed@android.com8a1c16f2008-12-17 15:59:43 +000060
61 if (true) {
62 r.set(0, 0, SkIntToScalar(100), SkIntToScalar(100));
63
64 canvas->saveLayerAlpha(&r, 0x80);
65
66 SkPaint p;
67 p.setColor(SK_ColorRED);
68 p.setAntiAlias(true);
69 canvas->drawOval(r, p);
rmistry@google.comae933ce2012-08-23 18:19:56 +000070
reed@android.com8a1c16f2008-12-17 15:59:43 +000071 canvas->restore();
72 } else {
73 r.set(0, 0, SkIntToScalar(100), SkIntToScalar(100));
rmistry@google.comae933ce2012-08-23 18:19:56 +000074
reed@android.com8a1c16f2008-12-17 15:59:43 +000075 SkPaint p;
76 p.setColor(SK_ColorRED);
77 p.setAntiAlias(true);
78 canvas->drawOval(r, p);
79 }
rmistry@google.comae933ce2012-08-23 18:19:56 +000080
reed@android.com8a1c16f2008-12-17 15:59:43 +000081// return;
82
reed@android.com8a1c16f2008-12-17 15:59:43 +000083 // now apply an effect
commit-bot@chromium.org9c9005a2014-04-28 14:55:39 +000084 SkMatrix m;
85 m.setScale(SK_Scalar1, -SK_Scalar1);
86 m.postTranslate(0, SkIntToScalar(100));
reed@android.com8a1c16f2008-12-17 15:59:43 +000087
88 SkPaint paint;
commit-bot@chromium.org9c9005a2014-04-28 14:55:39 +000089 make_paint(&paint, m);
reed@android.com8a1c16f2008-12-17 15:59:43 +000090 r.set(0, 0, SkIntToScalar(100), SkIntToScalar(20));
91// SkDebugf("--------- draw top grad\n");
92 canvas->drawRect(r, paint);
93
reed@android.com8a1c16f2008-12-17 15:59:43 +000094 r.fTop = SkIntToScalar(80);
95 r.fBottom = SkIntToScalar(100);
96// SkDebugf("--------- draw bot grad\n");
97 canvas->drawRect(r, paint);
98}
99
100class RedFilter : public SkDrawFilter {
101public:
mtklein36352bf2015-03-25 18:17:31 -0700102 bool filter(SkPaint* p, SkDrawFilter::Type) override {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000103 fColor = p->getColor();
104 if (fColor == SK_ColorRED) {
105 p->setColor(SK_ColorGREEN);
106 }
reed@google.com971aca72012-11-26 20:26:54 +0000107 return true;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000108 }
rmistry@google.comae933ce2012-08-23 18:19:56 +0000109
reed@android.com8a1c16f2008-12-17 15:59:43 +0000110private:
111 SkColor fColor;
112};
113
114class LayersView : public SkView {
115public:
rmistry@google.comae933ce2012-08-23 18:19:56 +0000116 LayersView() {}
reed@android.com8a1c16f2008-12-17 15:59:43 +0000117
118protected:
119 // overrides from SkEventSink
mtkleinf0599002015-07-13 06:18:39 -0700120 bool onQuery(SkEvent* evt) override {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000121 if (SampleCode::TitleQ(*evt)) {
122 SampleCode::TitleR(evt, "Layers");
123 return true;
124 }
125 return this->INHERITED::onQuery(evt);
126 }
rmistry@google.comae933ce2012-08-23 18:19:56 +0000127
reed@android.com8a1c16f2008-12-17 15:59:43 +0000128 void drawBG(SkCanvas* canvas) {
reed@android.com149e2f62009-05-22 14:39:03 +0000129 canvas->drawColor(SK_ColorGRAY);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000130 }
rmistry@google.comae933ce2012-08-23 18:19:56 +0000131
mtkleinf0599002015-07-13 06:18:39 -0700132 void onDraw(SkCanvas* canvas) override {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000133 this->drawBG(canvas);
rmistry@google.comae933ce2012-08-23 18:19:56 +0000134
reed@android.com149e2f62009-05-22 14:39:03 +0000135 if (true) {
136 SkRect r;
rmistry@google.comae933ce2012-08-23 18:19:56 +0000137 r.set(SkIntToScalar(0), SkIntToScalar(0),
138 SkIntToScalar(220), SkIntToScalar(120));
reed@android.com149e2f62009-05-22 14:39:03 +0000139 SkPaint p;
140 canvas->saveLayer(&r, &p);
141 canvas->drawColor(0xFFFF0000);
reed@android.comf2b98d62010-12-20 18:26:13 +0000142 p.setAlpha(0); // or 0
reed374772b2016-10-05 17:33:02 -0700143 p.setBlendMode(SkBlendMode::kSrc);
reed@android.com149e2f62009-05-22 14:39:03 +0000144 canvas->drawOval(r, p);
145 canvas->restore();
146 return;
147 }
rmistry@google.comae933ce2012-08-23 18:19:56 +0000148
reed@android.com8a1c16f2008-12-17 15:59:43 +0000149 if (false) {
150 SkRect r;
rmistry@google.comae933ce2012-08-23 18:19:56 +0000151 r.set(SkIntToScalar(0), SkIntToScalar(0),
152 SkIntToScalar(220), SkIntToScalar(120));
reed@android.com8a1c16f2008-12-17 15:59:43 +0000153 SkPaint p;
154 p.setAlpha(0x88);
155 p.setAntiAlias(true);
rmistry@google.comae933ce2012-08-23 18:19:56 +0000156
reed@android.com8a1c16f2008-12-17 15:59:43 +0000157 if (true) {
158 canvas->saveLayer(&r, &p);
159 p.setColor(0xFFFF0000);
160 canvas->drawOval(r, p);
161 canvas->restore();
162 }
163
164 p.setColor(0xFF0000FF);
165 r.offset(SkIntToScalar(20), SkIntToScalar(50));
166 canvas->drawOval(r, p);
167 }
168
169 if (false) {
170 SkPaint p;
171 p.setAlpha(0x88);
172 p.setAntiAlias(true);
173
174 canvas->translate(SkIntToScalar(300), 0);
175
176 SkRect r;
rmistry@google.comae933ce2012-08-23 18:19:56 +0000177 r.set(SkIntToScalar(0), SkIntToScalar(0),
178 SkIntToScalar(220), SkIntToScalar(60));
reed@android.com8a1c16f2008-12-17 15:59:43 +0000179
commit-bot@chromium.org091a5942014-04-18 14:19:31 +0000180 canvas->saveLayer(&r, &p);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000181
rmistry@google.comae933ce2012-08-23 18:19:56 +0000182 r.set(SkIntToScalar(0), SkIntToScalar(0),
183 SkIntToScalar(220), SkIntToScalar(120));
reed@android.com8a1c16f2008-12-17 15:59:43 +0000184 p.setColor(SK_ColorBLUE);
185 canvas->drawOval(r, p);
186 canvas->restore();
187 return;
188 }
rmistry@google.comae933ce2012-08-23 18:19:56 +0000189
reed@android.com8a1c16f2008-12-17 15:59:43 +0000190 test_fade(canvas);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000191 }
rmistry@google.comae933ce2012-08-23 18:19:56 +0000192
reed@android.com8a1c16f2008-12-17 15:59:43 +0000193private:
194 typedef SkView INHERITED;
195};
reedbfd5f172016-01-07 11:28:08 -0800196DEF_SAMPLE( return new LayersView; )
reed@android.com8a1c16f2008-12-17 15:59:43 +0000197
198//////////////////////////////////////////////////////////////////////////////
199
reedbfd5f172016-01-07 11:28:08 -0800200#include "SkBlurImageFilter.h"
201#include "SkMatrixConvolutionImageFilter.h"
202#include "SkMorphologyImageFilter.h"
203
204#include "Resources.h"
205#include "SkAnimTimer.h"
206
207class BackdropView : public SampleView {
208 SkPoint fCenter;
209 SkScalar fAngle;
reed9ce9d672016-03-17 10:51:11 -0700210 sk_sp<SkImage> fImage;
robertphillipsfc11b0a2016-04-05 09:09:36 -0700211 sk_sp<SkImageFilter> fFilter;
reedbfd5f172016-01-07 11:28:08 -0800212public:
213 BackdropView() {
214 fCenter.set(200, 150);
215 fAngle = 0;
Hal Canaryc465d132017-12-08 10:21:31 -0500216 fImage = GetResourceAsImage("images/mandrill_512.png");
robertphillipsfc11b0a2016-04-05 09:09:36 -0700217 fFilter = SkDilateImageFilter::Make(8, 8, nullptr);
reedbfd5f172016-01-07 11:28:08 -0800218 }
219
220protected:
221 // overrides from SkEventSink
222 bool onQuery(SkEvent* evt) override {
223 if (SampleCode::TitleQ(*evt)) {
224 SampleCode::TitleR(evt, "Backdrop");
225 return true;
226 }
227 return this->INHERITED::onQuery(evt);
228 }
229
230 void onDrawContent(SkCanvas* canvas) override {
reed9ce9d672016-03-17 10:51:11 -0700231 canvas->drawImage(fImage.get(), 0, 0, nullptr);
reedbfd5f172016-01-07 11:28:08 -0800232
233 const SkScalar w = 250;
234 const SkScalar h = 150;
235 SkPath path;
236 path.addOval(SkRect::MakeXYWH(-w/2, -h/2, w, h));
237 SkMatrix m;
238 m.setRotate(fAngle);
239 m.postTranslate(fCenter.x(), fCenter.y());
240 path.transform(m);
241
Mike Reedc1f77742016-12-09 09:00:50 -0500242 canvas->clipPath(path, kIntersect_SkClipOp, true);
reedbfd5f172016-01-07 11:28:08 -0800243 const SkRect bounds = path.getBounds();
244
245 SkPaint paint;
246 paint.setAlpha(0xCC);
Florin Malita53f77bd2017-04-28 13:48:37 -0400247 canvas->saveLayer({ &bounds, &paint, fFilter.get(), nullptr, nullptr, 0 });
reedbfd5f172016-01-07 11:28:08 -0800248
249 canvas->restore();
250 }
251
252 bool onAnimate(const SkAnimTimer& timer) override {
253 fAngle = SkDoubleToScalar(fmod(timer.secs() * 360 / 5, 360));
254 return true;
255 }
256
257 SkView::Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned modi) override {
reedbfd5f172016-01-07 11:28:08 -0800258 return new Click(this);
259 }
260
261 bool onClick(Click* click) override {
reedbfd5f172016-01-07 11:28:08 -0800262 fCenter = click->fCurr;
263 return this->INHERITED::onClick(click);
264 }
265
266private:
267 typedef SampleView INHERITED;
268};
269DEF_SAMPLE( return new BackdropView; )