blob: 18cae7015545f13a40ba7665875227851a450e6e [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 */
mike@reedtribe.org3d1cb972012-08-13 00:52:07 +00007
8#include "gm.h"
djsollen@google.comc73dd5c2012-08-07 15:54:32 +00009#include "SkFlattenableBuffers.h"
reed@android.com8a1c16f2008-12-17 15:59:43 +000010#include "SkLayerRasterizer.h"
11#include "SkBlurMaskFilter.h"
12
reed@google.comf2183392011-04-22 14:10:48 +000013static void r0(SkLayerRasterizer* rast, SkPaint& p) {
reed@android.com8a1c16f2008-12-17 15:59:43 +000014 p.setMaskFilter(SkBlurMaskFilter::Create(SkIntToScalar(3),
15 SkBlurMaskFilter::kNormal_BlurStyle))->unref();
16 rast->addLayer(p, SkIntToScalar(3), SkIntToScalar(3));
rmistry@google.comae933ce2012-08-23 18:19:56 +000017
reed@android.com8a1c16f2008-12-17 15:59:43 +000018 p.setMaskFilter(NULL);
19 p.setStyle(SkPaint::kStroke_Style);
20 p.setStrokeWidth(SK_Scalar1);
21 rast->addLayer(p);
rmistry@google.comae933ce2012-08-23 18:19:56 +000022
reed@android.com8a1c16f2008-12-17 15:59:43 +000023 p.setAlpha(0x11);
24 p.setStyle(SkPaint::kFill_Style);
reed@android.com0baf1932009-06-24 12:41:42 +000025 p.setXfermodeMode(SkXfermode::kSrc_Mode);
reed@android.com8a1c16f2008-12-17 15:59:43 +000026 rast->addLayer(p);
27}
28
reed@google.comf2183392011-04-22 14:10:48 +000029static void r1(SkLayerRasterizer* rast, SkPaint& p) {
reed@android.com8a1c16f2008-12-17 15:59:43 +000030 rast->addLayer(p);
rmistry@google.comae933ce2012-08-23 18:19:56 +000031
reed@android.com8a1c16f2008-12-17 15:59:43 +000032 p.setAlpha(0x40);
reed@android.com0baf1932009-06-24 12:41:42 +000033 p.setXfermodeMode(SkXfermode::kSrc_Mode);
reed@android.com8a1c16f2008-12-17 15:59:43 +000034 p.setStyle(SkPaint::kStroke_Style);
35 p.setStrokeWidth(SK_Scalar1*2);
36 rast->addLayer(p);
37}
reed@google.com82065d62011-02-07 15:30:46 +000038
reed@google.comf2183392011-04-22 14:10:48 +000039static void r2(SkLayerRasterizer* rast, SkPaint& p) {
reed@android.com8a1c16f2008-12-17 15:59:43 +000040 p.setStyle(SkPaint::kStrokeAndFill_Style);
41 p.setStrokeWidth(SK_Scalar1*4);
42 rast->addLayer(p);
rmistry@google.comae933ce2012-08-23 18:19:56 +000043
reed@android.com8a1c16f2008-12-17 15:59:43 +000044 p.setStyle(SkPaint::kStroke_Style);
45 p.setStrokeWidth(SK_Scalar1*3/2);
reed@android.com0baf1932009-06-24 12:41:42 +000046 p.setXfermodeMode(SkXfermode::kClear_Mode);
reed@android.com8a1c16f2008-12-17 15:59:43 +000047 rast->addLayer(p);
48}
49
reed@google.comf2183392011-04-22 14:10:48 +000050static void r3(SkLayerRasterizer* rast, SkPaint& p) {
reed@android.com8a1c16f2008-12-17 15:59:43 +000051 p.setStyle(SkPaint::kStroke_Style);
52 p.setStrokeWidth(SK_Scalar1*3);
53 rast->addLayer(p);
rmistry@google.comae933ce2012-08-23 18:19:56 +000054
reed@android.com8a1c16f2008-12-17 15:59:43 +000055 p.setAlpha(0x20);
56 p.setStyle(SkPaint::kFill_Style);
reed@android.com0baf1932009-06-24 12:41:42 +000057 p.setXfermodeMode(SkXfermode::kSrc_Mode);
reed@android.com8a1c16f2008-12-17 15:59:43 +000058 rast->addLayer(p);
59}
60
reed@google.comf2183392011-04-22 14:10:48 +000061static void r4(SkLayerRasterizer* rast, SkPaint& p) {
reed@android.com8a1c16f2008-12-17 15:59:43 +000062 p.setAlpha(0x60);
63 rast->addLayer(p, SkIntToScalar(3), SkIntToScalar(3));
rmistry@google.comae933ce2012-08-23 18:19:56 +000064
reed@android.com8a1c16f2008-12-17 15:59:43 +000065 p.setAlpha(0xFF);
reed@android.com0baf1932009-06-24 12:41:42 +000066 p.setXfermodeMode(SkXfermode::kClear_Mode);
reed@android.com8a1c16f2008-12-17 15:59:43 +000067 rast->addLayer(p, SK_Scalar1*3/2, SK_Scalar1*3/2);
rmistry@google.comae933ce2012-08-23 18:19:56 +000068
reed@android.com8a1c16f2008-12-17 15:59:43 +000069 p.setXfermode(NULL);
70 rast->addLayer(p);
71}
72
73#include "SkDiscretePathEffect.h"
74
reed@google.comf2183392011-04-22 14:10:48 +000075static void r5(SkLayerRasterizer* rast, SkPaint& p) {
reed@android.com8a1c16f2008-12-17 15:59:43 +000076 rast->addLayer(p);
rmistry@google.comae933ce2012-08-23 18:19:56 +000077
reed@android.com8a1c16f2008-12-17 15:59:43 +000078 p.setPathEffect(new SkDiscretePathEffect(SK_Scalar1*4, SK_Scalar1*3))->unref();
reed@android.com0baf1932009-06-24 12:41:42 +000079 p.setXfermodeMode(SkXfermode::kSrcOut_Mode);
reed@android.com8a1c16f2008-12-17 15:59:43 +000080 rast->addLayer(p);
81}
82
reed@google.comf2183392011-04-22 14:10:48 +000083static void r6(SkLayerRasterizer* rast, SkPaint& p) {
reed@android.com8a1c16f2008-12-17 15:59:43 +000084 rast->addLayer(p);
rmistry@google.comae933ce2012-08-23 18:19:56 +000085
reed@android.com8a1c16f2008-12-17 15:59:43 +000086 p.setAntiAlias(false);
87 SkLayerRasterizer* rast2 = new SkLayerRasterizer;
88 r5(rast2, p);
89 p.setRasterizer(rast2)->unref();
reed@android.com0baf1932009-06-24 12:41:42 +000090 p.setXfermodeMode(SkXfermode::kClear_Mode);
reed@android.com8a1c16f2008-12-17 15:59:43 +000091 rast->addLayer(p);
92}
93
94#include "Sk2DPathEffect.h"
95
reed@google.com18dc4772011-08-09 18:47:40 +000096static SkPathEffect* MakeDotEffect(SkScalar radius, const SkMatrix& matrix) {
97 SkPath path;
98 path.addCircle(0, 0, radius);
99 return new SkPath2DPathEffect(matrix, path);
100}
reed@android.com8a1c16f2008-12-17 15:59:43 +0000101
reed@google.comf2183392011-04-22 14:10:48 +0000102static void r7(SkLayerRasterizer* rast, SkPaint& p) {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000103 SkMatrix lattice;
104 lattice.setScale(SK_Scalar1*6, SK_Scalar1*6, 0, 0);
105 lattice.postSkew(SK_Scalar1/3, 0, 0, 0);
reed@google.com18dc4772011-08-09 18:47:40 +0000106 p.setPathEffect(MakeDotEffect(SK_Scalar1*4, lattice))->unref();
reed@android.com8a1c16f2008-12-17 15:59:43 +0000107 rast->addLayer(p);
108}
109
reed@google.comf2183392011-04-22 14:10:48 +0000110static void r8(SkLayerRasterizer* rast, SkPaint& p) {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000111 rast->addLayer(p);
rmistry@google.comae933ce2012-08-23 18:19:56 +0000112
reed@android.com8a1c16f2008-12-17 15:59:43 +0000113 SkMatrix lattice;
114 lattice.setScale(SK_Scalar1*6, SK_Scalar1*6, 0, 0);
115 lattice.postSkew(SK_Scalar1/3, 0, 0, 0);
reed@google.com18dc4772011-08-09 18:47:40 +0000116 p.setPathEffect(MakeDotEffect(SK_Scalar1*2, lattice))->unref();
reed@android.com0baf1932009-06-24 12:41:42 +0000117 p.setXfermodeMode(SkXfermode::kClear_Mode);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000118 rast->addLayer(p);
rmistry@google.comae933ce2012-08-23 18:19:56 +0000119
reed@android.com8a1c16f2008-12-17 15:59:43 +0000120 p.setPathEffect(NULL);
121 p.setXfermode(NULL);
122 p.setStyle(SkPaint::kStroke_Style);
123 p.setStrokeWidth(SK_Scalar1);
124 rast->addLayer(p);
125}
126
127class Line2DPathEffect : public Sk2DPathEffect {
128public:
129 Line2DPathEffect(SkScalar width, const SkMatrix& matrix)
mike@reedtribe.org3d1cb972012-08-13 00:52:07 +0000130 : Sk2DPathEffect(matrix), fWidth(width) {}
rmistry@google.comae933ce2012-08-23 18:19:56 +0000131
132 virtual bool filterPath(SkPath* dst, const SkPath& src, SkStrokeRec* rec) SK_OVERRIDE {
reed@google.comfd4be262012-05-25 01:04:12 +0000133 if (this->INHERITED::filterPath(dst, src, rec)) {
134 rec->setStrokeStyle(fWidth);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000135 return true;
136 }
137 return false;
138 }
rmistry@google.comae933ce2012-08-23 18:19:56 +0000139
djsollen@google.comba28d032012-03-26 17:57:35 +0000140 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(Line2DPathEffect)
rmistry@google.comae933ce2012-08-23 18:19:56 +0000141
reed@android.com8a1c16f2008-12-17 15:59:43 +0000142protected:
rmistry@google.comae933ce2012-08-23 18:19:56 +0000143 virtual void nextSpan(int u, int v, int ucount, SkPath* dst) {
reed@google.comf2183392011-04-22 14:10:48 +0000144 if (ucount > 1) {
rmistry@google.comae933ce2012-08-23 18:19:56 +0000145 SkPoint src[2], dstP[2];
146
reed@android.com8a1c16f2008-12-17 15:59:43 +0000147 src[0].set(SkIntToScalar(u) + SK_ScalarHalf,
148 SkIntToScalar(v) + SK_ScalarHalf);
149 src[1].set(SkIntToScalar(u+ucount) + SK_ScalarHalf,
150 SkIntToScalar(v) + SK_ScalarHalf);
151 this->getMatrix().mapPoints(dstP, src, 2);
rmistry@google.comae933ce2012-08-23 18:19:56 +0000152
reed@android.com8a1c16f2008-12-17 15:59:43 +0000153 dst->moveTo(dstP[0]);
154 dst->lineTo(dstP[1]);
155 }
156 }
rmistry@google.comae933ce2012-08-23 18:19:56 +0000157
djsollen@google.com54924242012-03-29 15:18:04 +0000158 Line2DPathEffect(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000159 fWidth = buffer.readScalar();
160 }
djsollen@google.com54924242012-03-29 15:18:04 +0000161 virtual void flatten(SkFlattenableWriteBuffer& buffer) const SK_OVERRIDE {
162 this->INHERITED::flatten(buffer);
163 buffer.writeScalar(fWidth);
164 }
rmistry@google.comae933ce2012-08-23 18:19:56 +0000165
reed@android.com8a1c16f2008-12-17 15:59:43 +0000166private:
167 SkScalar fWidth;
rmistry@google.comae933ce2012-08-23 18:19:56 +0000168
reed@android.com8a1c16f2008-12-17 15:59:43 +0000169 typedef Sk2DPathEffect INHERITED;
170};
171
reed@google.comf2183392011-04-22 14:10:48 +0000172static void r9(SkLayerRasterizer* rast, SkPaint& p) {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000173 rast->addLayer(p);
rmistry@google.comae933ce2012-08-23 18:19:56 +0000174
reed@android.com8a1c16f2008-12-17 15:59:43 +0000175 SkMatrix lattice;
176 lattice.setScale(SK_Scalar1, SK_Scalar1*6, 0, 0);
177 lattice.postRotate(SkIntToScalar(30), 0, 0);
178 p.setPathEffect(new Line2DPathEffect(SK_Scalar1*2, lattice))->unref();
reed@android.com0baf1932009-06-24 12:41:42 +0000179 p.setXfermodeMode(SkXfermode::kClear_Mode);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000180 rast->addLayer(p);
rmistry@google.comae933ce2012-08-23 18:19:56 +0000181
reed@android.com8a1c16f2008-12-17 15:59:43 +0000182 p.setPathEffect(NULL);
183 p.setXfermode(NULL);
184 p.setStyle(SkPaint::kStroke_Style);
185 p.setStrokeWidth(SK_Scalar1);
186 rast->addLayer(p);
187}
188
189typedef void (*raster_proc)(SkLayerRasterizer*, SkPaint&);
190
191static const raster_proc gRastProcs[] = {
192 r0, r1, r2, r3, r4, r5, r6, r7, r8, r9
193};
194
195static const struct {
196 SkColor fMul, fAdd;
197} gLightingColors[] = {
198 { 0x808080, 0x800000 }, // general case
199 { 0x707070, 0x707070 }, // no-pin case
200 { 0xFFFFFF, 0x800000 }, // just-add case
201 { 0x808080, 0x000000 }, // just-mul case
202 { 0xFFFFFF, 0x000000 } // identity case
203};
204
205#include "SkXfermode.h"
206
reed@google.comf2183392011-04-22 14:10:48 +0000207static void apply_shader(SkPaint* paint, int index) {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000208 raster_proc proc = gRastProcs[index];
209 if (proc)
210 {
211 SkPaint p;
212 SkLayerRasterizer* rast = new SkLayerRasterizer;
rmistry@google.comae933ce2012-08-23 18:19:56 +0000213
reed@android.com8a1c16f2008-12-17 15:59:43 +0000214 p.setAntiAlias(true);
215 proc(rast, p);
216 paint->setRasterizer(rast)->unref();
217 }
rmistry@google.comae933ce2012-08-23 18:19:56 +0000218
reed@android.com8a1c16f2008-12-17 15:59:43 +0000219#if 0
220 SkScalar dir[] = { SK_Scalar1, SK_Scalar1, SK_Scalar1 };
reed@google.com82065d62011-02-07 15:30:46 +0000221 paint->setMaskFilter(SkBlurMaskFilter::CreateEmboss(dir, SK_Scalar1/4, SkIntToScalar(4), SkIntToScalar(3)))->unref();
reed@android.com8a1c16f2008-12-17 15:59:43 +0000222#endif
223 paint->setColor(SK_ColorBLUE);
224}
225
mike@reedtribe.org3d1cb972012-08-13 00:52:07 +0000226class TextEffectsGM : public skiagm::GM {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000227public:
rmistry@google.comae933ce2012-08-23 18:19:56 +0000228 TextEffectsGM() {}
229
reed@android.com8a1c16f2008-12-17 15:59:43 +0000230protected:
mike@reedtribe.org3d1cb972012-08-13 00:52:07 +0000231 virtual SkString onShortName() SK_OVERRIDE {
232 return SkString("texteffects");
reed@android.com8a1c16f2008-12-17 15:59:43 +0000233 }
rmistry@google.comae933ce2012-08-23 18:19:56 +0000234
mike@reedtribe.org3d1cb972012-08-13 00:52:07 +0000235 virtual SkISize onISize() SK_OVERRIDE {
mike@reedtribe.org3e044402012-08-13 01:13:38 +0000236 return SkISize::Make(460, 680);
mike@reedtribe.org3d1cb972012-08-13 00:52:07 +0000237 }
rmistry@google.comae933ce2012-08-23 18:19:56 +0000238
mike@reedtribe.org3d1cb972012-08-13 00:52:07 +0000239 virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000240 canvas->save();
rmistry@google.comae933ce2012-08-23 18:19:56 +0000241
reed@android.com8a1c16f2008-12-17 15:59:43 +0000242 SkPaint paint;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000243 paint.setAntiAlias(true);
reed@android.com0bb6d062010-05-17 14:50:04 +0000244 paint.setTextSize(SkIntToScalar(56));
rmistry@google.comae933ce2012-08-23 18:19:56 +0000245
reed@android.com0bb6d062010-05-17 14:50:04 +0000246 SkScalar x = SkIntToScalar(20);
247 SkScalar y = paint.getTextSize();
rmistry@google.comae933ce2012-08-23 18:19:56 +0000248
mike@reedtribe.org3d1cb972012-08-13 00:52:07 +0000249 SkString str("Hamburgefons");
rmistry@google.comae933ce2012-08-23 18:19:56 +0000250
senorblanco@chromium.org64cc5792011-05-19 19:58:58 +0000251 for (size_t i = 0; i < SK_ARRAY_COUNT(gRastProcs); i++) {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000252 apply_shader(&paint, i);
rmistry@google.comae933ce2012-08-23 18:19:56 +0000253
mike@reedtribe.org3d1cb972012-08-13 00:52:07 +0000254 // paint.setMaskFilter(NULL);
255 // paint.setColor(SK_ColorBLACK);
rmistry@google.comae933ce2012-08-23 18:19:56 +0000256
reed@android.com8a1c16f2008-12-17 15:59:43 +0000257 canvas->drawText(str.c_str(), str.size(), x, y, paint);
rmistry@google.comae933ce2012-08-23 18:19:56 +0000258
reed@android.com8a1c16f2008-12-17 15:59:43 +0000259 y += paint.getFontSpacing();
260 }
rmistry@google.comae933ce2012-08-23 18:19:56 +0000261
reed@android.com8a1c16f2008-12-17 15:59:43 +0000262 canvas->restore();
reed@android.com8a1c16f2008-12-17 15:59:43 +0000263 }
mike@reedtribe.orgd6c38132012-08-13 01:57:05 +0000264
265 virtual uint32_t onGetFlags() const SK_OVERRIDE {
266 // want to skip serialization due to custom effects only defined here
267 return kSkipPipe_Flag;
268 }
269
reed@android.com8a1c16f2008-12-17 15:59:43 +0000270private:
mike@reedtribe.org3d1cb972012-08-13 00:52:07 +0000271 typedef skiagm::GM INHERITED;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000272};
rmistry@google.comae933ce2012-08-23 18:19:56 +0000273
reed@android.com8a1c16f2008-12-17 15:59:43 +0000274//////////////////////////////////////////////////////////////////////////////
275
mike@reedtribe.org3d1cb972012-08-13 00:52:07 +0000276static skiagm::GM* MyFactory(void*) { return new TextEffectsGM; }
277static skiagm::GMRegistry reg(MyFactory);
rmistry@google.comae933ce2012-08-23 18:19:56 +0000278