blob: f6c637db2538c3fec6075724933a94c212bca47f [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"
Mike Reedebfce6d2016-12-12 10:02:12 -050025#include "SkClipOpPriv.h"
reed@android.com8a1c16f2008-12-17 15:59:43 +000026
commit-bot@chromium.org9c9005a2014-04-28 14:55:39 +000027static void make_paint(SkPaint* paint, const SkMatrix& localMatrix) {
reed@android.com8a1c16f2008-12-17 15:59:43 +000028 SkColor colors[] = { 0, SK_ColorWHITE };
senorblanco@chromium.org64cc5792011-05-19 19:58:58 +000029 SkPoint pts[] = { { 0, 0 }, { 0, SK_Scalar1*20 } };
reed8a21c9f2016-03-08 18:50:00 -080030 paint->setShader(SkGradientShader::MakeLinear(pts, colors, nullptr, 2,
31 SkShader::kClamp_TileMode, 0, &localMatrix));
reed374772b2016-10-05 17:33:02 -070032 paint->setBlendMode(SkBlendMode::kDstIn);
reed@android.com8a1c16f2008-12-17 15:59:43 +000033}
34
reed@android.com8a1c16f2008-12-17 15:59:43 +000035// test drawing with strips of fading gradient above and below
36static void test_fade(SkCanvas* canvas) {
37 SkAutoCanvasRestore ar(canvas, true);
38
39 SkRect r;
rmistry@google.comae933ce2012-08-23 18:19:56 +000040
reed@android.com8a1c16f2008-12-17 15:59:43 +000041 SkPaint p;
42 p.setAlpha(0x88);
43
commit-bot@chromium.orge61a86c2013-11-18 16:03:59 +000044 SkAutoCanvasRestore ar2(canvas, false);
reed@android.com8a1c16f2008-12-17 15:59:43 +000045
46 // create the layers
47
48 r.set(0, 0, SkIntToScalar(100), SkIntToScalar(100));
49 canvas->clipRect(r);
rmistry@google.comae933ce2012-08-23 18:19:56 +000050
reed@android.com8a1c16f2008-12-17 15:59:43 +000051 r.fBottom = SkIntToScalar(20);
halcanary96fcdcc2015-08-27 07:41:13 -070052 canvas->saveLayer(&r, nullptr);
reed@android.com8a1c16f2008-12-17 15:59:43 +000053
54 r.fTop = SkIntToScalar(80);
55 r.fBottom = SkIntToScalar(100);
halcanary96fcdcc2015-08-27 07:41:13 -070056 canvas->saveLayer(&r, nullptr);
rmistry@google.comae933ce2012-08-23 18:19:56 +000057
58 // now draw the "content"
reed@android.com8a1c16f2008-12-17 15:59:43 +000059
60 if (true) {
61 r.set(0, 0, SkIntToScalar(100), SkIntToScalar(100));
62
63 canvas->saveLayerAlpha(&r, 0x80);
64
65 SkPaint p;
66 p.setColor(SK_ColorRED);
67 p.setAntiAlias(true);
68 canvas->drawOval(r, p);
rmistry@google.comae933ce2012-08-23 18:19:56 +000069
reed@android.com8a1c16f2008-12-17 15:59:43 +000070 canvas->restore();
71 } else {
72 r.set(0, 0, SkIntToScalar(100), SkIntToScalar(100));
rmistry@google.comae933ce2012-08-23 18:19:56 +000073
reed@android.com8a1c16f2008-12-17 15:59:43 +000074 SkPaint p;
75 p.setColor(SK_ColorRED);
76 p.setAntiAlias(true);
77 canvas->drawOval(r, p);
78 }
rmistry@google.comae933ce2012-08-23 18:19:56 +000079
reed@android.com8a1c16f2008-12-17 15:59:43 +000080// return;
81
reed@android.com8a1c16f2008-12-17 15:59:43 +000082 // now apply an effect
commit-bot@chromium.org9c9005a2014-04-28 14:55:39 +000083 SkMatrix m;
84 m.setScale(SK_Scalar1, -SK_Scalar1);
85 m.postTranslate(0, SkIntToScalar(100));
reed@android.com8a1c16f2008-12-17 15:59:43 +000086
87 SkPaint paint;
commit-bot@chromium.org9c9005a2014-04-28 14:55:39 +000088 make_paint(&paint, m);
reed@android.com8a1c16f2008-12-17 15:59:43 +000089 r.set(0, 0, SkIntToScalar(100), SkIntToScalar(20));
90// SkDebugf("--------- draw top grad\n");
91 canvas->drawRect(r, paint);
92
reed@android.com8a1c16f2008-12-17 15:59:43 +000093 r.fTop = SkIntToScalar(80);
94 r.fBottom = SkIntToScalar(100);
95// SkDebugf("--------- draw bot grad\n");
96 canvas->drawRect(r, paint);
97}
98
reed@android.com8a1c16f2008-12-17 15:59:43 +000099class LayersView : public SkView {
100public:
rmistry@google.comae933ce2012-08-23 18:19:56 +0000101 LayersView() {}
reed@android.com8a1c16f2008-12-17 15:59:43 +0000102
103protected:
104 // overrides from SkEventSink
mtkleinf0599002015-07-13 06:18:39 -0700105 bool onQuery(SkEvent* evt) override {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000106 if (SampleCode::TitleQ(*evt)) {
107 SampleCode::TitleR(evt, "Layers");
108 return true;
109 }
110 return this->INHERITED::onQuery(evt);
111 }
rmistry@google.comae933ce2012-08-23 18:19:56 +0000112
reed@android.com8a1c16f2008-12-17 15:59:43 +0000113 void drawBG(SkCanvas* canvas) {
reed@android.com149e2f62009-05-22 14:39:03 +0000114 canvas->drawColor(SK_ColorGRAY);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000115 }
rmistry@google.comae933ce2012-08-23 18:19:56 +0000116
mtkleinf0599002015-07-13 06:18:39 -0700117 void onDraw(SkCanvas* canvas) override {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000118 this->drawBG(canvas);
rmistry@google.comae933ce2012-08-23 18:19:56 +0000119
reed@android.com149e2f62009-05-22 14:39:03 +0000120 if (true) {
121 SkRect r;
rmistry@google.comae933ce2012-08-23 18:19:56 +0000122 r.set(SkIntToScalar(0), SkIntToScalar(0),
123 SkIntToScalar(220), SkIntToScalar(120));
reed@android.com149e2f62009-05-22 14:39:03 +0000124 SkPaint p;
125 canvas->saveLayer(&r, &p);
126 canvas->drawColor(0xFFFF0000);
reed@android.comf2b98d62010-12-20 18:26:13 +0000127 p.setAlpha(0); // or 0
reed374772b2016-10-05 17:33:02 -0700128 p.setBlendMode(SkBlendMode::kSrc);
reed@android.com149e2f62009-05-22 14:39:03 +0000129 canvas->drawOval(r, p);
130 canvas->restore();
131 return;
132 }
rmistry@google.comae933ce2012-08-23 18:19:56 +0000133
reed@android.com8a1c16f2008-12-17 15:59:43 +0000134 if (false) {
135 SkRect r;
rmistry@google.comae933ce2012-08-23 18:19:56 +0000136 r.set(SkIntToScalar(0), SkIntToScalar(0),
137 SkIntToScalar(220), SkIntToScalar(120));
reed@android.com8a1c16f2008-12-17 15:59:43 +0000138 SkPaint p;
139 p.setAlpha(0x88);
140 p.setAntiAlias(true);
rmistry@google.comae933ce2012-08-23 18:19:56 +0000141
reed@android.com8a1c16f2008-12-17 15:59:43 +0000142 if (true) {
143 canvas->saveLayer(&r, &p);
144 p.setColor(0xFFFF0000);
145 canvas->drawOval(r, p);
146 canvas->restore();
147 }
148
149 p.setColor(0xFF0000FF);
150 r.offset(SkIntToScalar(20), SkIntToScalar(50));
151 canvas->drawOval(r, p);
152 }
153
154 if (false) {
155 SkPaint p;
156 p.setAlpha(0x88);
157 p.setAntiAlias(true);
158
159 canvas->translate(SkIntToScalar(300), 0);
160
161 SkRect r;
rmistry@google.comae933ce2012-08-23 18:19:56 +0000162 r.set(SkIntToScalar(0), SkIntToScalar(0),
163 SkIntToScalar(220), SkIntToScalar(60));
reed@android.com8a1c16f2008-12-17 15:59:43 +0000164
commit-bot@chromium.org091a5942014-04-18 14:19:31 +0000165 canvas->saveLayer(&r, &p);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000166
rmistry@google.comae933ce2012-08-23 18:19:56 +0000167 r.set(SkIntToScalar(0), SkIntToScalar(0),
168 SkIntToScalar(220), SkIntToScalar(120));
reed@android.com8a1c16f2008-12-17 15:59:43 +0000169 p.setColor(SK_ColorBLUE);
170 canvas->drawOval(r, p);
171 canvas->restore();
172 return;
173 }
rmistry@google.comae933ce2012-08-23 18:19:56 +0000174
reed@android.com8a1c16f2008-12-17 15:59:43 +0000175 test_fade(canvas);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000176 }
rmistry@google.comae933ce2012-08-23 18:19:56 +0000177
reed@android.com8a1c16f2008-12-17 15:59:43 +0000178private:
179 typedef SkView INHERITED;
180};
reedbfd5f172016-01-07 11:28:08 -0800181DEF_SAMPLE( return new LayersView; )
reed@android.com8a1c16f2008-12-17 15:59:43 +0000182
183//////////////////////////////////////////////////////////////////////////////
184
reedbfd5f172016-01-07 11:28:08 -0800185#include "SkBlurImageFilter.h"
186#include "SkMatrixConvolutionImageFilter.h"
187#include "SkMorphologyImageFilter.h"
188
189#include "Resources.h"
190#include "SkAnimTimer.h"
191
192class BackdropView : public SampleView {
193 SkPoint fCenter;
194 SkScalar fAngle;
reed9ce9d672016-03-17 10:51:11 -0700195 sk_sp<SkImage> fImage;
robertphillipsfc11b0a2016-04-05 09:09:36 -0700196 sk_sp<SkImageFilter> fFilter;
reedbfd5f172016-01-07 11:28:08 -0800197public:
198 BackdropView() {
199 fCenter.set(200, 150);
200 fAngle = 0;
Hal Canaryc465d132017-12-08 10:21:31 -0500201 fImage = GetResourceAsImage("images/mandrill_512.png");
robertphillipsfc11b0a2016-04-05 09:09:36 -0700202 fFilter = SkDilateImageFilter::Make(8, 8, nullptr);
reedbfd5f172016-01-07 11:28:08 -0800203 }
204
205protected:
206 // overrides from SkEventSink
207 bool onQuery(SkEvent* evt) override {
208 if (SampleCode::TitleQ(*evt)) {
209 SampleCode::TitleR(evt, "Backdrop");
210 return true;
211 }
212 return this->INHERITED::onQuery(evt);
213 }
214
215 void onDrawContent(SkCanvas* canvas) override {
reed9ce9d672016-03-17 10:51:11 -0700216 canvas->drawImage(fImage.get(), 0, 0, nullptr);
reedbfd5f172016-01-07 11:28:08 -0800217
218 const SkScalar w = 250;
219 const SkScalar h = 150;
220 SkPath path;
221 path.addOval(SkRect::MakeXYWH(-w/2, -h/2, w, h));
222 SkMatrix m;
223 m.setRotate(fAngle);
224 m.postTranslate(fCenter.x(), fCenter.y());
225 path.transform(m);
226
Mike Reedc1f77742016-12-09 09:00:50 -0500227 canvas->clipPath(path, kIntersect_SkClipOp, true);
reedbfd5f172016-01-07 11:28:08 -0800228 const SkRect bounds = path.getBounds();
229
230 SkPaint paint;
231 paint.setAlpha(0xCC);
Florin Malita53f77bd2017-04-28 13:48:37 -0400232 canvas->saveLayer({ &bounds, &paint, fFilter.get(), nullptr, nullptr, 0 });
reedbfd5f172016-01-07 11:28:08 -0800233
234 canvas->restore();
235 }
236
237 bool onAnimate(const SkAnimTimer& timer) override {
238 fAngle = SkDoubleToScalar(fmod(timer.secs() * 360 / 5, 360));
239 return true;
240 }
241
242 SkView::Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned modi) override {
reedbfd5f172016-01-07 11:28:08 -0800243 return new Click(this);
244 }
245
246 bool onClick(Click* click) override {
reedbfd5f172016-01-07 11:28:08 -0800247 fCenter = click->fCurr;
248 return this->INHERITED::onClick(click);
249 }
250
251private:
252 typedef SampleView INHERITED;
253};
254DEF_SAMPLE( return new BackdropView; )