1
2 /*
3 * Copyright 2011 Google Inc.
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
8 #include "gm.h"
9 #include "SkBlurMask.h"
10 #include "SkBlurDrawLooper.h"
11
12 namespace skiagm {
13
14 ///////////////////////////////////////////////////////////////////////////////
15
setup(SkPaint * paint,SkColor c,SkScalar strokeWidth)16 static void setup(SkPaint* paint, SkColor c, SkScalar strokeWidth) {
17 paint->setColor(c);
18 if (strokeWidth < 0) {
19 paint->setStyle(SkPaint::kFill_Style);
20 } else {
21 paint->setStyle(SkPaint::kStroke_Style);
22 paint->setStrokeWidth(strokeWidth);
23 }
24 }
25
26 class ShadowsGM : public GM {
27 public:
28 SkPath fCirclePath;
29 SkRect fRect;
30
31 protected:
onOnceBeforeDraw()32 void onOnceBeforeDraw() override {
33 this->setBGColor(0xFFDDDDDD);
34 fCirclePath.addCircle(SkIntToScalar(20), SkIntToScalar(20), SkIntToScalar(10) );
35 fRect.set(SkIntToScalar(10), SkIntToScalar(10),
36 SkIntToScalar(30), SkIntToScalar(30));
37 }
38
onShortName()39 virtual SkString onShortName() {
40 return SkString("shadows");
41 }
42
onISize()43 virtual SkISize onISize() {
44 return SkISize::Make(200, 120);
45 }
46
onDraw(SkCanvas * canvas)47 virtual void onDraw(SkCanvas* canvas) {
48 SkBlurDrawLooper* shadowLoopers[5];
49 shadowLoopers[0] =
50 SkBlurDrawLooper::Create(SK_ColorBLUE,
51 SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(10)),
52 SkIntToScalar(5), SkIntToScalar(10),
53 SkBlurDrawLooper::kIgnoreTransform_BlurFlag |
54 SkBlurDrawLooper::kOverrideColor_BlurFlag |
55 SkBlurDrawLooper::kHighQuality_BlurFlag);
56 SkAutoUnref aurL0(shadowLoopers[0]);
57 shadowLoopers[1] =
58 SkBlurDrawLooper::Create(SK_ColorBLUE,
59 SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(10)),
60 SkIntToScalar(5), SkIntToScalar(10),
61 SkBlurDrawLooper::kIgnoreTransform_BlurFlag |
62 SkBlurDrawLooper::kOverrideColor_BlurFlag);
63 SkAutoUnref aurL1(shadowLoopers[1]);
64 shadowLoopers[2] =
65 SkBlurDrawLooper::Create(SK_ColorBLACK,
66 SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(5)),
67 SkIntToScalar(5),
68 SkIntToScalar(10),
69 SkBlurDrawLooper::kIgnoreTransform_BlurFlag |
70 SkBlurDrawLooper::kHighQuality_BlurFlag);
71 SkAutoUnref aurL2(shadowLoopers[2]);
72 shadowLoopers[3] =
73 SkBlurDrawLooper::Create(0x7FFF0000,
74 SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(5)),
75 SkIntToScalar(-5), SkIntToScalar(-10),
76 SkBlurDrawLooper::kIgnoreTransform_BlurFlag |
77 SkBlurDrawLooper::kOverrideColor_BlurFlag |
78 SkBlurDrawLooper::kHighQuality_BlurFlag);
79 SkAutoUnref aurL3(shadowLoopers[3]);
80 shadowLoopers[4] =
81 SkBlurDrawLooper::Create(SK_ColorBLACK, SkIntToScalar(0),
82 SkIntToScalar(5), SkIntToScalar(5),
83 SkBlurDrawLooper::kIgnoreTransform_BlurFlag |
84 SkBlurDrawLooper::kOverrideColor_BlurFlag |
85 SkBlurDrawLooper::kHighQuality_BlurFlag);
86 SkAutoUnref aurL4(shadowLoopers[4]);
87
88 static const struct {
89 SkColor fColor;
90 SkScalar fStrokeWidth;
91 } gRec[] = {
92 { SK_ColorRED, -SK_Scalar1 },
93 { SK_ColorGREEN, SkIntToScalar(4) },
94 { SK_ColorBLUE, SkIntToScalar(0)},
95 };
96
97 SkPaint paint;
98 paint.setAntiAlias(true);
99 for (size_t i = 0; i < SK_ARRAY_COUNT(shadowLoopers); ++i) {
100 SkAutoCanvasRestore acr(canvas, true);
101
102 paint.setLooper(shadowLoopers[i]);
103
104 canvas->translate(SkIntToScalar((unsigned int)i*40), SkIntToScalar(0));
105 setup(&paint, gRec[0].fColor, gRec[0].fStrokeWidth);
106 canvas->drawRect(fRect, paint);
107
108 canvas->translate(SkIntToScalar(0), SkIntToScalar(40));
109 setup(&paint, gRec[1].fColor, gRec[1].fStrokeWidth);
110 canvas->drawPath(fCirclePath, paint);
111
112 canvas->translate(SkIntToScalar(0), SkIntToScalar(40));
113 setup(&paint, gRec[2].fColor, gRec[2].fStrokeWidth);
114 canvas->drawPath(fCirclePath, paint);
115 }
116 }
117
118 private:
119 typedef GM INHERITED;
120 };
121
122 ///////////////////////////////////////////////////////////////////////////////
123
MyFactory(void *)124 static GM* MyFactory(void*) { return new ShadowsGM; }
125 static GMRegistry reg(MyFactory);
126
127 }
128