blob: 8719e678926c2981da222c4ee7d46d43953c873c [file] [log] [blame]
reed@android.com8a1c16f2008-12-17 15:59:43 +00001#include "SampleCode.h"
2#include "SkCanvas.h"
3#include "SkView.h"
4#include "Sk1DPathEffect.h"
5#include "Sk2DPathEffect.h"
6#include "SkAvoidXfermode.h"
7#include "SkBlurMaskFilter.h"
8#include "SkColorFilter.h"
9#include "SkColorPriv.h"
10#include "SkCornerPathEffect.h"
11#include "SkDashPathEffect.h"
12#include "SkDiscretePathEffect.h"
13#include "SkEmbossMaskFilter.h"
14#include "SkGradientShader.h"
15#include "SkImageDecoder.h"
16#include "SkLayerRasterizer.h"
17#include "SkMath.h"
18#include "SkPath.h"
19#include "SkRegion.h"
20#include "SkShader.h"
reed@android.comaa5a7db2009-05-27 01:20:10 +000021#include "SkComposeShader.h"
reed@android.com8a1c16f2008-12-17 15:59:43 +000022#include "SkCornerPathEffect.h"
23#include "SkPathMeasure.h"
24#include "SkPicture.h"
25#include "SkRandom.h"
26#include "SkTransparentShader.h"
27#include "SkTypeface.h"
28#include "SkUnitMappers.h"
29#include "SkUtils.h"
30#include "SkXfermode.h"
31
32#include <math.h>
33
34extern void Dump();
35
36static inline SkPMColor rgb2gray(SkPMColor c)
37{
38 unsigned r = SkGetPackedR32(c);
39 unsigned g = SkGetPackedG32(c);
40 unsigned b = SkGetPackedB32(c);
41
42 unsigned x = r * 5 + g * 7 + b * 4 >> 4;
43
44 return SkPackARGB32(0, x, x, x) | (c & (SK_A32_MASK << SK_A32_SHIFT));
45}
46
47class SkGrayScaleColorFilter : public SkColorFilter {
48public:
49 virtual void filterSpan(const SkPMColor src[], int count, SkPMColor result[])
50 {
51 for (int i = 0; i < count; i++)
52 result[i] = rgb2gray(src[i]);
53 }
54};
55
56class SkChannelMaskColorFilter : public SkColorFilter {
57public:
58 SkChannelMaskColorFilter(U8CPU redMask, U8CPU greenMask, U8CPU blueMask)
59 {
60 fMask = SkPackARGB32(0xFF, redMask, greenMask, blueMask);
61 }
62
63 virtual void filterSpan(const SkPMColor src[], int count, SkPMColor result[])
64 {
65 SkPMColor mask = fMask;
66 for (int i = 0; i < count; i++)
67 result[i] = src[i] & mask;
68 }
69
70private:
71 SkPMColor fMask;
72};
73
74///////////////////////////////////////////////////////////
75
76static void r0(SkLayerRasterizer* rast, SkPaint& p)
77{
78 p.setMaskFilter(SkBlurMaskFilter::Create(SkIntToScalar(3),
79 SkBlurMaskFilter::kNormal_BlurStyle))->unref();
80 rast->addLayer(p, SkIntToScalar(3), SkIntToScalar(3));
81
82 p.setMaskFilter(NULL);
83 p.setStyle(SkPaint::kStroke_Style);
84 p.setStrokeWidth(SK_Scalar1);
85 rast->addLayer(p);
86
87 p.setAlpha(0x11);
88 p.setStyle(SkPaint::kFill_Style);
89 p.setPorterDuffXfermode(SkPorterDuff::kSrc_Mode);
90 rast->addLayer(p);
91}
92
93static void r1(SkLayerRasterizer* rast, SkPaint& p)
94{
95 rast->addLayer(p);
96
97 p.setAlpha(0x40);
98 p.setPorterDuffXfermode(SkPorterDuff::kSrc_Mode);
99 p.setStyle(SkPaint::kStroke_Style);
100 p.setStrokeWidth(SK_Scalar1*2);
101 rast->addLayer(p);
102}
103
104static void r2(SkLayerRasterizer* rast, SkPaint& p)
105{
106 p.setStyle(SkPaint::kStrokeAndFill_Style);
107 p.setStrokeWidth(SK_Scalar1*4);
108 rast->addLayer(p);
109
110 p.setStyle(SkPaint::kStroke_Style);
111 p.setStrokeWidth(SK_Scalar1*3/2);
112 p.setPorterDuffXfermode(SkPorterDuff::kClear_Mode);
113 rast->addLayer(p);
114}
115
116static void r3(SkLayerRasterizer* rast, SkPaint& p)
117{
118 p.setStyle(SkPaint::kStroke_Style);
119 p.setStrokeWidth(SK_Scalar1*3);
120 rast->addLayer(p);
121
122 p.setAlpha(0x20);
123 p.setStyle(SkPaint::kFill_Style);
124 p.setPorterDuffXfermode(SkPorterDuff::kSrc_Mode);
125 rast->addLayer(p);
126}
127
128static void r4(SkLayerRasterizer* rast, SkPaint& p)
129{
130 p.setAlpha(0x60);
131 rast->addLayer(p, SkIntToScalar(3), SkIntToScalar(3));
132
133 p.setAlpha(0xFF);
134 p.setPorterDuffXfermode(SkPorterDuff::kClear_Mode);
135 rast->addLayer(p, SK_Scalar1*3/2, SK_Scalar1*3/2);
136
137 p.setXfermode(NULL);
138 rast->addLayer(p);
139}
140
141static void r5(SkLayerRasterizer* rast, SkPaint& p)
142{
143 rast->addLayer(p);
144
145 p.setPathEffect(new SkDiscretePathEffect(SK_Scalar1*4, SK_Scalar1*3))->unref();
146 p.setPorterDuffXfermode(SkPorterDuff::kSrcOut_Mode);
147 rast->addLayer(p);
148}
149
150static void r6(SkLayerRasterizer* rast, SkPaint& p)
151{
152 rast->addLayer(p);
153
154 p.setAntiAlias(false);
155 SkLayerRasterizer* rast2 = new SkLayerRasterizer;
156 r5(rast2, p);
157 p.setRasterizer(rast2)->unref();
158 p.setPorterDuffXfermode(SkPorterDuff::kClear_Mode);
159 rast->addLayer(p);
160}
161
162class Dot2DPathEffect : public Sk2DPathEffect {
163public:
164 Dot2DPathEffect(SkScalar radius, const SkMatrix& matrix)
165 : Sk2DPathEffect(matrix), fRadius(radius) {}
166
167 virtual void flatten(SkFlattenableWriteBuffer& buffer)
168 {
169 this->INHERITED::flatten(buffer);
170
171 buffer.writeScalar(fRadius);
172 }
173 virtual Factory getFactory() { return CreateProc; }
174
175protected:
176 virtual void next(const SkPoint& loc, int u, int v, SkPath* dst)
177 {
178 dst->addCircle(loc.fX, loc.fY, fRadius);
179 }
180
181 Dot2DPathEffect(SkFlattenableReadBuffer& buffer) : Sk2DPathEffect(buffer)
182 {
183 fRadius = buffer.readScalar();
184 }
185private:
186 SkScalar fRadius;
187
188 static SkFlattenable* CreateProc(SkFlattenableReadBuffer& buffer)
189 {
190 return new Dot2DPathEffect(buffer);
191 }
192
193 typedef Sk2DPathEffect INHERITED;
194};
195
196static void r7(SkLayerRasterizer* rast, SkPaint& p)
197{
198 SkMatrix lattice;
199 lattice.setScale(SK_Scalar1*6, SK_Scalar1*6, 0, 0);
200 lattice.postSkew(SK_Scalar1/3, 0, 0, 0);
201 p.setPathEffect(new Dot2DPathEffect(SK_Scalar1*4, lattice))->unref();
202 rast->addLayer(p);
203}
204
205static void r8(SkLayerRasterizer* rast, SkPaint& p)
206{
207 rast->addLayer(p);
208
209 SkMatrix lattice;
210 lattice.setScale(SK_Scalar1*6, SK_Scalar1*6, 0, 0);
211 lattice.postSkew(SK_Scalar1/3, 0, 0, 0);
212 p.setPathEffect(new Dot2DPathEffect(SK_Scalar1*2, lattice))->unref();
213 p.setPorterDuffXfermode(SkPorterDuff::kClear_Mode);
214 rast->addLayer(p);
215
216 p.setPathEffect(NULL);
217 p.setXfermode(NULL);
218 p.setStyle(SkPaint::kStroke_Style);
219 p.setStrokeWidth(SK_Scalar1);
220 rast->addLayer(p);
221}
222
223class Line2DPathEffect : public Sk2DPathEffect {
224public:
225 Line2DPathEffect(SkScalar width, const SkMatrix& matrix)
226 : Sk2DPathEffect(matrix), fWidth(width) {}
227
228 virtual bool filterPath(SkPath* dst, const SkPath& src, SkScalar* width)
229 {
230 if (this->INHERITED::filterPath(dst, src, width))
231 {
232 *width = fWidth;
233 return true;
234 }
235 return false;
236 }
237
238 virtual Factory getFactory() { return CreateProc; }
239 virtual void flatten(SkFlattenableWriteBuffer& buffer)
240 {
241 this->INHERITED::flatten(buffer);
242 buffer.writeScalar(fWidth);
243 }
244protected:
245 virtual void nextSpan(int u, int v, int ucount, SkPath* dst)
246 {
247 if (ucount > 1)
248 {
249 SkPoint src[2], dstP[2];
250
251 src[0].set(SkIntToScalar(u) + SK_ScalarHalf,
252 SkIntToScalar(v) + SK_ScalarHalf);
253 src[1].set(SkIntToScalar(u+ucount) + SK_ScalarHalf,
254 SkIntToScalar(v) + SK_ScalarHalf);
255 this->getMatrix().mapPoints(dstP, src, 2);
256
257 dst->moveTo(dstP[0]);
258 dst->lineTo(dstP[1]);
259 }
260 }
261
262 Line2DPathEffect::Line2DPathEffect(SkFlattenableReadBuffer& buffer) : Sk2DPathEffect(buffer)
263 {
264 fWidth = buffer.readScalar();
265 }
266
267private:
268 SkScalar fWidth;
269
270 static SkFlattenable* CreateProc(SkFlattenableReadBuffer& buffer) { return new Line2DPathEffect(buffer); }
271
272 typedef Sk2DPathEffect INHERITED;
273};
274
275static void r9(SkLayerRasterizer* rast, SkPaint& p)
276{
277 rast->addLayer(p);
278
279 SkMatrix lattice;
280 lattice.setScale(SK_Scalar1, SK_Scalar1*6, 0, 0);
281 lattice.postRotate(SkIntToScalar(30), 0, 0);
282 p.setPathEffect(new Line2DPathEffect(SK_Scalar1*2, lattice))->unref();
283 p.setPorterDuffXfermode(SkPorterDuff::kClear_Mode);
284 rast->addLayer(p);
285
286 p.setPathEffect(NULL);
287 p.setXfermode(NULL);
288 p.setStyle(SkPaint::kStroke_Style);
289 p.setStrokeWidth(SK_Scalar1);
290 rast->addLayer(p);
291}
292
293typedef void (*raster_proc)(SkLayerRasterizer*, SkPaint&);
294
295static const raster_proc gRastProcs[] = {
296 r0, r1, r2, r3, r4, r5, r6, r7, r8, r9
297};
298
299static const struct {
300 SkColor fMul, fAdd;
301} gLightingColors[] = {
302 { 0x808080, 0x800000 }, // general case
303 { 0x707070, 0x707070 }, // no-pin case
304 { 0xFFFFFF, 0x800000 }, // just-add case
305 { 0x808080, 0x000000 }, // just-mul case
306 { 0xFFFFFF, 0x000000 } // identity case
307};
308
309static unsigned color_dist16(uint16_t a, uint16_t b)
310{
311 unsigned dr = SkAbs32(SkPacked16ToR32(a) - SkPacked16ToR32(b));
312 unsigned dg = SkAbs32(SkPacked16ToG32(a) - SkPacked16ToG32(b));
313 unsigned db = SkAbs32(SkPacked16ToB32(a) - SkPacked16ToB32(b));
314
315 return SkMax32(dr, SkMax32(dg, db));
316}
317
318static unsigned scale_dist(unsigned dist, unsigned scale)
319{
320 dist >>= 6;
321 dist = (dist << 2) | dist;
322 dist = (dist << 4) | dist;
323 return dist;
324
325// return SkAlphaMul(dist, scale);
326}
327
328static void apply_shader(SkPaint* paint, int index)
329{
330 raster_proc proc = gRastProcs[index];
331 if (proc)
332 {
333 SkPaint p;
334 SkLayerRasterizer* rast = new SkLayerRasterizer;
335
336 p.setAntiAlias(true);
337 proc(rast, p);
338 paint->setRasterizer(rast)->unref();
339 }
340
341#if 1
342 SkScalar dir[] = { SK_Scalar1, SK_Scalar1, SK_Scalar1 };
343 paint->setMaskFilter(SkBlurMaskFilter::CreateEmboss(dir, SK_Scalar1/4, SkIntToScalar(4), SkIntToScalar(3)))->unref();
344 paint->setColor(SK_ColorBLUE);
345#endif
346}
347
348static void test_math()
349{
350 float x;
351 const float PI = 3.141593;
352
353 for (x = 0; x < 1; x += 0.05f)
354 printf("atan(%g) = %g\n", x, atanf(x) * 180/PI);
355 for (x = 1; x < 10000000; x *= 2)
356 printf("atan(%g) = %g\n", x, atanf(x) * 180/PI);
357}
358
359class DemoView : public SkView {
360public:
361 DemoView()
362 {
363 test_math();
364 }
365
366protected:
367 // overrides from SkEventSink
368 virtual bool onQuery(SkEvent* evt)
369 {
370 if (SampleCode::TitleQ(*evt))
371 {
372 SampleCode::TitleR(evt, "Demo");
373 return true;
374 }
375 return this->INHERITED::onQuery(evt);
376 }
377
378 virtual bool onClick(Click* click)
379 {
380 return this->INHERITED::onClick(click);
381 }
382
383 void makePath(SkPath& path)
384 {
385 path.addCircle(SkIntToScalar(20), SkIntToScalar(20), SkIntToScalar(20),
386 SkPath::kCCW_Direction);
387 for (int index = 0; index < 10; index++) {
388 SkScalar x = SkFloatToScalar(cos(index / 10.0f * 2 * 3.1415925358f));
389 SkScalar y = SkFloatToScalar(sin(index / 10.0f * 2 * 3.1415925358f));
390 x *= index & 1 ? 7 : 14;
391 y *= index & 1 ? 7 : 14;
392 x += SkIntToScalar(20);
393 y += SkIntToScalar(20);
394 if (index == 0)
395 path.moveTo(x, y);
396 else
397 path.lineTo(x, y);
398 }
399 path.close();
400 }
401
402 virtual void onDraw(SkCanvas* canvas)
403 {
404 canvas->drawColor(SK_ColorWHITE);
405 canvas->save();
406 drawPicture(canvas, 0);
407 canvas->restore();
408
409 {
410 SkPicture picture;
411 SkCanvas* record = picture.beginRecording(320, 480);
412 drawPicture(record, 120);
413 canvas->translate(0, SkIntToScalar(120));
414
415 SkRect clip;
416 clip.set(0, 0, SkIntToScalar(160), SkIntToScalar(160));
417 do {
418 canvas->save();
419 canvas->clipRect(clip);
420 picture.draw(canvas);
421 canvas->restore();
422 if (clip.fRight < SkIntToScalar(320))
423 clip.offset(SkIntToScalar(160), 0);
424 else if (clip.fBottom < SkIntToScalar(480))
425 clip.offset(-SkIntToScalar(320), SkIntToScalar(160));
426 else
427 break;
428 } while (true);
429 }
430 Dump();
431 }
432
433 void drawPicture(SkCanvas* canvas, int spriteOffset)
434 {
435 SkMatrix matrix; matrix.reset();
436 SkPaint paint;
437 SkPath path;
438 SkPoint start = {0, 0};
439 SkPoint stop = { SkIntToScalar(40), SkIntToScalar(40) };
440 SkRect rect = {0, 0, SkIntToScalar(40), SkIntToScalar(40) };
441 SkRect rect2 = {0, 0, SkIntToScalar(65), SkIntToScalar(20) };
442 SkScalar left = 0, top = 0, x = 0, y = 0;
443 int index;
444
445 char ascii[] = "ascii...";
446 size_t asciiLength = sizeof(ascii) - 1;
447 char utf8[] = "utf8" "\xe2\x80\xa6";
448 short utf16[] = {'u', 't', 'f', '1', '6', 0x2026 };
449 short utf16simple[] = {'u', 't', 'f', '1', '6', '!' };
450
451 makePath(path);
452 SkTDArray<SkPoint>(pos);
453 pos.setCount(asciiLength);
454 for (index = 0; index < asciiLength; index++)
455 pos[index].set(SkIntToScalar(index * 10), SkIntToScalar(index * 2));
456 SkTDArray<SkPoint>(pos2);
457 pos2.setCount(asciiLength);
458 for (index = 0; index < asciiLength; index++)
459 pos2[index].set(SkIntToScalar(index * 10), SkIntToScalar(20));
460
461 // shaders
462 SkPoint linearPoints[] = { 0, 0, SkIntToScalar(40), SkIntToScalar(40) };
463 SkColor linearColors[] = { SK_ColorRED, SK_ColorBLUE };
464 SkScalar* linearPos = NULL;
465 int linearCount = 2;
466 SkShader::TileMode linearMode = SkShader::kMirror_TileMode;
467 SkUnitMapper* linearMapper = new SkDiscreteMapper(3);
468 SkAutoUnref unmapLinearMapper(linearMapper);
469 SkShader* linear = SkGradientShader::CreateLinear(linearPoints,
470 linearColors, linearPos, linearCount, linearMode, linearMapper);
471
472 SkPoint radialCenter = { SkIntToScalar(25), SkIntToScalar(25) };
473 SkScalar radialRadius = SkIntToScalar(25);
474 SkColor radialColors[] = { SK_ColorGREEN, SK_ColorGRAY, SK_ColorRED };
475 SkScalar radialPos[] = { 0, SkIntToScalar(3) / 5, SkIntToScalar(1)};
476 int radialCount = 3;
477 SkShader::TileMode radialMode = SkShader::kRepeat_TileMode;
478 SkUnitMapper* radialMapper = new SkCosineMapper();
479 SkAutoUnref unmapRadialMapper(radialMapper);
480 SkShader* radial = SkGradientShader::CreateRadial(radialCenter,
481 radialRadius, radialColors, radialPos, radialCount,
482 radialMode, radialMapper);
483
484 SkTransparentShader* transparentShader = new SkTransparentShader();
485 SkEmbossMaskFilter::Light light;
486 light.fDirection[0] = SK_Scalar1/2;
487 light.fDirection[1] = SK_Scalar1/2;
488 light.fDirection[2] = SK_Scalar1/3;
489 light.fAmbient = 0x48;
490 light.fSpecular = 0x80;
491 SkScalar radius = SkIntToScalar(12)/5;
492 SkEmbossMaskFilter* embossFilter = new SkEmbossMaskFilter(light,
493 radius);
494
495 SkXfermode* xfermode = SkPorterDuff::CreateXfermode(SkPorterDuff::kXor_Mode);
496 SkColorFilter* lightingFilter = SkColorFilter::CreateLightingFilter(
497 0xff89bc45, 0xff112233);
498
499 canvas->save();
500 canvas->translate(SkIntToScalar(0), SkIntToScalar(5));
501 paint.setFlags(SkPaint::kAntiAlias_Flag | SkPaint::kFilterBitmap_Flag);
502 // !!! draw through a clip
503 paint.setColor(SK_ColorLTGRAY);
504 paint.setStyle(SkPaint::kFill_Style);
505 SkRect clip = {0, 0, SkIntToScalar(320), SkIntToScalar(120)};
506 canvas->clipRect(clip);
507 paint.setShader(SkShader::CreateBitmapShader(fTx,
508 SkShader::kMirror_TileMode, SkShader::kRepeat_TileMode))->unref();
509 canvas->drawPaint(paint);
510 canvas->save();
511
512 // line (exercises xfermode, colorShader, colorFilter, filterShader)
513 paint.setColor(SK_ColorGREEN);
514 paint.setStrokeWidth(SkIntToScalar(10));
515 paint.setStyle(SkPaint::kStroke_Style);
516 paint.setXfermode(xfermode)->unref();
517 paint.setColorFilter(lightingFilter)->unref();
518 canvas->drawLine(start.fX, start.fY, stop.fX, stop.fY, paint); // should not be green
519 paint.setXfermode(NULL);
520 paint.setColorFilter(NULL);
521
522 // rectangle
523 paint.setStyle(SkPaint::kFill_Style);
524 canvas->translate(SkIntToScalar(50), 0);
525 paint.setColor(SK_ColorYELLOW);
526 paint.setShader(linear)->unref();
527 paint.setPathEffect(pathEffectTest())->unref();
528 canvas->drawRect(rect, paint);
529 paint.setPathEffect(NULL);
530
531 // circle w/ emboss & transparent (exercises 3dshader)
532 canvas->translate(SkIntToScalar(50), 0);
533 paint.setMaskFilter(embossFilter)->unref();
534 canvas->drawOval(rect, paint);
535 canvas->translate(SkIntToScalar(10), SkIntToScalar(10));
536 paint.setShader(transparentShader)->unref();
537 canvas->drawOval(rect, paint);
538 canvas->translate(0, SkIntToScalar(-10));
539
540 // path
541 canvas->translate(SkIntToScalar(50), 0);
542 paint.setColor(SK_ColorRED);
543 paint.setStyle(SkPaint::kStroke_Style);
544 paint.setStrokeWidth(SkIntToScalar(5));
545 paint.setShader(radial)->unref();
546 paint.setMaskFilter(NULL);
547 canvas->drawPath(path, paint);
548
549 paint.setShader(NULL);
550 // bitmap, sprite
551 canvas->translate(SkIntToScalar(50), 0);
552 paint.setStyle(SkPaint::kFill_Style);
553 canvas->drawBitmap(fBug, left, top, &paint);
554 canvas->translate(SkIntToScalar(30), 0);
555 canvas->drawSprite(fTb,
556 SkScalarRound(canvas->getTotalMatrix().getTranslateX()),
557 spriteOffset + 10, &paint);
558
559 canvas->translate(-SkIntToScalar(30), SkIntToScalar(30));
560 paint.setShader(shaderTest())->unref(); // test compose shader
561 canvas->drawRect(rect2, paint);
562 paint.setShader(NULL);
563
564 canvas->restore();
565 // text
566 canvas->translate(0, SkIntToScalar(60));
567 canvas->save();
568 paint.setColor(SK_ColorGRAY);
569 canvas->drawPosText(ascii, asciiLength, pos.begin(), paint);
570 canvas->drawPosText(ascii, asciiLength, pos2.begin(), paint);
571
572 canvas->translate(SkIntToScalar(50), 0);
573 paint.setColor(SK_ColorCYAN);
574 canvas->drawText(utf8, sizeof(utf8) - 1, x, y, paint);
575
576 canvas->translate(SkIntToScalar(30), 0);
577 paint.setColor(SK_ColorMAGENTA);
578 paint.setTextEncoding(SkPaint::kUTF16_TextEncoding);
579 matrix.setTranslate(SkIntToScalar(10), SkIntToScalar(10));
580 canvas->drawTextOnPath((void*) utf16, sizeof(utf16), path, &matrix, paint);
581 canvas->translate(0, SkIntToScalar(20));
582 canvas->drawTextOnPath((void*) utf16simple, sizeof(utf16simple), path, &matrix, paint);
583 canvas->restore();
584
585 canvas->translate(0, SkIntToScalar(60));
586 paint.setTextEncoding(SkPaint::kUTF8_TextEncoding);
587 canvas->restore();
588 }
589
590 /*
591./SkColorFilter.h:25:class SkColorFilter : public SkFlattenable { -- abstract
592 static SkColorFilter* CreatXfermodeFilter() *** untested ***
593 static SkColorFilter* CreatePorterDuffFilter() *** untested ***
594 static SkColorFilter* CreateLightingFilter() -- tested
595./SkDrawLooper.h:9:class SkDrawLooper : public SkFlattenable { -- virtually abstract
596 ./SkBlurDrawLooper.h:9:class SkBlurDrawLooper : public SkDrawLooper { *** untested ***
597./SkMaskFilter.h:41:class SkMaskFilter : public SkFlattenable { -- abstract chmod +w .h
598 ./SkEmbossMaskFilter.h:27:class SkEmbossMaskFilter : public SkMaskFilter { -- tested
599./SkPathEffect.h:33:class SkPathEffect : public SkFlattenable { -- abstract
600 ./Sk1DPathEffect.h:27:class Sk1DPathEffect : public SkPathEffect { -- abstract
601 ./Sk1DPathEffect.h:48:class SkPath1DPathEffect : public Sk1DPathEffect { -- tested
602 ./Sk2DPathEffect.h:25:class Sk2DPathEffect : public SkPathEffect { *** untested ***
603 ./SkCornerPathEffect.h:28:class SkCornerPathEffect : public SkPathEffect { *** untested ***
604 ./SkDashPathEffect.h:27:class SkDashPathEffect : public SkPathEffect {
605 ./SkDiscretePathEffect.h:27:class SkDiscretePathEffect : public SkPathEffect {
606 ./SkPaint.h:760:class SkStrokePathEffect : public SkPathEffect {
607 ./SkPathEffect.h:58:class SkPairPathEffect : public SkPathEffect {
608 ./SkPathEffect.h:78:class SkComposePathEffect : public SkPairPathEffect {
609 ./SkPathEffect.h:114:class SkSumPathEffect : public SkPairPathEffect {
610./SkRasterizer.h:29:class SkRasterizer : public SkFlattenable {
611 ./SkLayerRasterizer.h:27:class SkLayerRasterizer : public SkRasterizer {
612./SkShader.h:36:class SkShader : public SkFlattenable {
613 ./SkColorFilter.h:59:class SkFilterShader : public SkShader {
614 ./SkColorShader.h:26:class SkColorShader : public SkShader {
615 ./SkShaderExtras.h:31:class SkComposeShader : public SkShader {
616 ./SkTransparentShader.h:23:class SkTransparentShader : public SkShader {
617./SkUnitMapper.h:24:class SkUnitMapper : public SkFlattenable {
618 ./SkUnitMapper.h:33:class SkDiscreteMapper : public SkUnitMapper {
619 ./SkUnitMapper.h:51:class SkFlipCosineMapper : public SkUnitMapper {
620./SkXfermode.h:32:class SkXfermode : public SkFlattenable {
621 ./SkAvoidXfermode.h:28:class SkAvoidXfermode : public SkXfermode { *** not done *** chmod +w .h .cpp
622 ./SkXfermode.h:54:class SkProcXfermode : public SkXfermode {
623 */
624
625 /*
626./SkBlurMaskFilter.h:25:class SkBlurMaskFilter {
627 chmod +w SkBlurMaskFilter.cpp
628./SkGradientShader.h:30:class SkGradientShader {
629 */
630 // save layer, bounder, looper
631 // matrix
632 // clip /path/region
633 // bitmap proc shader ?
634
635/* untested:
636SkCornerPathEffect.h:28:class SkCornerPathEffect : public SkPathEffect {
637*/
638
639 virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y)
640 {
641 fClickPt.set(x, y);
642 this->inval(NULL);
643 return this->INHERITED::onFindClickHandler(x, y);
644 }
645
646 SkPathEffect* pathEffectTest()
647 {
648 static const int gXY[] = { 1, 0, 0, -1, 2, -1, 3, 0, 2, 1, 0, 1 };
649 SkScalar gPhase = 0;
650 SkPath path;
651 path.moveTo(SkIntToScalar(gXY[0]), SkIntToScalar(gXY[1]));
652 for (unsigned i = 2; i < SK_ARRAY_COUNT(gXY); i += 2)
653 path.lineTo(SkIntToScalar(gXY[i]), SkIntToScalar(gXY[i+1]));
654 path.close();
655 path.offset(SkIntToScalar(-6), 0);
656 SkPathEffect* outer = new SkPath1DPathEffect(path, SkIntToScalar(12),
657 gPhase, SkPath1DPathEffect::kRotate_Style);
658 SkPathEffect* inner = new SkDiscretePathEffect(SkIntToScalar(2),
659 SkIntToScalar(1)/10); // SkCornerPathEffect(SkIntToScalar(2));
660 SkPathEffect* result = new SkComposePathEffect(outer, inner);
661 outer->unref();
662 inner->unref();
663 return result;
664 }
665
666 SkPathEffect* pathEffectTest2() // unsure this works (has no visible effect)
667 {
668 SkPathEffect* outer = new SkStrokePathEffect(SkIntToScalar(4),
669 SkPaint::kStroke_Style, SkPaint::kMiter_Join, SkPaint::kButt_Cap);
670 static const SkScalar intervals[] = {SkIntToScalar(1), SkIntToScalar(2),
671 SkIntToScalar(2), SkIntToScalar(1)};
672 SkPathEffect* inner = new SkDashPathEffect(intervals,
673 sizeof(intervals) / sizeof(intervals[0]), 0);
674 SkPathEffect* result = new SkSumPathEffect(outer, inner);
675 outer->unref();
676 inner->unref();
677 return result;
678 }
679
680 SkShader* shaderTest()
681 {
682 SkPoint pts[] = {0, 0, SkIntToScalar(100), 0 };
683 SkColor colors[] = { SK_ColorRED, SK_ColorBLUE };
684 SkShader* shaderA = SkGradientShader::CreateLinear(pts, colors, NULL,
685 2, SkShader::kClamp_TileMode);
686 pts[1].set(0, SkIntToScalar(100));
687 SkColor colors2[] = {SK_ColorBLACK, SkColorSetARGB(0x80, 0, 0, 0)};
688 SkShader* shaderB = SkGradientShader::CreateLinear(pts, colors2, NULL,
689 2, SkShader::kClamp_TileMode);
690 SkXfermode* mode = SkPorterDuff::CreateXfermode(SkPorterDuff::kDstIn_Mode);
691 SkShader* result = new SkComposeShader(shaderA, shaderB, mode);
692 shaderA->unref();
693 shaderB->unref();
694 mode->unref();
695 return result;
696 }
697
698 virtual void startTest() {
699 SkImageDecoder::DecodeFile("/Users/caryclark/Desktop/bugcirc.gif", &fBug);
700 SkImageDecoder::DecodeFile("/Users/caryclark/Desktop/tbcirc.gif", &fTb);
701 SkImageDecoder::DecodeFile("/Users/caryclark/Desktop/05psp04.gif", &fTx);
702 }
703
704 void drawRaster(SkCanvas* canvas)
705 {
706 for (int index = 0; index < SK_ARRAY_COUNT(gRastProcs); index++)
707 drawOneRaster(canvas);
708 }
709
710 void drawOneRaster(SkCanvas* canvas)
711 {
712 canvas->save();
713// canvas->scale(SK_Scalar1*2, SK_Scalar1*2, 0, 0);
714
715 SkScalar x = SkIntToScalar(20);
716 SkScalar y = SkIntToScalar(40);
717 SkPaint paint;
718
719 paint.setAntiAlias(true);
720 paint.setTextSize(SkIntToScalar(48));
reed@android.comaa5a7db2009-05-27 01:20:10 +0000721 paint.setTypeface(SkTypeface::CreateFromName("sans-serif",
722 SkTypeface::kBold));
reed@android.com8a1c16f2008-12-17 15:59:43 +0000723
724 SkString str("GOOGLE");
725
726 for (int i = 0; i < SK_ARRAY_COUNT(gRastProcs); i++)
727 {
728 apply_shader(&paint, i);
729
730 // paint.setMaskFilter(NULL);
731 // paint.setColor(SK_ColorBLACK);
732
733#if 01
734 int index = i % SK_ARRAY_COUNT(gLightingColors);
735 paint.setColorFilter(SkColorFilter::CreateLightingFilter(
736 gLightingColors[index].fMul,
737 gLightingColors[index].fAdd))->unref();
738#endif
739
740 canvas->drawText(str.c_str(), str.size(), x, y, paint);
741 SkRect oval = { x, y - SkIntToScalar(40), x + SkIntToScalar(40), y };
742 paint.setStyle(SkPaint::kStroke_Style);
743 canvas->drawOval(oval, paint);
744 paint.setStyle(SkPaint::kFill_Style);
745 if (0)
746 {
747 SkPath path;
748 paint.getTextPath(str.c_str(), str.size(), x + SkIntToScalar(260), y, &path);
749 canvas->drawPath(path, paint);
750 }
751
752 y += paint.getFontSpacing();
753 }
754
755 canvas->restore();
756
757 if (0)
758 {
759 SkPoint pts[] = { 0, 0, 0, SkIntToScalar(150) };
760 SkColor colors[] = { 0xFFE6E6E6, 0xFFFFFFFF };
761 SkShader* s = SkGradientShader::CreateLinear(pts, colors, NULL, 2, SkShader::kClamp_TileMode);
762
763 paint.reset();
764 paint.setShader(s)->unref();
765 canvas->drawRectCoords(0, 0, SkIntToScalar(120), SkIntToScalar(150), paint);
766 }
767
768 if (1)
769 {
770 SkAvoidXfermode mode(SK_ColorWHITE, 0xFF,
771 SkAvoidXfermode::kTargetColor_Mode);
772 SkPaint paint;
773 x += SkIntToScalar(20);
774 SkRect r = { x, 0, x + SkIntToScalar(360), SkIntToScalar(700) };
775 paint.setXfermode(&mode);
776 paint.setColor(SK_ColorGREEN);
777 paint.setAntiAlias(true);
778 canvas->drawOval(r, paint);
779 }
780 }
781
782private:
783 SkPoint fClickPt;
784 SkBitmap fBug, fTb, fTx;
785 typedef SkView INHERITED;
786};
787
788//////////////////////////////////////////////////////////////////////////////
789
790static SkView* MyFactory() { return new DemoView; }
791static SkViewRegister reg(MyFactory);
792