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 
14 static 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 
26 class EmbossGM : public skiagm::GM {
27 public:
28     EmbossGM() {
29     }
30 
31 protected:
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 
76 private:
77     typedef skiagm::GM INHERITED;
78 };
79 
80 DEF_GM(return new EmbossGM;)
81