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 uint32_t onGetFlags() const SK_OVERRIDE {
40        return kSkipTiled_Flag;
41    }
42
43    virtual SkString onShortName() {
44        return SkString("shadows");
45    }
46
47    virtual SkISize onISize() {
48        return SkISize::Make(200, 120);
49    }
50
51    virtual void onDraw(SkCanvas* canvas) {
52    SkBlurDrawLooper* shadowLoopers[5];
53    shadowLoopers[0] =
54        SkBlurDrawLooper::Create(SK_ColorBLUE,
55                                 SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(10)),
56                                 SkIntToScalar(5), SkIntToScalar(10),
57                                 SkBlurDrawLooper::kIgnoreTransform_BlurFlag |
58                                 SkBlurDrawLooper::kOverrideColor_BlurFlag |
59                                 SkBlurDrawLooper::kHighQuality_BlurFlag);
60    SkAutoUnref aurL0(shadowLoopers[0]);
61    shadowLoopers[1] =
62        SkBlurDrawLooper::Create(SK_ColorBLUE,
63                                 SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(10)),
64                                 SkIntToScalar(5), SkIntToScalar(10),
65                                 SkBlurDrawLooper::kIgnoreTransform_BlurFlag |
66                                 SkBlurDrawLooper::kOverrideColor_BlurFlag);
67    SkAutoUnref aurL1(shadowLoopers[1]);
68    shadowLoopers[2] =
69        SkBlurDrawLooper::Create(SK_ColorBLACK,
70                                 SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(5)),
71                                 SkIntToScalar(5),
72                                 SkIntToScalar(10),
73                                 SkBlurDrawLooper::kIgnoreTransform_BlurFlag |
74                                 SkBlurDrawLooper::kHighQuality_BlurFlag);
75    SkAutoUnref aurL2(shadowLoopers[2]);
76    shadowLoopers[3] =
77        SkBlurDrawLooper::Create(0x7FFF0000,
78                                 SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(5)),
79                                 SkIntToScalar(-5), SkIntToScalar(-10),
80                                 SkBlurDrawLooper::kIgnoreTransform_BlurFlag |
81                                 SkBlurDrawLooper::kOverrideColor_BlurFlag |
82                                 SkBlurDrawLooper::kHighQuality_BlurFlag);
83    SkAutoUnref aurL3(shadowLoopers[3]);
84    shadowLoopers[4] =
85        SkBlurDrawLooper::Create(SK_ColorBLACK, SkIntToScalar(0),
86                                 SkIntToScalar(5), SkIntToScalar(5),
87                                 SkBlurDrawLooper::kIgnoreTransform_BlurFlag |
88                                 SkBlurDrawLooper::kOverrideColor_BlurFlag |
89                                 SkBlurDrawLooper::kHighQuality_BlurFlag);
90    SkAutoUnref aurL4(shadowLoopers[4]);
91
92    static const struct {
93        SkColor fColor;
94        SkScalar fStrokeWidth;
95    } gRec[] = {
96        { SK_ColorRED,      -SK_Scalar1 },
97        { SK_ColorGREEN,    SkIntToScalar(4) },
98        { SK_ColorBLUE,     SkIntToScalar(0)},
99    };
100
101    SkPaint paint;
102    paint.setAntiAlias(true);
103    for (size_t i = 0; i < SK_ARRAY_COUNT(shadowLoopers); ++i) {
104        SkAutoCanvasRestore acr(canvas, true);
105
106        paint.setLooper(shadowLoopers[i]);
107
108        canvas->translate(SkIntToScalar((unsigned int)i*40), SkIntToScalar(0));
109        setup(&paint, gRec[0].fColor, gRec[0].fStrokeWidth);
110        canvas->drawRect(fRect, paint);
111
112        canvas->translate(SkIntToScalar(0), SkIntToScalar(40));
113        setup(&paint, gRec[1].fColor, gRec[1].fStrokeWidth);
114        canvas->drawPath(fCirclePath, paint);
115
116        canvas->translate(SkIntToScalar(0), SkIntToScalar(40));
117        setup(&paint, gRec[2].fColor, gRec[2].fStrokeWidth);
118        canvas->drawPath(fCirclePath, paint);
119    }
120}
121
122private:
123    typedef GM INHERITED;
124};
125
126///////////////////////////////////////////////////////////////////////////////
127
128static GM* MyFactory(void*) { return new ShadowsGM; }
129static GMRegistry reg(MyFactory);
130
131}
132