blob: 28fc19d95d6c6b40af724b6e1105801f4da426dd [file] [log] [blame]
Greg Daniel2cb7a1a2017-05-30 11:15:07 -04001/*
2 * Copyright 2017 Google Inc.
3 *
4 * Use of this source code is governed by a BD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#include "gm.h"
9#include "sk_tool_utils.h"
10
11#include "SkBlurMask.h"
Greg Daniel2cb7a1a2017-05-30 11:15:07 -040012#include "SkCanvas.h"
Mike Reed1be1f8d2018-03-14 13:01:17 -040013#include "SkMaskFilter.h"
Greg Daniel2cb7a1a2017-05-30 11:15:07 -040014#include "SkPaint.h"
15
16// This GM tests out the SkBlurMaskFilter's kIgnoreTransform flag. That flag causes the blur mask
17// filter to not apply the CTM to the blur's radius.
18class BlurIgnoreXformGM : public skiagm::GM {
19public:
20 enum class DrawType {
21 kCircle,
22 kRect,
23 kRRect,
24 };
25
26 BlurIgnoreXformGM(DrawType drawType) : fDrawType(drawType) { }
27
28protected:
29 bool runAsBench() const override { return true; }
30
31 SkString onShortName() override {
32 SkString name;
33 name.printf("blur_ignore_xform_%s",
34 DrawType::kCircle == fDrawType ? "circle"
35 : DrawType::kRect == fDrawType ? "rect" : "rrect");
36 return name;
37 }
38
39 SkISize onISize() override {
40 return SkISize::Make(375, 475);
41 }
42
43 void onOnceBeforeDraw() override {
44 for (int i = 0; i < kNumBlurs; ++i) {
Mike Reed1be1f8d2018-03-14 13:01:17 -040045 fBlurFilters[i] = SkMaskFilter::MakeBlur(
Greg Daniel2cb7a1a2017-05-30 11:15:07 -040046 kNormal_SkBlurStyle,
47 SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(20)),
Mike Reed1be1f8d2018-03-14 13:01:17 -040048 kBlurFlags[i].fRespectCTM);
Greg Daniel2cb7a1a2017-05-30 11:15:07 -040049 }
50 }
51
52 void onDraw(SkCanvas* canvas) override {
53 SkPaint paint;
54 paint.setColor(SK_ColorBLACK);
55 paint.setAntiAlias(true);
56
57 canvas->translate(10, 25);
58 canvas->save();
59 canvas->translate(80, 0);
60 for (size_t i = 0; i < kNumBlurs; ++i) {
61 SkAutoCanvasRestore autoRestore(canvas, true);
62 canvas->translate(SkIntToScalar(i * 150), 0);
63 for (auto scale : kMatrixScales) {
64 canvas->save();
65 canvas->scale(scale.fScale, scale.fScale);
66 static const SkScalar kRadius = 20.0f;
67 SkScalar coord = 50.0f * 1.0f / scale.fScale;
68 SkRect rect = SkRect::MakeXYWH(coord - kRadius , coord - kRadius,
69 2 * kRadius, 2 * kRadius);
70 SkRRect rrect = SkRRect::MakeRectXY(rect, kRadius/2.0f, kRadius/2.0f);
71
72 paint.setMaskFilter(fBlurFilters[i]);
73 for (int j = 0; j < 2; ++j) {
74 canvas->save();
75 canvas->translate(10 * (1 - j), 10 * (1 - j));
76 if (DrawType::kCircle == fDrawType) {
77 canvas->drawCircle(coord, coord, kRadius, paint);
78 } else if (DrawType::kRect == fDrawType) {
79 canvas->drawRect(rect, paint);
80 } else {
81 canvas->drawRRect(rrect, paint);
82 }
83 paint.setMaskFilter(nullptr);
84 canvas->restore();
85 }
86 canvas->restore();
87 canvas->translate(0, SkIntToScalar(150));
88 }
89 }
90 canvas->restore();
91 if (kBench_Mode != this->getMode()) {
92 this->drawOverlay(canvas);
93 }
94 }
95
96 void drawOverlay(SkCanvas* canvas) {
97 canvas->translate(10, 0);
Mike Reedc4745d62019-01-07 09:31:58 -050098 SkFont font(sk_tool_utils::create_portable_typeface());
Greg Daniel2cb7a1a2017-05-30 11:15:07 -040099 canvas->save();
100 for (int i = 0; i < kNumBlurs; ++i) {
Mike Reedc4745d62019-01-07 09:31:58 -0500101 canvas->drawString(kBlurFlags[i].fName, 100, 0, font, SkPaint());
Greg Daniel2cb7a1a2017-05-30 11:15:07 -0400102 canvas->translate(SkIntToScalar(130), 0);
103 }
104 canvas->restore();
105 for (auto scale : kMatrixScales) {
Mike Reedc4745d62019-01-07 09:31:58 -0500106 canvas->drawString(scale.fName, 0, 50, font, SkPaint());
Greg Daniel2cb7a1a2017-05-30 11:15:07 -0400107 canvas->translate(0, SkIntToScalar(150));
108 }
109 }
110
111private:
112 static constexpr int kNumBlurs = 2;
113
114 static const struct BlurFlags {
Mike Reed1be1f8d2018-03-14 13:01:17 -0400115 bool fRespectCTM;
Greg Daniel2cb7a1a2017-05-30 11:15:07 -0400116 const char* fName;
117 } kBlurFlags[kNumBlurs];
118
119 static const struct MatrixScale {
120 float fScale;
121 const char* fName;
122 } kMatrixScales[3];
123
124 DrawType fDrawType;
125 sk_sp<SkMaskFilter> fBlurFilters[kNumBlurs];
126
127 typedef skiagm::GM INHERITED;
128};
129
130const BlurIgnoreXformGM::BlurFlags BlurIgnoreXformGM::kBlurFlags[] = {
Mike Reed1be1f8d2018-03-14 13:01:17 -0400131 {true, "none"},
132 {false, "IgnoreTransform"}
Greg Daniel2cb7a1a2017-05-30 11:15:07 -0400133};
134
135const BlurIgnoreXformGM::MatrixScale BlurIgnoreXformGM::kMatrixScales[] = {
136 {1.0f, "Identity"},
137 {0.5f, "Scale = 0.5"},
138 {2.0f, "Scale = 2.0"}
139};
140
141DEF_GM(return new BlurIgnoreXformGM(BlurIgnoreXformGM::DrawType::kCircle);)
142DEF_GM(return new BlurIgnoreXformGM(BlurIgnoreXformGM::DrawType::kRect);)
143DEF_GM(return new BlurIgnoreXformGM(BlurIgnoreXformGM::DrawType::kRRect);)
144
145
146