blob: f3d1083cb1320dca9a5c0a7df46f6dfd9bf22d00 [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 */
reed@android.com8a1c16f2008-12-17 15:59:43 +00007#include "SampleCode.h"
robertphillips@google.comb7061172013-09-06 14:16:12 +00008#include "SkBlurMask.h"
reed@android.com8a1c16f2008-12-17 15:59:43 +00009#include "SkCanvas.h"
10#include "SkView.h"
11#include "Sk1DPathEffect.h"
12#include "Sk2DPathEffect.h"
reed@android.com8a1c16f2008-12-17 15:59:43 +000013#include "SkBlurMaskFilter.h"
reed0daf5dd2016-01-11 12:34:04 -080014#include "SkColorMatrixFilter.h"
reed@android.com8a1c16f2008-12-17 15:59:43 +000015#include "SkColorPriv.h"
16#include "SkCornerPathEffect.h"
17#include "SkDashPathEffect.h"
18#include "SkDiscretePathEffect.h"
19#include "SkEmbossMaskFilter.h"
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +000020#include "SkReadBuffer.h"
21#include "SkWriteBuffer.h"
reed@android.com8a1c16f2008-12-17 15:59:43 +000022#include "SkGradientShader.h"
reed@android.com8a1c16f2008-12-17 15:59:43 +000023#include "SkLayerRasterizer.h"
24#include "SkMath.h"
25#include "SkPath.h"
robertphillips@google.com770963f2014-04-18 18:04:41 +000026#include "SkPictureRecorder.h"
reed@android.com8a1c16f2008-12-17 15:59:43 +000027#include "SkRegion.h"
28#include "SkShader.h"
reed@android.com8a1c16f2008-12-17 15:59:43 +000029#include "SkCornerPathEffect.h"
30#include "SkPathMeasure.h"
31#include "SkPicture.h"
32#include "SkRandom.h"
reed@android.com8a1c16f2008-12-17 15:59:43 +000033#include "SkTypeface.h"
reed@android.com8a1c16f2008-12-17 15:59:43 +000034#include "SkUtils.h"
reed@android.com8a1c16f2008-12-17 15:59:43 +000035
36#include <math.h>
msarettd15750c2016-03-18 15:48:49 -070037#include "DecodeFile.h"
rmistry@google.comae933ce2012-08-23 18:19:56 +000038
commit-bot@chromium.orgf792a1b2014-02-26 13:27:37 +000039static void r0(SkLayerRasterizer::Builder* rastBuilder, SkPaint& p) {
reedefdfd512016-04-04 10:02:58 -070040 p.setMaskFilter(SkBlurMaskFilter::Make(kNormal_SkBlurStyle,
41 SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(3)),
42 SkBlurMaskFilter::kNone_BlurFlag));
commit-bot@chromium.orgf792a1b2014-02-26 13:27:37 +000043 rastBuilder->addLayer(p, SkIntToScalar(3), SkIntToScalar(3));
reed@android.com8a1c16f2008-12-17 15:59:43 +000044
halcanary96fcdcc2015-08-27 07:41:13 -070045 p.setMaskFilter(nullptr);
reed@android.com8a1c16f2008-12-17 15:59:43 +000046 p.setStyle(SkPaint::kStroke_Style);
47 p.setStrokeWidth(SK_Scalar1);
commit-bot@chromium.orgf792a1b2014-02-26 13:27:37 +000048 rastBuilder->addLayer(p);
reed@android.com8a1c16f2008-12-17 15:59:43 +000049
50 p.setAlpha(0x11);
51 p.setStyle(SkPaint::kFill_Style);
reed374772b2016-10-05 17:33:02 -070052 p.setBlendMode(SkBlendMode::kSrc);
commit-bot@chromium.orgf792a1b2014-02-26 13:27:37 +000053 rastBuilder->addLayer(p);
reed@android.com8a1c16f2008-12-17 15:59:43 +000054}
55
commit-bot@chromium.orgf792a1b2014-02-26 13:27:37 +000056static void r1(SkLayerRasterizer::Builder* rastBuilder, SkPaint& p) {
57 rastBuilder->addLayer(p);
reed@android.com8a1c16f2008-12-17 15:59:43 +000058
59 p.setAlpha(0x40);
reed374772b2016-10-05 17:33:02 -070060 p.setBlendMode(SkBlendMode::kSrc);
reed@android.com8a1c16f2008-12-17 15:59:43 +000061 p.setStyle(SkPaint::kStroke_Style);
62 p.setStrokeWidth(SK_Scalar1*2);
commit-bot@chromium.orgf792a1b2014-02-26 13:27:37 +000063 rastBuilder->addLayer(p);
reed@android.com8a1c16f2008-12-17 15:59:43 +000064}
rmistry@google.comae933ce2012-08-23 18:19:56 +000065
commit-bot@chromium.orgf792a1b2014-02-26 13:27:37 +000066static void r2(SkLayerRasterizer::Builder* rastBuilder, SkPaint& p) {
reed@android.com8a1c16f2008-12-17 15:59:43 +000067 p.setStyle(SkPaint::kStrokeAndFill_Style);
68 p.setStrokeWidth(SK_Scalar1*4);
commit-bot@chromium.orgf792a1b2014-02-26 13:27:37 +000069 rastBuilder->addLayer(p);
reed@android.com8a1c16f2008-12-17 15:59:43 +000070
71 p.setStyle(SkPaint::kStroke_Style);
72 p.setStrokeWidth(SK_Scalar1*3/2);
reed374772b2016-10-05 17:33:02 -070073 p.setBlendMode(SkBlendMode::kClear);
commit-bot@chromium.orgf792a1b2014-02-26 13:27:37 +000074 rastBuilder->addLayer(p);
reed@android.com8a1c16f2008-12-17 15:59:43 +000075}
76
commit-bot@chromium.orgf792a1b2014-02-26 13:27:37 +000077static void r3(SkLayerRasterizer::Builder* rastBuilder, SkPaint& p) {
reed@android.com8a1c16f2008-12-17 15:59:43 +000078 p.setStyle(SkPaint::kStroke_Style);
79 p.setStrokeWidth(SK_Scalar1*3);
commit-bot@chromium.orgf792a1b2014-02-26 13:27:37 +000080 rastBuilder->addLayer(p);
reed@android.com8a1c16f2008-12-17 15:59:43 +000081
82 p.setAlpha(0x20);
83 p.setStyle(SkPaint::kFill_Style);
reed374772b2016-10-05 17:33:02 -070084 p.setBlendMode(SkBlendMode::kSrc);
commit-bot@chromium.orgf792a1b2014-02-26 13:27:37 +000085 rastBuilder->addLayer(p);
reed@android.com8a1c16f2008-12-17 15:59:43 +000086}
87
commit-bot@chromium.orgf792a1b2014-02-26 13:27:37 +000088static void r4(SkLayerRasterizer::Builder* rastBuilder, SkPaint& p) {
reed@android.com8a1c16f2008-12-17 15:59:43 +000089 p.setAlpha(0x60);
commit-bot@chromium.orgf792a1b2014-02-26 13:27:37 +000090 rastBuilder->addLayer(p, SkIntToScalar(3), SkIntToScalar(3));
reed@android.com8a1c16f2008-12-17 15:59:43 +000091
92 p.setAlpha(0xFF);
reed374772b2016-10-05 17:33:02 -070093 p.setBlendMode(SkBlendMode::kClear);
commit-bot@chromium.orgf792a1b2014-02-26 13:27:37 +000094 rastBuilder->addLayer(p, SK_Scalar1*3/2, SK_Scalar1*3/2);
reed@android.com8a1c16f2008-12-17 15:59:43 +000095
reed374772b2016-10-05 17:33:02 -070096 p.setBlendMode(SkBlendMode::kSrcOver);
commit-bot@chromium.orgf792a1b2014-02-26 13:27:37 +000097 rastBuilder->addLayer(p);
reed@android.com8a1c16f2008-12-17 15:59:43 +000098}
99
commit-bot@chromium.orgf792a1b2014-02-26 13:27:37 +0000100static void r5(SkLayerRasterizer::Builder* rastBuilder, SkPaint& p) {
101 rastBuilder->addLayer(p);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000102
reeda4393342016-03-18 11:22:57 -0700103 p.setPathEffect(SkDiscretePathEffect::Make(SK_Scalar1*4, SK_Scalar1*3));
reed374772b2016-10-05 17:33:02 -0700104 p.setBlendMode(SkBlendMode::kSrcOut);
commit-bot@chromium.orgf792a1b2014-02-26 13:27:37 +0000105 rastBuilder->addLayer(p);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000106}
107
commit-bot@chromium.orgf792a1b2014-02-26 13:27:37 +0000108static void r6(SkLayerRasterizer::Builder* rastBuilder, SkPaint& p) {
109 rastBuilder->addLayer(p);
rmistry@google.comae933ce2012-08-23 18:19:56 +0000110
reed@android.com8a1c16f2008-12-17 15:59:43 +0000111 p.setAntiAlias(false);
commit-bot@chromium.orgf792a1b2014-02-26 13:27:37 +0000112 SkLayerRasterizer::Builder rastBuilder2;
113 r5(&rastBuilder2, p);
reed7b380d02016-03-21 13:25:16 -0700114 p.setRasterizer(rastBuilder2.detach());
reed374772b2016-10-05 17:33:02 -0700115 p.setBlendMode(SkBlendMode::kClear);
commit-bot@chromium.orgf792a1b2014-02-26 13:27:37 +0000116 rastBuilder->addLayer(p);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000117}
118
119class Dot2DPathEffect : public Sk2DPathEffect {
120public:
121 Dot2DPathEffect(SkScalar radius, const SkMatrix& matrix)
122 : Sk2DPathEffect(matrix), fRadius(radius) {}
123
djsollen@google.comba28d032012-03-26 17:57:35 +0000124 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(Dot2DPathEffect)
reed@android.com8a1c16f2008-12-17 15:59:43 +0000125
126protected:
mtklein36352bf2015-03-25 18:17:31 -0700127 void next(const SkPoint& loc, int u, int v, SkPath* dst) const override {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000128 dst->addCircle(loc.fX, loc.fY, fRadius);
129 }
rmistry@google.comae933ce2012-08-23 18:19:56 +0000130
mtklein36352bf2015-03-25 18:17:31 -0700131 void flatten(SkWriteBuffer& buffer) const override {
djsollen@google.com54924242012-03-29 15:18:04 +0000132 this->INHERITED::flatten(buffer);
133 buffer.writeScalar(fRadius);
134 }
135
reed@android.com8a1c16f2008-12-17 15:59:43 +0000136private:
137 SkScalar fRadius;
138
reed@android.com8a1c16f2008-12-17 15:59:43 +0000139 typedef Sk2DPathEffect INHERITED;
140};
141
commit-bot@chromium.orgf792a1b2014-02-26 13:27:37 +0000142static void r7(SkLayerRasterizer::Builder* rastBuilder, SkPaint& p) {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000143 SkMatrix lattice;
144 lattice.setScale(SK_Scalar1*6, SK_Scalar1*6, 0, 0);
145 lattice.postSkew(SK_Scalar1/3, 0, 0, 0);
reeda4393342016-03-18 11:22:57 -0700146 p.setPathEffect(sk_make_sp<Dot2DPathEffect>(SK_Scalar1*4, lattice));
commit-bot@chromium.orgf792a1b2014-02-26 13:27:37 +0000147 rastBuilder->addLayer(p);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000148}
149
commit-bot@chromium.orgf792a1b2014-02-26 13:27:37 +0000150static void r8(SkLayerRasterizer::Builder* rastBuilder, SkPaint& p) {
151 rastBuilder->addLayer(p);
rmistry@google.comae933ce2012-08-23 18:19:56 +0000152
reed@android.com8a1c16f2008-12-17 15:59:43 +0000153 SkMatrix lattice;
154 lattice.setScale(SK_Scalar1*6, SK_Scalar1*6, 0, 0);
155 lattice.postSkew(SK_Scalar1/3, 0, 0, 0);
reeda4393342016-03-18 11:22:57 -0700156 p.setPathEffect(sk_make_sp<Dot2DPathEffect>(SK_Scalar1*2, lattice));
reed374772b2016-10-05 17:33:02 -0700157 p.setBlendMode(SkBlendMode::kClear);
commit-bot@chromium.orgf792a1b2014-02-26 13:27:37 +0000158 rastBuilder->addLayer(p);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000159
halcanary96fcdcc2015-08-27 07:41:13 -0700160 p.setPathEffect(nullptr);
reed374772b2016-10-05 17:33:02 -0700161 p.setBlendMode(SkBlendMode::kSrcOver);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000162 p.setStyle(SkPaint::kStroke_Style);
163 p.setStrokeWidth(SK_Scalar1);
commit-bot@chromium.orgf792a1b2014-02-26 13:27:37 +0000164 rastBuilder->addLayer(p);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000165}
166
commit-bot@chromium.orgf792a1b2014-02-26 13:27:37 +0000167static void r9(SkLayerRasterizer::Builder* rastBuilder, SkPaint& p) {
168 rastBuilder->addLayer(p);
rmistry@google.comae933ce2012-08-23 18:19:56 +0000169
reed@android.com8a1c16f2008-12-17 15:59:43 +0000170 SkMatrix lattice;
171 lattice.setScale(SK_Scalar1, SK_Scalar1*6, 0, 0);
172 lattice.postRotate(SkIntToScalar(30), 0, 0);
reeda4393342016-03-18 11:22:57 -0700173 p.setPathEffect(SkLine2DPathEffect::Make(SK_Scalar1*2, lattice));
reed374772b2016-10-05 17:33:02 -0700174 p.setBlendMode(SkBlendMode::kClear);
commit-bot@chromium.orgf792a1b2014-02-26 13:27:37 +0000175 rastBuilder->addLayer(p);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000176
halcanary96fcdcc2015-08-27 07:41:13 -0700177 p.setPathEffect(nullptr);
reed374772b2016-10-05 17:33:02 -0700178 p.setBlendMode(SkBlendMode::kSrcOver);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000179 p.setStyle(SkPaint::kStroke_Style);
180 p.setStrokeWidth(SK_Scalar1);
commit-bot@chromium.orgf792a1b2014-02-26 13:27:37 +0000181 rastBuilder->addLayer(p);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000182}
183
commit-bot@chromium.orgf792a1b2014-02-26 13:27:37 +0000184typedef void (*raster_proc)(SkLayerRasterizer::Builder*, SkPaint&);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000185
186static const raster_proc gRastProcs[] = {
187 r0, r1, r2, r3, r4, r5, r6, r7, r8, r9
188};
189
190static const struct {
191 SkColor fMul, fAdd;
192} gLightingColors[] = {
193 { 0x808080, 0x800000 }, // general case
194 { 0x707070, 0x707070 }, // no-pin case
195 { 0xFFFFFF, 0x800000 }, // just-add case
196 { 0x808080, 0x000000 }, // just-mul case
197 { 0xFFFFFF, 0x000000 } // identity case
198};
199
rmistry@google.comae933ce2012-08-23 18:19:56 +0000200static void apply_shader(SkPaint* paint, int index) {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000201 raster_proc proc = gRastProcs[index];
mike@reedtribe.org5fd92432011-05-05 01:59:48 +0000202 if (proc) {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000203 SkPaint p;
commit-bot@chromium.orgf792a1b2014-02-26 13:27:37 +0000204 SkLayerRasterizer::Builder rastBuilder;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000205
206 p.setAntiAlias(true);
commit-bot@chromium.orgf792a1b2014-02-26 13:27:37 +0000207 proc(&rastBuilder, p);
reed7b380d02016-03-21 13:25:16 -0700208 paint->setRasterizer(rastBuilder.detach());
reed@android.com8a1c16f2008-12-17 15:59:43 +0000209 }
210
Mike Reedfd87be82016-12-07 13:41:57 -0500211#ifdef SK_SUPPORT_LEGACY_EMBOSSMASKFILTER
reed@android.com8a1c16f2008-12-17 15:59:43 +0000212 SkScalar dir[] = { SK_Scalar1, SK_Scalar1, SK_Scalar1 };
reedefdfd512016-04-04 10:02:58 -0700213 paint->setMaskFilter(SkBlurMaskFilter::MakeEmboss(
robertphillips@google.comb7061172013-09-06 14:16:12 +0000214 SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(3)), dir,
reedefdfd512016-04-04 10:02:58 -0700215 SK_Scalar1/4, SkIntToScalar(4)));
reed@android.com8a1c16f2008-12-17 15:59:43 +0000216 paint->setColor(SK_ColorBLUE);
217#endif
218}
219
mike@reedtribe.org5fd92432011-05-05 01:59:48 +0000220class DemoView : public SampleView {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000221public:
reed@google.com2f3dc9d2011-05-02 17:33:45 +0000222 DemoView() {}
rmistry@google.comae933ce2012-08-23 18:19:56 +0000223
reed@android.com8a1c16f2008-12-17 15:59:43 +0000224protected:
225 // overrides from SkEventSink
mike@reedtribe.org5fd92432011-05-05 01:59:48 +0000226 virtual bool onQuery(SkEvent* evt) {
227 if (SampleCode::TitleQ(*evt)) {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000228 SampleCode::TitleR(evt, "Demo");
229 return true;
230 }
231 return this->INHERITED::onQuery(evt);
232 }
rmistry@google.comae933ce2012-08-23 18:19:56 +0000233
mike@reedtribe.org5fd92432011-05-05 01:59:48 +0000234 virtual bool onClick(Click* click) {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000235 return this->INHERITED::onClick(click);
236 }
rmistry@google.comae933ce2012-08-23 18:19:56 +0000237
mike@reedtribe.org5fd92432011-05-05 01:59:48 +0000238 void makePath(SkPath& path) {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000239 path.addCircle(SkIntToScalar(20), SkIntToScalar(20), SkIntToScalar(20),
240 SkPath::kCCW_Direction);
241 for (int index = 0; index < 10; index++) {
commit-bot@chromium.org4b413c82013-11-25 19:44:07 +0000242 SkScalar x = (float) cos(index / 10.0f * 2 * 3.1415925358f);
243 SkScalar y = (float) sin(index / 10.0f * 2 * 3.1415925358f);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000244 x *= index & 1 ? 7 : 14;
245 y *= index & 1 ? 7 : 14;
246 x += SkIntToScalar(20);
247 y += SkIntToScalar(20);
248 if (index == 0)
249 path.moveTo(x, y);
250 else
251 path.lineTo(x, y);
252 }
253 path.close();
254 }
rmistry@google.comae933ce2012-08-23 18:19:56 +0000255
mike@reedtribe.org5fd92432011-05-05 01:59:48 +0000256 virtual void onDrawContent(SkCanvas* canvas) {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000257 canvas->save();
robertphillips@google.com84b18c72014-04-13 19:09:42 +0000258 this->drawPicture(canvas, 0);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000259 canvas->restore();
260
261 {
robertphillips@google.com84b18c72014-04-13 19:09:42 +0000262 SkPictureRecorder recorder;
263 {
halcanary96fcdcc2015-08-27 07:41:13 -0700264 SkCanvas* record = recorder.beginRecording(320, 480, nullptr, 0);
robertphillips@google.com84b18c72014-04-13 19:09:42 +0000265 this->drawPicture(record, 120);
266 }
reedca2622b2016-03-18 07:25:55 -0700267 sk_sp<SkPicture> picture(recorder.finishRecordingAsPicture());
robertphillips@google.com84b18c72014-04-13 19:09:42 +0000268
reed@android.com8a1c16f2008-12-17 15:59:43 +0000269 canvas->translate(0, SkIntToScalar(120));
270
271 SkRect clip;
272 clip.set(0, 0, SkIntToScalar(160), SkIntToScalar(160));
273 do {
274 canvas->save();
275 canvas->clipRect(clip);
robertphillipsc5ba71d2014-09-04 08:42:50 -0700276 picture->playback(canvas);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000277 canvas->restore();
278 if (clip.fRight < SkIntToScalar(320))
279 clip.offset(SkIntToScalar(160), 0);
280 else if (clip.fBottom < SkIntToScalar(480))
281 clip.offset(-SkIntToScalar(320), SkIntToScalar(160));
282 else
283 break;
284 } while (true);
285 }
reed@android.com8a1c16f2008-12-17 15:59:43 +0000286 }
rmistry@google.comae933ce2012-08-23 18:19:56 +0000287
mike@reedtribe.org5fd92432011-05-05 01:59:48 +0000288 void drawPicture(SkCanvas* canvas, int spriteOffset) {
rmistry@google.comae933ce2012-08-23 18:19:56 +0000289 SkMatrix matrix; matrix.reset();
290 SkPaint paint;
291 SkPath path;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000292 SkPoint start = {0, 0};
293 SkPoint stop = { SkIntToScalar(40), SkIntToScalar(40) };
rmistry@google.comae933ce2012-08-23 18:19:56 +0000294 SkRect rect = {0, 0, SkIntToScalar(40), SkIntToScalar(40) };
295 SkRect rect2 = {0, 0, SkIntToScalar(65), SkIntToScalar(20) };
296 SkScalar left = 0, top = 0, x = 0, y = 0;
reed@google.com7fa2a652014-01-27 13:42:58 +0000297 int index;
rmistry@google.comae933ce2012-08-23 18:19:56 +0000298
299 char ascii[] = "ascii...";
reed@google.com7fa2a652014-01-27 13:42:58 +0000300 int asciiLength = sizeof(ascii) - 1;
rmistry@google.comae933ce2012-08-23 18:19:56 +0000301 char utf8[] = "utf8" "\xe2\x80\xa6";
302 short utf16[] = {'u', 't', 'f', '1', '6', 0x2026 };
303 short utf16simple[] = {'u', 't', 'f', '1', '6', '!' };
304
reed@android.com8a1c16f2008-12-17 15:59:43 +0000305 makePath(path);
306 SkTDArray<SkPoint>(pos);
rmistry@google.comae933ce2012-08-23 18:19:56 +0000307 pos.setCount(asciiLength);
308 for (index = 0; index < asciiLength; index++)
309 pos[index].set(SkIntToScalar((unsigned int)index * 10),
tomhudson@google.comffe39bd2012-05-17 15:38:00 +0000310 SkIntToScalar((unsigned int)index * 2));
reed@android.com8a1c16f2008-12-17 15:59:43 +0000311 SkTDArray<SkPoint>(pos2);
rmistry@google.comae933ce2012-08-23 18:19:56 +0000312 pos2.setCount(asciiLength);
313 for (index = 0; index < asciiLength; index++)
314 pos2[index].set(SkIntToScalar((unsigned int)index * 10),
tomhudson@google.comffe39bd2012-05-17 15:38:00 +0000315 SkIntToScalar(20));
rmistry@google.comae933ce2012-08-23 18:19:56 +0000316
reed@android.com8a1c16f2008-12-17 15:59:43 +0000317 // shaders
senorblanco@chromium.org64cc5792011-05-19 19:58:58 +0000318 SkPoint linearPoints[] = { { 0, 0, }, { SkIntToScalar(40), SkIntToScalar(40) } };
reed@android.com8a1c16f2008-12-17 15:59:43 +0000319 SkColor linearColors[] = { SK_ColorRED, SK_ColorBLUE };
halcanary96fcdcc2015-08-27 07:41:13 -0700320 SkScalar* linearPos = nullptr;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000321 int linearCount = 2;
322 SkShader::TileMode linearMode = SkShader::kMirror_TileMode;
reed8a21c9f2016-03-08 18:50:00 -0800323 auto linear = SkGradientShader::MakeLinear(linearPoints,
commit-bot@chromium.org83f23d82014-05-22 12:27:41 +0000324 linearColors, linearPos, linearCount, linearMode);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000325
326 SkPoint radialCenter = { SkIntToScalar(25), SkIntToScalar(25) };
327 SkScalar radialRadius = SkIntToScalar(25);
328 SkColor radialColors[] = { SK_ColorGREEN, SK_ColorGRAY, SK_ColorRED };
329 SkScalar radialPos[] = { 0, SkIntToScalar(3) / 5, SkIntToScalar(1)};
330 int radialCount = 3;
331 SkShader::TileMode radialMode = SkShader::kRepeat_TileMode;
reed8a21c9f2016-03-08 18:50:00 -0800332 auto radial = SkGradientShader::MakeRadial(radialCenter,
reed@android.com8a1c16f2008-12-17 15:59:43 +0000333 radialRadius, radialColors, radialPos, radialCount,
commit-bot@chromium.org83f23d82014-05-22 12:27:41 +0000334 radialMode);
rmistry@google.comae933ce2012-08-23 18:19:56 +0000335
reed@android.com8a1c16f2008-12-17 15:59:43 +0000336 SkEmbossMaskFilter::Light light;
337 light.fDirection[0] = SK_Scalar1/2;
338 light.fDirection[1] = SK_Scalar1/2;
339 light.fDirection[2] = SK_Scalar1/3;
rmistry@google.comae933ce2012-08-23 18:19:56 +0000340 light.fAmbient = 0x48;
341 light.fSpecular = 0x80;
rmistry@google.comae933ce2012-08-23 18:19:56 +0000342
reedd053ce92016-03-22 10:17:23 -0700343 auto lightingFilter = SkColorMatrixFilter::MakeLightingFilter(
reed@android.com8a1c16f2008-12-17 15:59:43 +0000344 0xff89bc45, 0xff112233);
rmistry@google.comae933ce2012-08-23 18:19:56 +0000345
reed@android.com8a1c16f2008-12-17 15:59:43 +0000346 canvas->save();
rmistry@google.comae933ce2012-08-23 18:19:56 +0000347 canvas->translate(SkIntToScalar(0), SkIntToScalar(5));
reed@google.com9cfc83c2013-07-22 17:18:18 +0000348 paint.setAntiAlias(true);
reed93a12152015-03-16 10:08:34 -0700349 paint.setFilterQuality(kLow_SkFilterQuality);
rmistry@google.comae933ce2012-08-23 18:19:56 +0000350 // !!! draw through a clip
351 paint.setColor(SK_ColorLTGRAY);
352 paint.setStyle(SkPaint::kFill_Style);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000353 SkRect clip = {0, 0, SkIntToScalar(320), SkIntToScalar(120)};
354 canvas->clipRect(clip);
reed8a21c9f2016-03-08 18:50:00 -0800355 paint.setShader(SkShader::MakeBitmapShader(fTx,
356 SkShader::kMirror_TileMode, SkShader::kRepeat_TileMode));
rmistry@google.comae933ce2012-08-23 18:19:56 +0000357 canvas->drawPaint(paint);
358 canvas->save();
359
reed@android.com8a1c16f2008-12-17 15:59:43 +0000360 // line (exercises xfermode, colorShader, colorFilter, filterShader)
rmistry@google.comae933ce2012-08-23 18:19:56 +0000361 paint.setColor(SK_ColorGREEN);
362 paint.setStrokeWidth(SkIntToScalar(10));
363 paint.setStyle(SkPaint::kStroke_Style);
reed374772b2016-10-05 17:33:02 -0700364 paint.setBlendMode(SkBlendMode::kXor);
reedd053ce92016-03-22 10:17:23 -0700365 paint.setColorFilter(lightingFilter);
Hal Canary23e474c2017-05-15 13:35:35 -0400366 canvas->drawLine(start, stop, paint); // should not be green
reed374772b2016-10-05 17:33:02 -0700367 paint.setBlendMode(SkBlendMode::kSrcOver);
halcanary96fcdcc2015-08-27 07:41:13 -0700368 paint.setColorFilter(nullptr);
rmistry@google.comae933ce2012-08-23 18:19:56 +0000369
reed@android.com8a1c16f2008-12-17 15:59:43 +0000370 // rectangle
rmistry@google.comae933ce2012-08-23 18:19:56 +0000371 paint.setStyle(SkPaint::kFill_Style);
372 canvas->translate(SkIntToScalar(50), 0);
373 paint.setColor(SK_ColorYELLOW);
reed8a21c9f2016-03-08 18:50:00 -0800374 paint.setShader(linear);
reeda4393342016-03-18 11:22:57 -0700375 paint.setPathEffect(pathEffectTest());
rmistry@google.comae933ce2012-08-23 18:19:56 +0000376 canvas->drawRect(rect, paint);
halcanary96fcdcc2015-08-27 07:41:13 -0700377 paint.setPathEffect(nullptr);
rmistry@google.comae933ce2012-08-23 18:19:56 +0000378
reed@android.com8a1c16f2008-12-17 15:59:43 +0000379 // circle w/ emboss & transparent (exercises 3dshader)
rmistry@google.comae933ce2012-08-23 18:19:56 +0000380 canvas->translate(SkIntToScalar(50), 0);
reedefdfd512016-04-04 10:02:58 -0700381 paint.setMaskFilter(SkEmbossMaskFilter::Make(
382 SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(12)/5), light));
reed@android.com8a1c16f2008-12-17 15:59:43 +0000383 canvas->drawOval(rect, paint);
rmistry@google.comae933ce2012-08-23 18:19:56 +0000384 canvas->translate(SkIntToScalar(10), SkIntToScalar(10));
reed56263c72015-06-05 11:31:26 -0700385// paint.setShader(transparentShader)->unref();
reed@android.com8a1c16f2008-12-17 15:59:43 +0000386 canvas->drawOval(rect, paint);
rmistry@google.comae933ce2012-08-23 18:19:56 +0000387 canvas->translate(0, SkIntToScalar(-10));
388
reed@android.com8a1c16f2008-12-17 15:59:43 +0000389 // path
rmistry@google.comae933ce2012-08-23 18:19:56 +0000390 canvas->translate(SkIntToScalar(50), 0);
391 paint.setColor(SK_ColorRED);
392 paint.setStyle(SkPaint::kStroke_Style);
393 paint.setStrokeWidth(SkIntToScalar(5));
reed8a21c9f2016-03-08 18:50:00 -0800394 paint.setShader(radial);
halcanary96fcdcc2015-08-27 07:41:13 -0700395 paint.setMaskFilter(nullptr);
rmistry@google.comae933ce2012-08-23 18:19:56 +0000396 canvas->drawPath(path, paint);
397
halcanary96fcdcc2015-08-27 07:41:13 -0700398 paint.setShader(nullptr);
reed6f45c172015-11-04 08:34:07 -0800399 // bitmap
rmistry@google.comae933ce2012-08-23 18:19:56 +0000400 canvas->translate(SkIntToScalar(50), 0);
401 paint.setStyle(SkPaint::kFill_Style);
402 canvas->drawBitmap(fBug, left, top, &paint);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000403
rmistry@google.comae933ce2012-08-23 18:19:56 +0000404 canvas->translate(-SkIntToScalar(30), SkIntToScalar(30));
reed8a21c9f2016-03-08 18:50:00 -0800405 paint.setShader(shaderTest()); // test compose shader
rmistry@google.comae933ce2012-08-23 18:19:56 +0000406 canvas->drawRect(rect2, paint);
halcanary96fcdcc2015-08-27 07:41:13 -0700407 paint.setShader(nullptr);
rmistry@google.comae933ce2012-08-23 18:19:56 +0000408
reed@android.com8a1c16f2008-12-17 15:59:43 +0000409 canvas->restore();
410 // text
reed@android.com8a1c16f2008-12-17 15:59:43 +0000411 canvas->translate(0, SkIntToScalar(60));
rmistry@google.comae933ce2012-08-23 18:19:56 +0000412 canvas->save();
413 paint.setColor(SK_ColorGRAY);
414 canvas->drawPosText(ascii, asciiLength, pos.begin(), paint);
415 canvas->drawPosText(ascii, asciiLength, pos2.begin(), paint);
416
417 canvas->translate(SkIntToScalar(50), 0);
418 paint.setColor(SK_ColorCYAN);
419 canvas->drawText(utf8, sizeof(utf8) - 1, x, y, paint);
420
421 canvas->translate(SkIntToScalar(30), 0);
422 paint.setColor(SK_ColorMAGENTA);
423 paint.setTextEncoding(SkPaint::kUTF16_TextEncoding);
424 matrix.setTranslate(SkIntToScalar(10), SkIntToScalar(10));
425 canvas->drawTextOnPath((void*) utf16, sizeof(utf16), path, &matrix, paint);
426 canvas->translate(0, SkIntToScalar(20));
427 canvas->drawTextOnPath((void*) utf16simple, sizeof(utf16simple), path, &matrix, paint);
428 canvas->restore();
429
430 canvas->translate(0, SkIntToScalar(60));
431 paint.setTextEncoding(SkPaint::kUTF8_TextEncoding);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000432 canvas->restore();
433 }
rmistry@google.comae933ce2012-08-23 18:19:56 +0000434
reed@google.com4d5c26d2013-01-08 16:17:50 +0000435 virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned modi) {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000436 fClickPt.set(x, y);
halcanary96fcdcc2015-08-27 07:41:13 -0700437 this->inval(nullptr);
reed@google.com4d5c26d2013-01-08 16:17:50 +0000438 return this->INHERITED::onFindClickHandler(x, y, modi);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000439 }
rmistry@google.comae933ce2012-08-23 18:19:56 +0000440
reeda4393342016-03-18 11:22:57 -0700441 sk_sp<SkPathEffect> pathEffectTest() {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000442 static const int gXY[] = { 1, 0, 0, -1, 2, -1, 3, 0, 2, 1, 0, 1 };
443 SkScalar gPhase = 0;
444 SkPath path;
445 path.moveTo(SkIntToScalar(gXY[0]), SkIntToScalar(gXY[1]));
446 for (unsigned i = 2; i < SK_ARRAY_COUNT(gXY); i += 2)
447 path.lineTo(SkIntToScalar(gXY[i]), SkIntToScalar(gXY[i+1]));
448 path.close();
449 path.offset(SkIntToScalar(-6), 0);
reeda4393342016-03-18 11:22:57 -0700450 auto outer = SkPath1DPathEffect::Make(path, SkIntToScalar(12),
reed@android.com8a1c16f2008-12-17 15:59:43 +0000451 gPhase, SkPath1DPathEffect::kRotate_Style);
reeda4393342016-03-18 11:22:57 -0700452 auto inner = SkDiscretePathEffect::Make(SkIntToScalar(2),
reed@android.com8a1c16f2008-12-17 15:59:43 +0000453 SkIntToScalar(1)/10); // SkCornerPathEffect(SkIntToScalar(2));
Mike Reeda07741a2017-02-25 22:34:32 -0500454 return SkPathEffect::MakeCompose(outer, inner);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000455 }
reed@google.com963a8fa2012-05-10 13:04:59 +0000456
reed8a21c9f2016-03-08 18:50:00 -0800457 sk_sp<SkShader> shaderTest() {
senorblanco@chromium.org64cc5792011-05-19 19:58:58 +0000458 SkPoint pts[] = { { 0, 0, }, { SkIntToScalar(100), 0 } };
reed@android.com8a1c16f2008-12-17 15:59:43 +0000459 SkColor colors[] = { SK_ColorRED, SK_ColorBLUE };
reed8a21c9f2016-03-08 18:50:00 -0800460 auto shaderA = SkGradientShader::MakeLinear(pts, colors, nullptr,
reed@android.com8a1c16f2008-12-17 15:59:43 +0000461 2, SkShader::kClamp_TileMode);
462 pts[1].set(0, SkIntToScalar(100));
463 SkColor colors2[] = {SK_ColorBLACK, SkColorSetARGB(0x80, 0, 0, 0)};
reed8a21c9f2016-03-08 18:50:00 -0800464 auto shaderB = SkGradientShader::MakeLinear(pts, colors2, nullptr,
reed@android.com8a1c16f2008-12-17 15:59:43 +0000465 2, SkShader::kClamp_TileMode);
reedcfb6bdf2016-03-29 11:32:50 -0700466 return SkShader::MakeComposeShader(std::move(shaderA), std::move(shaderB),
Mike Reed7d954ad2016-10-28 15:42:34 -0400467 SkBlendMode::kDstIn);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000468 }
469
470 virtual void startTest() {
msarettd15750c2016-03-18 15:48:49 -0700471 decode_file("/Users/caryclark/Desktop/bugcirc.gif", &fBug);
472 decode_file("/Users/caryclark/Desktop/tbcirc.gif", &fTb);
473 decode_file("/Users/caryclark/Desktop/05psp04.gif", &fTx);
rmistry@google.comae933ce2012-08-23 18:19:56 +0000474 }
reed@android.com8a1c16f2008-12-17 15:59:43 +0000475
mike@reedtribe.org5fd92432011-05-05 01:59:48 +0000476 void drawRaster(SkCanvas* canvas) {
senorblanco@chromium.org64cc5792011-05-19 19:58:58 +0000477 for (size_t index = 0; index < SK_ARRAY_COUNT(gRastProcs); index++)
reed@android.com8a1c16f2008-12-17 15:59:43 +0000478 drawOneRaster(canvas);
479 }
rmistry@google.comae933ce2012-08-23 18:19:56 +0000480
mike@reedtribe.org5fd92432011-05-05 01:59:48 +0000481 void drawOneRaster(SkCanvas* canvas) {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000482 canvas->save();
reed@android.com8a1c16f2008-12-17 15:59:43 +0000483
484 SkScalar x = SkIntToScalar(20);
485 SkScalar y = SkIntToScalar(40);
486 SkPaint paint;
rmistry@google.comae933ce2012-08-23 18:19:56 +0000487
reed@android.com8a1c16f2008-12-17 15:59:43 +0000488 paint.setAntiAlias(true);
489 paint.setTextSize(SkIntToScalar(48));
Ben Wagner71319502017-07-27 10:45:29 -0400490 paint.setTypeface(SkTypeface::MakeFromName("sans-serif", SkFontStyle::Bold()));
reed@android.com8a1c16f2008-12-17 15:59:43 +0000491
492 SkString str("GOOGLE");
493
senorblanco@chromium.org64cc5792011-05-19 19:58:58 +0000494 for (size_t i = 0; i < SK_ARRAY_COUNT(gRastProcs); i++) {
reed@google.com7fa2a652014-01-27 13:42:58 +0000495 apply_shader(&paint, (int)i);
rmistry@google.comae933ce2012-08-23 18:19:56 +0000496
halcanary96fcdcc2015-08-27 07:41:13 -0700497 // paint.setMaskFilter(nullptr);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000498 // paint.setColor(SK_ColorBLACK);
499
500#if 01
501 int index = i % SK_ARRAY_COUNT(gLightingColors);
reedd053ce92016-03-22 10:17:23 -0700502 paint.setColorFilter(SkColorMatrixFilter::MakeLightingFilter(
reed@android.com8a1c16f2008-12-17 15:59:43 +0000503 gLightingColors[index].fMul,
reedd053ce92016-03-22 10:17:23 -0700504 gLightingColors[index].fAdd));
reed@android.com8a1c16f2008-12-17 15:59:43 +0000505#endif
rmistry@google.comae933ce2012-08-23 18:19:56 +0000506
Cary Clark2a475ea2017-04-28 15:35:12 -0400507 canvas->drawString(str, x, y, paint);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000508 SkRect oval = { x, y - SkIntToScalar(40), x + SkIntToScalar(40), y };
509 paint.setStyle(SkPaint::kStroke_Style);
510 canvas->drawOval(oval, paint);
511 paint.setStyle(SkPaint::kFill_Style);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000512
513 y += paint.getFontSpacing();
514 }
515
516 canvas->restore();
reed@android.com8a1c16f2008-12-17 15:59:43 +0000517 }
518
519private:
520 SkPoint fClickPt;
521 SkBitmap fBug, fTb, fTx;
mike@reedtribe.org5fd92432011-05-05 01:59:48 +0000522 typedef SampleView INHERITED;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000523};
524
525//////////////////////////////////////////////////////////////////////////////
526
527static SkView* MyFactory() { return new DemoView; }
528static SkViewRegister reg(MyFactory);