1/*
2 * Copyright 2014 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 "SkBlurMask.h"
10#include "SkCanvas.h"
11#include "SkColorFilter.h"
12#include "SkEmbossMaskFilter.h"
13
14static SkBitmap make_bm() {
15    SkBitmap bm;
16    bm.allocN32Pixels(100, 100);
17
18    SkCanvas canvas(bm);
19    canvas.clear(0);
20    SkPaint paint;
21    paint.setAntiAlias(true);
22    canvas.drawCircle(50, 50, 50, paint);
23    return bm;
24}
25
26class EmbossGM : public skiagm::GM {
27public:
28    EmbossGM() {
29    }
30
31protected:
32    SkString onShortName() override {
33        return SkString("emboss");
34    }
35
36    SkISize onISize() override {
37        return SkISize::Make(600, 120);
38    }
39
40    void onDraw(SkCanvas* canvas) override {
41        SkPaint paint;
42        SkBitmap bm = make_bm();
43        canvas->drawBitmap(bm, 10, 10, &paint);
44        canvas->translate(bm.width() + SkIntToScalar(10), 0);
45
46        paint.setMaskFilter(SkEmbossMaskFilter::Make(
47            SkBlurMask::ConvertRadiusToSigma(3),
48            { { SK_Scalar1, SK_Scalar1, SK_Scalar1 }, 0, 128, 16*2 }));
49        canvas->drawBitmap(bm, 10, 10, &paint);
50        canvas->translate(bm.width() + SkIntToScalar(10), 0);
51
52        // this combination of emboss+colorfilter used to crash -- so we exercise it to
53        // confirm that we have a fix.
54        paint.setColorFilter(SkColorFilter::MakeModeFilter(0xFFFF0000, SkBlendMode::kSrcATop));
55        canvas->drawBitmap(bm, 10, 10, &paint);
56        canvas->translate(bm.width() + SkIntToScalar(10), 0);
57
58        paint.setAntiAlias(true);
59        paint.setStyle(SkPaint::kStroke_Style);
60        paint.setStrokeWidth(SkIntToScalar(10));
61        paint.setMaskFilter(SkEmbossMaskFilter::Make(
62            SkBlurMask::ConvertRadiusToSigma(4),
63            { { SK_Scalar1, SK_Scalar1, SK_Scalar1 }, 0, 128, 16*2 }));
64        paint.setColorFilter(nullptr);
65        paint.setShader(SkShader::MakeColorShader(SK_ColorBLUE));
66        paint.setDither(true);
67        canvas->drawCircle(SkIntToScalar(50), SkIntToScalar(50),
68                           SkIntToScalar(30), paint);
69        canvas->translate(SkIntToScalar(100), 0);
70
71        paint.setStyle(SkPaint::kFill_Style);
72        paint.setTextSize(50);
73        canvas->drawText("Hello", 5, 0, 50, paint);
74    }
75
76private:
77    typedef skiagm::GM INHERITED;
78};
79
80DEF_GM(return new EmbossGM;)
81