blob: e00d9e20fad442a95d76bfc7d25649c9fd50f5fd [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"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050018#include "include/effects/SkGradientShader.h"
19#include "include/utils/SkCamera.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050020#include "samplecode/Sample.h"
21#include "src/core/SkClipOpPriv.h"
22#include "src/utils/SkUTF.h"
reed@android.com8a1c16f2008-12-17 15:59:43 +000023
commit-bot@chromium.org9c9005a2014-04-28 14:55:39 +000024static void make_paint(SkPaint* paint, const SkMatrix& localMatrix) {
reed@android.com8a1c16f2008-12-17 15:59:43 +000025 SkColor colors[] = { 0, SK_ColorWHITE };
senorblanco@chromium.org64cc5792011-05-19 19:58:58 +000026 SkPoint pts[] = { { 0, 0 }, { 0, SK_Scalar1*20 } };
reed8a21c9f2016-03-08 18:50:00 -080027 paint->setShader(SkGradientShader::MakeLinear(pts, colors, nullptr, 2,
Mike Reedfae8fce2019-04-03 10:27:45 -040028 SkTileMode::kClamp, 0, &localMatrix));
reed374772b2016-10-05 17:33:02 -070029 paint->setBlendMode(SkBlendMode::kDstIn);
reed@android.com8a1c16f2008-12-17 15:59:43 +000030}
31
reed@android.com8a1c16f2008-12-17 15:59:43 +000032// test drawing with strips of fading gradient above and below
33static void test_fade(SkCanvas* canvas) {
34 SkAutoCanvasRestore ar(canvas, true);
35
36 SkRect r;
rmistry@google.comae933ce2012-08-23 18:19:56 +000037
commit-bot@chromium.orge61a86c2013-11-18 16:03:59 +000038 SkAutoCanvasRestore ar2(canvas, false);
reed@android.com8a1c16f2008-12-17 15:59:43 +000039
40 // create the layers
41
Mike Reed92b33352019-08-24 19:39:13 -040042 r.setWH(100, 100);
reed@android.com8a1c16f2008-12-17 15:59:43 +000043 canvas->clipRect(r);
rmistry@google.comae933ce2012-08-23 18:19:56 +000044
reed@android.com8a1c16f2008-12-17 15:59:43 +000045 r.fBottom = SkIntToScalar(20);
halcanary96fcdcc2015-08-27 07:41:13 -070046 canvas->saveLayer(&r, nullptr);
reed@android.com8a1c16f2008-12-17 15:59:43 +000047
48 r.fTop = SkIntToScalar(80);
49 r.fBottom = SkIntToScalar(100);
halcanary96fcdcc2015-08-27 07:41:13 -070050 canvas->saveLayer(&r, nullptr);
rmistry@google.comae933ce2012-08-23 18:19:56 +000051
52 // now draw the "content"
reed@android.com8a1c16f2008-12-17 15:59:43 +000053
54 if (true) {
Mike Reed92b33352019-08-24 19:39:13 -040055 r.setWH(100, 100);
reed@android.com8a1c16f2008-12-17 15:59:43 +000056
57 canvas->saveLayerAlpha(&r, 0x80);
58
59 SkPaint p;
60 p.setColor(SK_ColorRED);
61 p.setAntiAlias(true);
62 canvas->drawOval(r, p);
rmistry@google.comae933ce2012-08-23 18:19:56 +000063
reed@android.com8a1c16f2008-12-17 15:59:43 +000064 canvas->restore();
65 } else {
Mike Reed92b33352019-08-24 19:39:13 -040066 r.setWH(100, 100);
rmistry@google.comae933ce2012-08-23 18:19:56 +000067
reed@android.com8a1c16f2008-12-17 15:59:43 +000068 SkPaint p;
69 p.setColor(SK_ColorRED);
70 p.setAntiAlias(true);
71 canvas->drawOval(r, p);
72 }
rmistry@google.comae933ce2012-08-23 18:19:56 +000073
reed@android.com8a1c16f2008-12-17 15:59:43 +000074// return;
75
reed@android.com8a1c16f2008-12-17 15:59:43 +000076 // now apply an effect
commit-bot@chromium.org9c9005a2014-04-28 14:55:39 +000077 SkMatrix m;
78 m.setScale(SK_Scalar1, -SK_Scalar1);
79 m.postTranslate(0, SkIntToScalar(100));
reed@android.com8a1c16f2008-12-17 15:59:43 +000080
81 SkPaint paint;
commit-bot@chromium.org9c9005a2014-04-28 14:55:39 +000082 make_paint(&paint, m);
Mike Reed92b33352019-08-24 19:39:13 -040083 r.setWH(100, 20);
reed@android.com8a1c16f2008-12-17 15:59:43 +000084// SkDebugf("--------- draw top grad\n");
85 canvas->drawRect(r, paint);
86
reed@android.com8a1c16f2008-12-17 15:59:43 +000087 r.fTop = SkIntToScalar(80);
88 r.fBottom = SkIntToScalar(100);
89// SkDebugf("--------- draw bot grad\n");
90 canvas->drawRect(r, paint);
91}
92
Ben Wagnerb2c4ea62018-08-08 11:36:17 -040093class LayersView : public Sample {
reed@android.com8a1c16f2008-12-17 15:59:43 +000094public:
rmistry@google.comae933ce2012-08-23 18:19:56 +000095 LayersView() {}
reed@android.com8a1c16f2008-12-17 15:59:43 +000096
97protected:
Hal Canary8a027312019-07-03 10:55:44 -040098 SkString name() override { return SkString("Layers"); }
rmistry@google.comae933ce2012-08-23 18:19:56 +000099
reed@android.com8a1c16f2008-12-17 15:59:43 +0000100 void drawBG(SkCanvas* canvas) {
reed@android.com149e2f62009-05-22 14:39:03 +0000101 canvas->drawColor(SK_ColorGRAY);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000102 }
rmistry@google.comae933ce2012-08-23 18:19:56 +0000103
Ben Wagnerb2c4ea62018-08-08 11:36:17 -0400104 void onDrawContent(SkCanvas* canvas) override {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000105 this->drawBG(canvas);
rmistry@google.comae933ce2012-08-23 18:19:56 +0000106
reed@android.com149e2f62009-05-22 14:39:03 +0000107 if (true) {
108 SkRect r;
Mike Reed92b33352019-08-24 19:39:13 -0400109 r.setWH(220, 120);
reed@android.com149e2f62009-05-22 14:39:03 +0000110 SkPaint p;
111 canvas->saveLayer(&r, &p);
112 canvas->drawColor(0xFFFF0000);
reed@android.comf2b98d62010-12-20 18:26:13 +0000113 p.setAlpha(0); // or 0
reed374772b2016-10-05 17:33:02 -0700114 p.setBlendMode(SkBlendMode::kSrc);
reed@android.com149e2f62009-05-22 14:39:03 +0000115 canvas->drawOval(r, p);
116 canvas->restore();
117 return;
118 }
rmistry@google.comae933ce2012-08-23 18:19:56 +0000119
reed@android.com8a1c16f2008-12-17 15:59:43 +0000120 if (false) {
121 SkRect r;
Mike Reed92b33352019-08-24 19:39:13 -0400122 r.setWH(220, 120);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000123 SkPaint p;
124 p.setAlpha(0x88);
125 p.setAntiAlias(true);
rmistry@google.comae933ce2012-08-23 18:19:56 +0000126
reed@android.com8a1c16f2008-12-17 15:59:43 +0000127 if (true) {
128 canvas->saveLayer(&r, &p);
129 p.setColor(0xFFFF0000);
130 canvas->drawOval(r, p);
131 canvas->restore();
132 }
133
134 p.setColor(0xFF0000FF);
135 r.offset(SkIntToScalar(20), SkIntToScalar(50));
136 canvas->drawOval(r, p);
137 }
138
139 if (false) {
140 SkPaint p;
141 p.setAlpha(0x88);
142 p.setAntiAlias(true);
143
144 canvas->translate(SkIntToScalar(300), 0);
145
146 SkRect r;
Mike Reed92b33352019-08-24 19:39:13 -0400147 r.setWH(220, 60);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000148
commit-bot@chromium.org091a5942014-04-18 14:19:31 +0000149 canvas->saveLayer(&r, &p);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000150
Mike Reed92b33352019-08-24 19:39:13 -0400151 r.setWH(220, 120);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000152 p.setColor(SK_ColorBLUE);
153 canvas->drawOval(r, p);
154 canvas->restore();
155 return;
156 }
rmistry@google.comae933ce2012-08-23 18:19:56 +0000157
reed@android.com8a1c16f2008-12-17 15:59:43 +0000158 test_fade(canvas);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000159 }
rmistry@google.comae933ce2012-08-23 18:19:56 +0000160
reed@android.com8a1c16f2008-12-17 15:59:43 +0000161private:
John Stiles7571f9e2020-09-02 22:42:33 -0400162 using INHERITED = Sample;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000163};
reedbfd5f172016-01-07 11:28:08 -0800164DEF_SAMPLE( return new LayersView; )
reed@android.com8a1c16f2008-12-17 15:59:43 +0000165
166//////////////////////////////////////////////////////////////////////////////
167
Michael Ludwiga8611062019-08-01 16:38:24 -0400168#include "include/effects/SkImageFilters.h"
reedbfd5f172016-01-07 11:28:08 -0800169
Mike Kleinc0bd9f92019-04-23 12:05:21 -0500170#include "tools/Resources.h"
reedbfd5f172016-01-07 11:28:08 -0800171
Ben Wagnerb2c4ea62018-08-08 11:36:17 -0400172class BackdropView : public Sample {
reedbfd5f172016-01-07 11:28:08 -0800173 SkPoint fCenter;
174 SkScalar fAngle;
reed9ce9d672016-03-17 10:51:11 -0700175 sk_sp<SkImage> fImage;
robertphillipsfc11b0a2016-04-05 09:09:36 -0700176 sk_sp<SkImageFilter> fFilter;
reedbfd5f172016-01-07 11:28:08 -0800177public:
178 BackdropView() {
179 fCenter.set(200, 150);
180 fAngle = 0;
Hal Canaryc465d132017-12-08 10:21:31 -0500181 fImage = GetResourceAsImage("images/mandrill_512.png");
Michael Ludwiga8611062019-08-01 16:38:24 -0400182 fFilter = SkImageFilters::Dilate(8, 8, nullptr);
reedbfd5f172016-01-07 11:28:08 -0800183 }
184
185protected:
Hal Canary8a027312019-07-03 10:55:44 -0400186 SkString name() override { return SkString("Backdrop"); }
reedbfd5f172016-01-07 11:28:08 -0800187
188 void onDrawContent(SkCanvas* canvas) override {
Mike Reed34c56a52021-01-22 15:26:41 -0500189 canvas->drawImage(fImage.get(), 0, 0);
reedbfd5f172016-01-07 11:28:08 -0800190
191 const SkScalar w = 250;
192 const SkScalar h = 150;
193 SkPath path;
194 path.addOval(SkRect::MakeXYWH(-w/2, -h/2, w, h));
195 SkMatrix m;
196 m.setRotate(fAngle);
197 m.postTranslate(fCenter.x(), fCenter.y());
198 path.transform(m);
199
Mike Reedc1f77742016-12-09 09:00:50 -0500200 canvas->clipPath(path, kIntersect_SkClipOp, true);
reedbfd5f172016-01-07 11:28:08 -0800201 const SkRect bounds = path.getBounds();
202
203 SkPaint paint;
204 paint.setAlpha(0xCC);
Mike Reedb42a3272020-05-30 16:02:14 -0400205 canvas->saveLayer(SkCanvas::SaveLayerRec(&bounds, &paint, fFilter.get(), 0));
reedbfd5f172016-01-07 11:28:08 -0800206
207 canvas->restore();
208 }
209
Hal Canary41248072019-07-11 16:32:53 -0400210 bool onAnimate(double nanos) override {
211 fAngle = SkDoubleToScalar(fmod(1e-9 * nanos * 360 / 5, 360));
reedbfd5f172016-01-07 11:28:08 -0800212 return true;
213 }
214
Hal Canaryb1f411a2019-08-29 10:39:22 -0400215 Sample::Click* onFindClickHandler(SkScalar x, SkScalar y, skui::ModifierKey modi) override {
Hal Canaryfcf63592019-07-12 11:32:43 -0400216 return new Click();
reedbfd5f172016-01-07 11:28:08 -0800217 }
218
219 bool onClick(Click* click) override {
reedbfd5f172016-01-07 11:28:08 -0800220 fCenter = click->fCurr;
Hal Canaryfcf63592019-07-12 11:32:43 -0400221 return true;
reedbfd5f172016-01-07 11:28:08 -0800222 }
223
224private:
John Stiles7571f9e2020-09-02 22:42:33 -0400225 using INHERITED = Sample;
reedbfd5f172016-01-07 11:28:08 -0800226};
227DEF_SAMPLE( return new BackdropView; )