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
12namespace skiagm {
13
14///////////////////////////////////////////////////////////////////////////////
15
16static 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
26class ShadowsGM : public GM {
27public:
28    SkPath fCirclePath;
29    SkRect fRect;
30
31    ShadowsGM() {
32        this->setBGColor(0xFFDDDDDD);
33        fCirclePath.addCircle(SkIntToScalar(20), SkIntToScalar(20), SkIntToScalar(10) );
34        fRect.set(SkIntToScalar(10), SkIntToScalar(10),
35                  SkIntToScalar(30), SkIntToScalar(30));
36    }
37
38protected:
39    virtual SkString onShortName() {
40        return SkString("shadows");
41    }
42
43    virtual SkISize onISize() {
44        return SkISize::Make(200, 120);
45    }
46
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
118private:
119    typedef GM INHERITED;
120};
121
122///////////////////////////////////////////////////////////////////////////////
123
124static GM* MyFactory(void*) { return new ShadowsGM; }
125static GMRegistry reg(MyFactory);
126
127}
128