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