blob: bcdcdae02a7f599de867b75eecb25c8e4eef1597 [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
Mike Kleinc0bd9f92019-04-23 12:05:21 -05008#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/SkTime.h"
17#include "include/core/SkTypeface.h"
18#include "include/effects/SkBlurMaskFilter.h"
19#include "include/effects/SkGradientShader.h"
20#include "include/utils/SkCamera.h"
21#include "include/utils/SkInterpolator.h"
22#include "samplecode/Sample.h"
23#include "src/core/SkClipOpPriv.h"
24#include "src/utils/SkUTF.h"
reed@android.com8a1c16f2008-12-17 15:59:43 +000025
commit-bot@chromium.org9c9005a2014-04-28 14:55:39 +000026static void make_paint(SkPaint* paint, const SkMatrix& localMatrix) {
reed@android.com8a1c16f2008-12-17 15:59:43 +000027 SkColor colors[] = { 0, SK_ColorWHITE };
senorblanco@chromium.org64cc5792011-05-19 19:58:58 +000028 SkPoint pts[] = { { 0, 0 }, { 0, SK_Scalar1*20 } };
reed8a21c9f2016-03-08 18:50:00 -080029 paint->setShader(SkGradientShader::MakeLinear(pts, colors, nullptr, 2,
Mike Reedfae8fce2019-04-03 10:27:45 -040030 SkTileMode::kClamp, 0, &localMatrix));
reed374772b2016-10-05 17:33:02 -070031 paint->setBlendMode(SkBlendMode::kDstIn);
reed@android.com8a1c16f2008-12-17 15:59:43 +000032}
33
reed@android.com8a1c16f2008-12-17 15:59:43 +000034// test drawing with strips of fading gradient above and below
35static void test_fade(SkCanvas* canvas) {
36 SkAutoCanvasRestore ar(canvas, true);
37
38 SkRect r;
rmistry@google.comae933ce2012-08-23 18:19:56 +000039
reed@android.com8a1c16f2008-12-17 15:59:43 +000040 SkPaint p;
41 p.setAlpha(0x88);
42
commit-bot@chromium.orge61a86c2013-11-18 16:03:59 +000043 SkAutoCanvasRestore ar2(canvas, false);
reed@android.com8a1c16f2008-12-17 15:59:43 +000044
45 // create the layers
46
47 r.set(0, 0, SkIntToScalar(100), SkIntToScalar(100));
48 canvas->clipRect(r);
rmistry@google.comae933ce2012-08-23 18:19:56 +000049
reed@android.com8a1c16f2008-12-17 15:59:43 +000050 r.fBottom = SkIntToScalar(20);
halcanary96fcdcc2015-08-27 07:41:13 -070051 canvas->saveLayer(&r, nullptr);
reed@android.com8a1c16f2008-12-17 15:59:43 +000052
53 r.fTop = SkIntToScalar(80);
54 r.fBottom = SkIntToScalar(100);
halcanary96fcdcc2015-08-27 07:41:13 -070055 canvas->saveLayer(&r, nullptr);
rmistry@google.comae933ce2012-08-23 18:19:56 +000056
57 // now draw the "content"
reed@android.com8a1c16f2008-12-17 15:59:43 +000058
59 if (true) {
60 r.set(0, 0, SkIntToScalar(100), SkIntToScalar(100));
61
62 canvas->saveLayerAlpha(&r, 0x80);
63
64 SkPaint p;
65 p.setColor(SK_ColorRED);
66 p.setAntiAlias(true);
67 canvas->drawOval(r, p);
rmistry@google.comae933ce2012-08-23 18:19:56 +000068
reed@android.com8a1c16f2008-12-17 15:59:43 +000069 canvas->restore();
70 } else {
71 r.set(0, 0, SkIntToScalar(100), SkIntToScalar(100));
rmistry@google.comae933ce2012-08-23 18:19:56 +000072
reed@android.com8a1c16f2008-12-17 15:59:43 +000073 SkPaint p;
74 p.setColor(SK_ColorRED);
75 p.setAntiAlias(true);
76 canvas->drawOval(r, p);
77 }
rmistry@google.comae933ce2012-08-23 18:19:56 +000078
reed@android.com8a1c16f2008-12-17 15:59:43 +000079// return;
80
reed@android.com8a1c16f2008-12-17 15:59:43 +000081 // now apply an effect
commit-bot@chromium.org9c9005a2014-04-28 14:55:39 +000082 SkMatrix m;
83 m.setScale(SK_Scalar1, -SK_Scalar1);
84 m.postTranslate(0, SkIntToScalar(100));
reed@android.com8a1c16f2008-12-17 15:59:43 +000085
86 SkPaint paint;
commit-bot@chromium.org9c9005a2014-04-28 14:55:39 +000087 make_paint(&paint, m);
reed@android.com8a1c16f2008-12-17 15:59:43 +000088 r.set(0, 0, SkIntToScalar(100), SkIntToScalar(20));
89// SkDebugf("--------- draw top grad\n");
90 canvas->drawRect(r, paint);
91
reed@android.com8a1c16f2008-12-17 15:59:43 +000092 r.fTop = SkIntToScalar(80);
93 r.fBottom = SkIntToScalar(100);
94// SkDebugf("--------- draw bot grad\n");
95 canvas->drawRect(r, paint);
96}
97
Ben Wagnerb2c4ea62018-08-08 11:36:17 -040098class LayersView : public Sample {
reed@android.com8a1c16f2008-12-17 15:59:43 +000099public:
rmistry@google.comae933ce2012-08-23 18:19:56 +0000100 LayersView() {}
reed@android.com8a1c16f2008-12-17 15:59:43 +0000101
102protected:
Ben Wagnerb2c4ea62018-08-08 11:36:17 -0400103 bool onQuery(Sample::Event* evt) override {
104 if (Sample::TitleQ(*evt)) {
105 Sample::TitleR(evt, "Layers");
reed@android.com8a1c16f2008-12-17 15:59:43 +0000106 return true;
107 }
108 return this->INHERITED::onQuery(evt);
109 }
rmistry@google.comae933ce2012-08-23 18:19:56 +0000110
reed@android.com8a1c16f2008-12-17 15:59:43 +0000111 void drawBG(SkCanvas* canvas) {
reed@android.com149e2f62009-05-22 14:39:03 +0000112 canvas->drawColor(SK_ColorGRAY);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000113 }
rmistry@google.comae933ce2012-08-23 18:19:56 +0000114
Ben Wagnerb2c4ea62018-08-08 11:36:17 -0400115 void onDrawContent(SkCanvas* canvas) override {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000116 this->drawBG(canvas);
rmistry@google.comae933ce2012-08-23 18:19:56 +0000117
reed@android.com149e2f62009-05-22 14:39:03 +0000118 if (true) {
119 SkRect r;
rmistry@google.comae933ce2012-08-23 18:19:56 +0000120 r.set(SkIntToScalar(0), SkIntToScalar(0),
121 SkIntToScalar(220), SkIntToScalar(120));
reed@android.com149e2f62009-05-22 14:39:03 +0000122 SkPaint p;
123 canvas->saveLayer(&r, &p);
124 canvas->drawColor(0xFFFF0000);
reed@android.comf2b98d62010-12-20 18:26:13 +0000125 p.setAlpha(0); // or 0
reed374772b2016-10-05 17:33:02 -0700126 p.setBlendMode(SkBlendMode::kSrc);
reed@android.com149e2f62009-05-22 14:39:03 +0000127 canvas->drawOval(r, p);
128 canvas->restore();
129 return;
130 }
rmistry@google.comae933ce2012-08-23 18:19:56 +0000131
reed@android.com8a1c16f2008-12-17 15:59:43 +0000132 if (false) {
133 SkRect r;
rmistry@google.comae933ce2012-08-23 18:19:56 +0000134 r.set(SkIntToScalar(0), SkIntToScalar(0),
135 SkIntToScalar(220), SkIntToScalar(120));
reed@android.com8a1c16f2008-12-17 15:59:43 +0000136 SkPaint p;
137 p.setAlpha(0x88);
138 p.setAntiAlias(true);
rmistry@google.comae933ce2012-08-23 18:19:56 +0000139
reed@android.com8a1c16f2008-12-17 15:59:43 +0000140 if (true) {
141 canvas->saveLayer(&r, &p);
142 p.setColor(0xFFFF0000);
143 canvas->drawOval(r, p);
144 canvas->restore();
145 }
146
147 p.setColor(0xFF0000FF);
148 r.offset(SkIntToScalar(20), SkIntToScalar(50));
149 canvas->drawOval(r, p);
150 }
151
152 if (false) {
153 SkPaint p;
154 p.setAlpha(0x88);
155 p.setAntiAlias(true);
156
157 canvas->translate(SkIntToScalar(300), 0);
158
159 SkRect r;
rmistry@google.comae933ce2012-08-23 18:19:56 +0000160 r.set(SkIntToScalar(0), SkIntToScalar(0),
161 SkIntToScalar(220), SkIntToScalar(60));
reed@android.com8a1c16f2008-12-17 15:59:43 +0000162
commit-bot@chromium.org091a5942014-04-18 14:19:31 +0000163 canvas->saveLayer(&r, &p);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000164
rmistry@google.comae933ce2012-08-23 18:19:56 +0000165 r.set(SkIntToScalar(0), SkIntToScalar(0),
166 SkIntToScalar(220), SkIntToScalar(120));
reed@android.com8a1c16f2008-12-17 15:59:43 +0000167 p.setColor(SK_ColorBLUE);
168 canvas->drawOval(r, p);
169 canvas->restore();
170 return;
171 }
rmistry@google.comae933ce2012-08-23 18:19:56 +0000172
reed@android.com8a1c16f2008-12-17 15:59:43 +0000173 test_fade(canvas);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000174 }
rmistry@google.comae933ce2012-08-23 18:19:56 +0000175
reed@android.com8a1c16f2008-12-17 15:59:43 +0000176private:
Ben Wagnerb2c4ea62018-08-08 11:36:17 -0400177 typedef Sample INHERITED;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000178};
reedbfd5f172016-01-07 11:28:08 -0800179DEF_SAMPLE( return new LayersView; )
reed@android.com8a1c16f2008-12-17 15:59:43 +0000180
181//////////////////////////////////////////////////////////////////////////////
182
Mike Kleinc0bd9f92019-04-23 12:05:21 -0500183#include "include/effects/SkBlurImageFilter.h"
184#include "include/effects/SkMatrixConvolutionImageFilter.h"
185#include "include/effects/SkMorphologyImageFilter.h"
reedbfd5f172016-01-07 11:28:08 -0800186
Mike Kleinc0bd9f92019-04-23 12:05:21 -0500187#include "tools/Resources.h"
188#include "tools/timer/AnimTimer.h"
reedbfd5f172016-01-07 11:28:08 -0800189
Ben Wagnerb2c4ea62018-08-08 11:36:17 -0400190class BackdropView : public Sample {
reedbfd5f172016-01-07 11:28:08 -0800191 SkPoint fCenter;
192 SkScalar fAngle;
reed9ce9d672016-03-17 10:51:11 -0700193 sk_sp<SkImage> fImage;
robertphillipsfc11b0a2016-04-05 09:09:36 -0700194 sk_sp<SkImageFilter> fFilter;
reedbfd5f172016-01-07 11:28:08 -0800195public:
196 BackdropView() {
197 fCenter.set(200, 150);
198 fAngle = 0;
Hal Canaryc465d132017-12-08 10:21:31 -0500199 fImage = GetResourceAsImage("images/mandrill_512.png");
robertphillipsfc11b0a2016-04-05 09:09:36 -0700200 fFilter = SkDilateImageFilter::Make(8, 8, nullptr);
reedbfd5f172016-01-07 11:28:08 -0800201 }
202
203protected:
Ben Wagnerb2c4ea62018-08-08 11:36:17 -0400204 bool onQuery(Sample::Event* evt) override {
205 if (Sample::TitleQ(*evt)) {
206 Sample::TitleR(evt, "Backdrop");
reedbfd5f172016-01-07 11:28:08 -0800207 return true;
208 }
209 return this->INHERITED::onQuery(evt);
210 }
211
212 void onDrawContent(SkCanvas* canvas) override {
reed9ce9d672016-03-17 10:51:11 -0700213 canvas->drawImage(fImage.get(), 0, 0, nullptr);
reedbfd5f172016-01-07 11:28:08 -0800214
215 const SkScalar w = 250;
216 const SkScalar h = 150;
217 SkPath path;
218 path.addOval(SkRect::MakeXYWH(-w/2, -h/2, w, h));
219 SkMatrix m;
220 m.setRotate(fAngle);
221 m.postTranslate(fCenter.x(), fCenter.y());
222 path.transform(m);
223
Mike Reedc1f77742016-12-09 09:00:50 -0500224 canvas->clipPath(path, kIntersect_SkClipOp, true);
reedbfd5f172016-01-07 11:28:08 -0800225 const SkRect bounds = path.getBounds();
226
227 SkPaint paint;
228 paint.setAlpha(0xCC);
Florin Malita53f77bd2017-04-28 13:48:37 -0400229 canvas->saveLayer({ &bounds, &paint, fFilter.get(), nullptr, nullptr, 0 });
reedbfd5f172016-01-07 11:28:08 -0800230
231 canvas->restore();
232 }
233
Mike Kleincd5104e2019-03-20 11:55:08 -0500234 bool onAnimate(const AnimTimer& timer) override {
reedbfd5f172016-01-07 11:28:08 -0800235 fAngle = SkDoubleToScalar(fmod(timer.secs() * 360 / 5, 360));
236 return true;
237 }
238
Ben Wagnerb2c4ea62018-08-08 11:36:17 -0400239 Sample::Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned modi) override {
reedbfd5f172016-01-07 11:28:08 -0800240 return new Click(this);
241 }
242
243 bool onClick(Click* click) override {
reedbfd5f172016-01-07 11:28:08 -0800244 fCenter = click->fCurr;
245 return this->INHERITED::onClick(click);
246 }
247
248private:
Ben Wagnerb2c4ea62018-08-08 11:36:17 -0400249 typedef Sample INHERITED;
reedbfd5f172016-01-07 11:28:08 -0800250};
251DEF_SAMPLE( return new BackdropView; )