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 "SkBlurDrawLooper.h"
10
11namespace skiagm {
12
13///////////////////////////////////////////////////////////////////////////////
14
15static void setup(SkPaint* paint, SkColor c, SkScalar strokeWidth) {
16    paint->setColor(c);
17    if (strokeWidth < 0) {
18        paint->setStyle(SkPaint::kFill_Style);
19    } else {
20        paint->setStyle(SkPaint::kStroke_Style);
21        paint->setStrokeWidth(strokeWidth);
22    }
23}
24
25class ShadowsGM : public GM {
26public:
27    SkPath fCirclePath;
28    SkRect fRect;
29
30    ShadowsGM() {
31        this->setBGColor(0xFFDDDDDD);
32        fCirclePath.addCircle(SkIntToScalar(20), SkIntToScalar(20), SkIntToScalar(10) );
33        fRect.set(SkIntToScalar(10), SkIntToScalar(10),
34                  SkIntToScalar(30), SkIntToScalar(30));
35    }
36
37protected:
38    virtual SkString onShortName() {
39        return SkString("shadows");
40    }
41
42    virtual SkISize onISize() {
43        return make_isize(200, 80);
44    }
45
46    virtual void onDraw(SkCanvas* canvas) {
47    SkBlurDrawLooper* shadowLoopers[5];
48    shadowLoopers[0] =
49        new SkBlurDrawLooper (SkIntToScalar(10), SkIntToScalar(5),
50                              SkIntToScalar(10), 0xFF0000FF,
51                              SkBlurDrawLooper::kIgnoreTransform_BlurFlag |
52                              SkBlurDrawLooper::kOverrideColor_BlurFlag |
53                              SkBlurDrawLooper::kHighQuality_BlurFlag );
54    SkAutoUnref aurL0(shadowLoopers[0]);
55    shadowLoopers[1] =
56        new SkBlurDrawLooper (SkIntToScalar(10), SkIntToScalar(5),
57                              SkIntToScalar(10), 0xFF0000FF,
58                              SkBlurDrawLooper::kIgnoreTransform_BlurFlag |
59                              SkBlurDrawLooper::kOverrideColor_BlurFlag );
60    SkAutoUnref aurL1(shadowLoopers[1]);
61    shadowLoopers[2] =
62        new SkBlurDrawLooper (SkIntToScalar(5), SkIntToScalar(5),
63                              SkIntToScalar(10), 0xFF000000,
64                              SkBlurDrawLooper::kIgnoreTransform_BlurFlag |
65                              SkBlurDrawLooper::kHighQuality_BlurFlag  );
66    SkAutoUnref aurL2(shadowLoopers[2]);
67    shadowLoopers[3] =
68        new SkBlurDrawLooper (SkIntToScalar(5), SkIntToScalar(-5),
69                              SkIntToScalar(-10), 0x7FFF0000,
70                              SkBlurDrawLooper::kIgnoreTransform_BlurFlag |
71                              SkBlurDrawLooper::kOverrideColor_BlurFlag |
72                              SkBlurDrawLooper::kHighQuality_BlurFlag  );
73    SkAutoUnref aurL3(shadowLoopers[3]);
74    shadowLoopers[4] =
75        new SkBlurDrawLooper (SkIntToScalar(0), SkIntToScalar(5),
76                              SkIntToScalar(5), 0xFF000000,
77                              SkBlurDrawLooper::kIgnoreTransform_BlurFlag |
78                              SkBlurDrawLooper::kOverrideColor_BlurFlag |
79                              SkBlurDrawLooper::kHighQuality_BlurFlag  );
80    SkAutoUnref aurL4(shadowLoopers[4]);
81
82    static const struct {
83        SkColor fColor;
84        SkScalar fStrokeWidth;
85    } gRec[] = {
86        { SK_ColorRED,      -SK_Scalar1 },
87        { SK_ColorGREEN,    SkIntToScalar(4) },
88    };
89
90    SkPaint paint;
91    paint.setAntiAlias(true);
92    for (size_t i = 0; i < SK_ARRAY_COUNT(shadowLoopers); ++i) {
93        SkAutoCanvasRestore acr(canvas, true);
94
95        paint.setLooper(shadowLoopers[i]);
96
97        canvas->translate(SkIntToScalar(i*40), SkIntToScalar(0));
98        setup(&paint, gRec[0].fColor, gRec[0].fStrokeWidth);
99        canvas->drawRect(fRect, paint);
100
101        canvas->translate(SkIntToScalar(0), SkIntToScalar(40));
102        setup(&paint, gRec[1].fColor, gRec[1].fStrokeWidth);
103        canvas->drawPath(fCirclePath, paint);
104    }
105}
106
107private:
108    typedef GM INHERITED;
109};
110
111///////////////////////////////////////////////////////////////////////////////
112
113static GM* MyFactory(void*) { return new ShadowsGM; }
114static GMRegistry reg(MyFactory);
115
116}
117