blob: f7aa5e71c4b4d63a46cccbcca69f3ee5db5c774a [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"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050021#include "src/utils/SkUTF.h"
reed@android.com8a1c16f2008-12-17 15:59:43 +000022
commit-bot@chromium.org9c9005a2014-04-28 14:55:39 +000023static void make_paint(SkPaint* paint, const SkMatrix& localMatrix) {
reed@android.com8a1c16f2008-12-17 15:59:43 +000024 SkColor colors[] = { 0, SK_ColorWHITE };
senorblanco@chromium.org64cc5792011-05-19 19:58:58 +000025 SkPoint pts[] = { { 0, 0 }, { 0, SK_Scalar1*20 } };
reed8a21c9f2016-03-08 18:50:00 -080026 paint->setShader(SkGradientShader::MakeLinear(pts, colors, nullptr, 2,
Mike Reedfae8fce2019-04-03 10:27:45 -040027 SkTileMode::kClamp, 0, &localMatrix));
reed374772b2016-10-05 17:33:02 -070028 paint->setBlendMode(SkBlendMode::kDstIn);
reed@android.com8a1c16f2008-12-17 15:59:43 +000029}
30
reed@android.com8a1c16f2008-12-17 15:59:43 +000031// test drawing with strips of fading gradient above and below
32static void test_fade(SkCanvas* canvas) {
33 SkAutoCanvasRestore ar(canvas, true);
34
35 SkRect r;
rmistry@google.comae933ce2012-08-23 18:19:56 +000036
commit-bot@chromium.orge61a86c2013-11-18 16:03:59 +000037 SkAutoCanvasRestore ar2(canvas, false);
reed@android.com8a1c16f2008-12-17 15:59:43 +000038
39 // create the layers
40
Mike Reed92b33352019-08-24 19:39:13 -040041 r.setWH(100, 100);
reed@android.com8a1c16f2008-12-17 15:59:43 +000042 canvas->clipRect(r);
rmistry@google.comae933ce2012-08-23 18:19:56 +000043
reed@android.com8a1c16f2008-12-17 15:59:43 +000044 r.fBottom = SkIntToScalar(20);
halcanary96fcdcc2015-08-27 07:41:13 -070045 canvas->saveLayer(&r, nullptr);
reed@android.com8a1c16f2008-12-17 15:59:43 +000046
47 r.fTop = SkIntToScalar(80);
48 r.fBottom = SkIntToScalar(100);
halcanary96fcdcc2015-08-27 07:41:13 -070049 canvas->saveLayer(&r, nullptr);
rmistry@google.comae933ce2012-08-23 18:19:56 +000050
51 // now draw the "content"
reed@android.com8a1c16f2008-12-17 15:59:43 +000052
53 if (true) {
Mike Reed92b33352019-08-24 19:39:13 -040054 r.setWH(100, 100);
reed@android.com8a1c16f2008-12-17 15:59:43 +000055
56 canvas->saveLayerAlpha(&r, 0x80);
57
58 SkPaint p;
59 p.setColor(SK_ColorRED);
60 p.setAntiAlias(true);
61 canvas->drawOval(r, p);
rmistry@google.comae933ce2012-08-23 18:19:56 +000062
reed@android.com8a1c16f2008-12-17 15:59:43 +000063 canvas->restore();
64 } else {
Mike Reed92b33352019-08-24 19:39:13 -040065 r.setWH(100, 100);
rmistry@google.comae933ce2012-08-23 18:19:56 +000066
reed@android.com8a1c16f2008-12-17 15:59:43 +000067 SkPaint p;
68 p.setColor(SK_ColorRED);
69 p.setAntiAlias(true);
70 canvas->drawOval(r, p);
71 }
rmistry@google.comae933ce2012-08-23 18:19:56 +000072
reed@android.com8a1c16f2008-12-17 15:59:43 +000073// return;
74
reed@android.com8a1c16f2008-12-17 15:59:43 +000075 // now apply an effect
commit-bot@chromium.org9c9005a2014-04-28 14:55:39 +000076 SkMatrix m;
77 m.setScale(SK_Scalar1, -SK_Scalar1);
78 m.postTranslate(0, SkIntToScalar(100));
reed@android.com8a1c16f2008-12-17 15:59:43 +000079
80 SkPaint paint;
commit-bot@chromium.org9c9005a2014-04-28 14:55:39 +000081 make_paint(&paint, m);
Mike Reed92b33352019-08-24 19:39:13 -040082 r.setWH(100, 20);
reed@android.com8a1c16f2008-12-17 15:59:43 +000083// SkDebugf("--------- draw top grad\n");
84 canvas->drawRect(r, paint);
85
reed@android.com8a1c16f2008-12-17 15:59:43 +000086 r.fTop = SkIntToScalar(80);
87 r.fBottom = SkIntToScalar(100);
88// SkDebugf("--------- draw bot grad\n");
89 canvas->drawRect(r, paint);
90}
91
Ben Wagnerb2c4ea62018-08-08 11:36:17 -040092class LayersView : public Sample {
reed@android.com8a1c16f2008-12-17 15:59:43 +000093public:
rmistry@google.comae933ce2012-08-23 18:19:56 +000094 LayersView() {}
reed@android.com8a1c16f2008-12-17 15:59:43 +000095
96protected:
Hal Canary8a027312019-07-03 10:55:44 -040097 SkString name() override { return SkString("Layers"); }
rmistry@google.comae933ce2012-08-23 18:19:56 +000098
reed@android.com8a1c16f2008-12-17 15:59:43 +000099 void drawBG(SkCanvas* canvas) {
reed@android.com149e2f62009-05-22 14:39:03 +0000100 canvas->drawColor(SK_ColorGRAY);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000101 }
rmistry@google.comae933ce2012-08-23 18:19:56 +0000102
Ben Wagnerb2c4ea62018-08-08 11:36:17 -0400103 void onDrawContent(SkCanvas* canvas) override {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000104 this->drawBG(canvas);
rmistry@google.comae933ce2012-08-23 18:19:56 +0000105
reed@android.com149e2f62009-05-22 14:39:03 +0000106 if (true) {
107 SkRect r;
Mike Reed92b33352019-08-24 19:39:13 -0400108 r.setWH(220, 120);
reed@android.com149e2f62009-05-22 14:39:03 +0000109 SkPaint p;
110 canvas->saveLayer(&r, &p);
111 canvas->drawColor(0xFFFF0000);
reed@android.comf2b98d62010-12-20 18:26:13 +0000112 p.setAlpha(0); // or 0
reed374772b2016-10-05 17:33:02 -0700113 p.setBlendMode(SkBlendMode::kSrc);
reed@android.com149e2f62009-05-22 14:39:03 +0000114 canvas->drawOval(r, p);
115 canvas->restore();
116 return;
117 }
rmistry@google.comae933ce2012-08-23 18:19:56 +0000118
reed@android.com8a1c16f2008-12-17 15:59:43 +0000119 if (false) {
120 SkRect r;
Mike Reed92b33352019-08-24 19:39:13 -0400121 r.setWH(220, 120);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000122 SkPaint p;
123 p.setAlpha(0x88);
124 p.setAntiAlias(true);
rmistry@google.comae933ce2012-08-23 18:19:56 +0000125
reed@android.com8a1c16f2008-12-17 15:59:43 +0000126 if (true) {
127 canvas->saveLayer(&r, &p);
128 p.setColor(0xFFFF0000);
129 canvas->drawOval(r, p);
130 canvas->restore();
131 }
132
133 p.setColor(0xFF0000FF);
134 r.offset(SkIntToScalar(20), SkIntToScalar(50));
135 canvas->drawOval(r, p);
136 }
137
138 if (false) {
139 SkPaint p;
140 p.setAlpha(0x88);
141 p.setAntiAlias(true);
142
143 canvas->translate(SkIntToScalar(300), 0);
144
145 SkRect r;
Mike Reed92b33352019-08-24 19:39:13 -0400146 r.setWH(220, 60);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000147
commit-bot@chromium.org091a5942014-04-18 14:19:31 +0000148 canvas->saveLayer(&r, &p);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000149
Mike Reed92b33352019-08-24 19:39:13 -0400150 r.setWH(220, 120);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000151 p.setColor(SK_ColorBLUE);
152 canvas->drawOval(r, p);
153 canvas->restore();
154 return;
155 }
rmistry@google.comae933ce2012-08-23 18:19:56 +0000156
reed@android.com8a1c16f2008-12-17 15:59:43 +0000157 test_fade(canvas);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000158 }
rmistry@google.comae933ce2012-08-23 18:19:56 +0000159
reed@android.com8a1c16f2008-12-17 15:59:43 +0000160private:
John Stiles7571f9e2020-09-02 22:42:33 -0400161 using INHERITED = Sample;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000162};
reedbfd5f172016-01-07 11:28:08 -0800163DEF_SAMPLE( return new LayersView; )
reed@android.com8a1c16f2008-12-17 15:59:43 +0000164
165//////////////////////////////////////////////////////////////////////////////
166
Michael Ludwiga8611062019-08-01 16:38:24 -0400167#include "include/effects/SkImageFilters.h"
reedbfd5f172016-01-07 11:28:08 -0800168
Mike Kleinc0bd9f92019-04-23 12:05:21 -0500169#include "tools/Resources.h"
reedbfd5f172016-01-07 11:28:08 -0800170
Ben Wagnerb2c4ea62018-08-08 11:36:17 -0400171class BackdropView : public Sample {
reedbfd5f172016-01-07 11:28:08 -0800172 SkPoint fCenter;
173 SkScalar fAngle;
reed9ce9d672016-03-17 10:51:11 -0700174 sk_sp<SkImage> fImage;
robertphillipsfc11b0a2016-04-05 09:09:36 -0700175 sk_sp<SkImageFilter> fFilter;
reedbfd5f172016-01-07 11:28:08 -0800176public:
177 BackdropView() {
178 fCenter.set(200, 150);
179 fAngle = 0;
Hal Canaryc465d132017-12-08 10:21:31 -0500180 fImage = GetResourceAsImage("images/mandrill_512.png");
Michael Ludwiga8611062019-08-01 16:38:24 -0400181 fFilter = SkImageFilters::Dilate(8, 8, nullptr);
reedbfd5f172016-01-07 11:28:08 -0800182 }
183
184protected:
Hal Canary8a027312019-07-03 10:55:44 -0400185 SkString name() override { return SkString("Backdrop"); }
reedbfd5f172016-01-07 11:28:08 -0800186
187 void onDrawContent(SkCanvas* canvas) override {
Mike Reed34c56a52021-01-22 15:26:41 -0500188 canvas->drawImage(fImage.get(), 0, 0);
reedbfd5f172016-01-07 11:28:08 -0800189
190 const SkScalar w = 250;
191 const SkScalar h = 150;
192 SkPath path;
193 path.addOval(SkRect::MakeXYWH(-w/2, -h/2, w, h));
194 SkMatrix m;
195 m.setRotate(fAngle);
196 m.postTranslate(fCenter.x(), fCenter.y());
197 path.transform(m);
198
Michael Ludwig2f6e2f82021-08-03 13:08:50 -0400199 canvas->clipPath(path, SkClipOp::kIntersect, true);
reedbfd5f172016-01-07 11:28:08 -0800200 const SkRect bounds = path.getBounds();
201
202 SkPaint paint;
203 paint.setAlpha(0xCC);
Mike Reedb42a3272020-05-30 16:02:14 -0400204 canvas->saveLayer(SkCanvas::SaveLayerRec(&bounds, &paint, fFilter.get(), 0));
reedbfd5f172016-01-07 11:28:08 -0800205
206 canvas->restore();
207 }
208
Hal Canary41248072019-07-11 16:32:53 -0400209 bool onAnimate(double nanos) override {
210 fAngle = SkDoubleToScalar(fmod(1e-9 * nanos * 360 / 5, 360));
reedbfd5f172016-01-07 11:28:08 -0800211 return true;
212 }
213
Hal Canaryb1f411a2019-08-29 10:39:22 -0400214 Sample::Click* onFindClickHandler(SkScalar x, SkScalar y, skui::ModifierKey modi) override {
Hal Canaryfcf63592019-07-12 11:32:43 -0400215 return new Click();
reedbfd5f172016-01-07 11:28:08 -0800216 }
217
218 bool onClick(Click* click) override {
reedbfd5f172016-01-07 11:28:08 -0800219 fCenter = click->fCurr;
Hal Canaryfcf63592019-07-12 11:32:43 -0400220 return true;
reedbfd5f172016-01-07 11:28:08 -0800221 }
222
223private:
John Stiles7571f9e2020-09-02 22:42:33 -0400224 using INHERITED = Sample;
reedbfd5f172016-01-07 11:28:08 -0800225};
226DEF_SAMPLE( return new BackdropView; )