|
5 | 5 | #include "impeller/display_list/dl_golden_unittests.h" |
6 | 6 |
|
7 | 7 | #include "flutter/display_list/dl_builder.h" |
| 8 | +#include "flutter/impeller/geometry/path_builder.h" |
8 | 9 | #include "flutter/testing/testing.h" |
9 | 10 | #include "gtest/gtest.h" |
10 | 11 |
|
@@ -182,6 +183,68 @@ TEST_P(DlGoldenTest, GaussianVsRRectBlurScaledRotated) { |
182 | 183 | ASSERT_TRUE(OpenPlaygroundHere(builder.Build())); |
183 | 184 | } |
184 | 185 |
|
| 186 | +TEST_P(DlGoldenTest, FastVsGeneralGaussianMaskBlur) { |
| 187 | + DisplayListBuilder builder; |
| 188 | + builder.Scale(GetContentScale().x, GetContentScale().y); |
| 189 | + builder.DrawColor(DlColor::kWhite(), DlBlendMode::kSrc); |
| 190 | + |
| 191 | + auto blur_sigmas = std::array{5.0f, 10.0f, 20.0f}; |
| 192 | + auto blur_colors = std::array{ |
| 193 | + DlColor::kBlue(), |
| 194 | + DlColor::kGreen(), |
| 195 | + DlColor::kMaroon(), |
| 196 | + }; |
| 197 | + |
| 198 | + auto make_rrect_path = [](const SkRect& rect, DlScalar rx, |
| 199 | + DlScalar ry) -> SkPath { |
| 200 | + auto add_corner = [](SkPath& path, SkPoint rCorner, SkPoint rEnd) { |
| 201 | + static const auto magic = impeller::PathBuilder::kArcApproximationMagic; |
| 202 | + path.rCubicTo(rCorner.fX * (1.0f - magic), rCorner.fY * (1.0f - magic), |
| 203 | + rCorner.fX + rEnd.fX * magic, rCorner.fY + rEnd.fY * magic, |
| 204 | + rCorner.fX + rEnd.fX, rCorner.fY + rEnd.fY); |
| 205 | + }; |
| 206 | + |
| 207 | + SkPath path; |
| 208 | + path.moveTo(rect.fRight - rx, rect.fTop); |
| 209 | + add_corner(path, {rx, 0.0f}, {0.0f, ry}); |
| 210 | + path.lineTo(rect.fRight, rect.fBottom - ry); |
| 211 | + add_corner(path, {0.0f, ry}, {-rx, 0.0f}); |
| 212 | + path.lineTo(rect.fLeft + rx, rect.fBottom); |
| 213 | + add_corner(path, {-rx, 0.0f}, {0.0f, -ry}); |
| 214 | + path.lineTo(rect.fLeft, rect.fTop + ry); |
| 215 | + add_corner(path, {0.0f, -ry}, {rx, 0.0f}); |
| 216 | + path.close(); |
| 217 | + return path; |
| 218 | + }; |
| 219 | + |
| 220 | + for (size_t i = 0; i < blur_sigmas.size(); i++) { |
| 221 | + auto rect = SkRect::MakeXYWH(i * 320.0f + 50.0f, 50.0f, 100.0f, 100.0f); |
| 222 | + DlPaint paint = DlPaint() // |
| 223 | + .setColor(blur_colors[i]) |
| 224 | + .setMaskFilter(DlBlurMaskFilter::Make( |
| 225 | + DlBlurStyle::kNormal, blur_sigmas[i])); |
| 226 | + |
| 227 | + builder.DrawRRect(SkRRect::MakeRectXY(rect, 10.0f, 10.0f), paint); |
| 228 | + rect = rect.makeOffset(150.0f, 0.0f); |
| 229 | + builder.DrawPath(make_rrect_path(rect, 10.0f, 10.0f), paint); |
| 230 | + rect = rect.makeOffset(-150.0f, 0.0f); |
| 231 | + |
| 232 | + rect = rect.makeOffset(0.0f, 200.0f); |
| 233 | + builder.DrawRRect(SkRRect::MakeRectXY(rect, 10.0f, 30.0f), paint); |
| 234 | + rect = rect.makeOffset(150.0f, 0.0f); |
| 235 | + builder.DrawPath(make_rrect_path(rect, 10.0f, 20.0f), paint); |
| 236 | + rect = rect.makeOffset(-150.0f, 0.0f); |
| 237 | + |
| 238 | + rect = rect.makeOffset(0.0f, 200.0f); |
| 239 | + builder.DrawRRect(SkRRect::MakeRectXY(rect, 30.0f, 10.0f), paint); |
| 240 | + rect = rect.makeOffset(150.0f, 0.0f); |
| 241 | + builder.DrawPath(make_rrect_path(rect, 20.0f, 10.0f), paint); |
| 242 | + rect = rect.makeOffset(-150.0f, 0.0f); |
| 243 | + } |
| 244 | + |
| 245 | + ASSERT_TRUE(OpenPlaygroundHere(builder.Build())); |
| 246 | +} |
| 247 | + |
185 | 248 | TEST_P(DlGoldenTest, DashedLinesTest) { |
186 | 249 | Point content_scale = GetContentScale(); |
187 | 250 | auto draw = [content_scale](DlCanvas* canvas, |
|
0 commit comments