blob: c086eb048003b1aecf3e15d12b1debfc9ff8a2fd [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"
25#include "SkKey.h"
reed@android.com8a1c16f2008-12-17 15:59:43 +000026#include "SkDrawFilter.h"
27
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
mtkleinf0599002015-07-13 06:18:39 -0700193 SkView::Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned modi) override {
halcanary96fcdcc2015-08-27 07:41:13 -0700194 this->inval(nullptr);
rmistry@google.comae933ce2012-08-23 18:19:56 +0000195
reed@google.com4d5c26d2013-01-08 16:17:50 +0000196 return this->INHERITED::onFindClickHandler(x, y, modi);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000197 }
rmistry@google.comae933ce2012-08-23 18:19:56 +0000198
mtkleinf0599002015-07-13 06:18:39 -0700199 bool onClick(Click* click) override {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000200 return this->INHERITED::onClick(click);
201 }
202
sugoi@google.com93c7ee32013-03-12 14:36:57 +0000203 virtual bool handleKey(SkKey) {
halcanary96fcdcc2015-08-27 07:41:13 -0700204 this->inval(nullptr);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000205 return true;
206 }
207
208private:
209 typedef SkView INHERITED;
210};
reedbfd5f172016-01-07 11:28:08 -0800211DEF_SAMPLE( return new LayersView; )
reed@android.com8a1c16f2008-12-17 15:59:43 +0000212
213//////////////////////////////////////////////////////////////////////////////
214
reedbfd5f172016-01-07 11:28:08 -0800215#include "SkBlurImageFilter.h"
216#include "SkMatrixConvolutionImageFilter.h"
217#include "SkMorphologyImageFilter.h"
218
219#include "Resources.h"
220#include "SkAnimTimer.h"
221
222class BackdropView : public SampleView {
223 SkPoint fCenter;
224 SkScalar fAngle;
reed9ce9d672016-03-17 10:51:11 -0700225 sk_sp<SkImage> fImage;
robertphillipsfc11b0a2016-04-05 09:09:36 -0700226 sk_sp<SkImageFilter> fFilter;
reedbfd5f172016-01-07 11:28:08 -0800227public:
228 BackdropView() {
229 fCenter.set(200, 150);
230 fAngle = 0;
reed9ce9d672016-03-17 10:51:11 -0700231 fImage = GetResourceAsImage("mandrill_512.png");
robertphillipsfc11b0a2016-04-05 09:09:36 -0700232 fFilter = SkDilateImageFilter::Make(8, 8, nullptr);
reedbfd5f172016-01-07 11:28:08 -0800233 }
234
235protected:
236 // overrides from SkEventSink
237 bool onQuery(SkEvent* evt) override {
238 if (SampleCode::TitleQ(*evt)) {
239 SampleCode::TitleR(evt, "Backdrop");
240 return true;
241 }
242 return this->INHERITED::onQuery(evt);
243 }
244
245 void onDrawContent(SkCanvas* canvas) override {
reed9ce9d672016-03-17 10:51:11 -0700246 canvas->drawImage(fImage.get(), 0, 0, nullptr);
reedbfd5f172016-01-07 11:28:08 -0800247
248 const SkScalar w = 250;
249 const SkScalar h = 150;
250 SkPath path;
251 path.addOval(SkRect::MakeXYWH(-w/2, -h/2, w, h));
252 SkMatrix m;
253 m.setRotate(fAngle);
254 m.postTranslate(fCenter.x(), fCenter.y());
255 path.transform(m);
256
reed73603f32016-09-20 08:42:38 -0700257 canvas->clipPath(path, SkCanvas::kIntersect_Op, true);
reedbfd5f172016-01-07 11:28:08 -0800258 const SkRect bounds = path.getBounds();
259
260 SkPaint paint;
261 paint.setAlpha(0xCC);
robertphillipsfc11b0a2016-04-05 09:09:36 -0700262 canvas->saveLayer({ &bounds, &paint, fFilter.get(), 0 });
reedbfd5f172016-01-07 11:28:08 -0800263
264 canvas->restore();
265 }
266
267 bool onAnimate(const SkAnimTimer& timer) override {
268 fAngle = SkDoubleToScalar(fmod(timer.secs() * 360 / 5, 360));
269 return true;
270 }
271
272 SkView::Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned modi) override {
273 this->inval(nullptr);
274 return new Click(this);
275 }
276
277 bool onClick(Click* click) override {
278 this->inval(nullptr);
279 fCenter = click->fCurr;
280 return this->INHERITED::onClick(click);
281 }
282
283private:
284 typedef SampleView INHERITED;
285};
286DEF_SAMPLE( return new BackdropView; )