From 3ebfe9e05e1864ddedc3f1f0fb9086ba68cedde2 Mon Sep 17 00:00:00 2001 From: Brandon DeRosier Date: Mon, 25 Apr 2022 12:23:38 -0700 Subject: [PATCH] Another coverage fix for border mask blur (#158) --- .../border_mask_blur_filter_contents.cc | 9 ++--- impeller/entity/entity_unittests.cc | 40 ++++++++++++++++--- 2 files changed, 37 insertions(+), 12 deletions(-) diff --git a/impeller/entity/contents/filters/border_mask_blur_filter_contents.cc b/impeller/entity/contents/filters/border_mask_blur_filter_contents.cc index a14e2da07f4cf..2901b76060bf1 100644 --- a/impeller/entity/contents/filters/border_mask_blur_filter_contents.cc +++ b/impeller/entity/contents/filters/border_mask_blur_filter_contents.cc @@ -117,13 +117,10 @@ std::optional BorderMaskBlurFilterContents::GetFilterCoverage( if (!coverage.has_value()) { return std::nullopt; } - + auto transform = inputs[0]->GetTransform(entity); auto transformed_blur_vector = - inputs[0] - ->GetTransform(entity) - .TransformDirection( - Vector2(Radius{sigma_x_}.radius, Radius{sigma_y_}.radius)) - .Abs(); + transform.TransformDirection(Vector2(Radius{sigma_x_}.radius, 0)).Abs() + + transform.TransformDirection(Vector2(0, Radius{sigma_y_}.radius)).Abs(); auto extent = coverage->size + transformed_blur_vector * 2; return Rect(coverage->origin - transformed_blur_vector, Size(extent.x, extent.y)); diff --git a/impeller/entity/entity_unittests.cc b/impeller/entity/entity_unittests.cc index 00fbb41989451..549e5b4fb4876 100644 --- a/impeller/entity/entity_unittests.cc +++ b/impeller/entity/entity_unittests.cc @@ -766,12 +766,12 @@ TEST_P(EntityTest, GaussianBlurFilter) { // Renders a red "cover" rectangle that shows the original position of the // unfiltered input. Entity cover_entity; - cover_entity.SetContents( - SolidColorContents::Make(PathBuilder{} - .AddRect(Rect(-Point(bridge->GetSize()) / 2, - Size(bridge->GetSize()))) - .TakePath(), - cover_color)); + cover_entity.SetContents(SolidColorContents::Make( + PathBuilder{} + .AddRect( + Rect(-Point(bridge->GetSize()) / 2, Size(bridge->GetSize()))) + .TakePath(), + cover_color)); cover_entity.SetTransformation(ctm); cover_entity.Render(context, pass); @@ -853,5 +853,33 @@ TEST_P(EntityTest, SolidStrokeCoverageIsCorrect) { } } +TEST_P(EntityTest, BorderMaskBlurCoverageIsCorrect) { + auto fill = std::make_shared(); + fill->SetPath( + PathBuilder{}.AddRect(Rect::MakeXYWH(0, 0, 300, 400)).TakePath()); + fill->SetColor(Color::CornflowerBlue()); + auto border_mask_blur = FilterContents::MakeBorderMaskBlur( + FilterInput::Make(fill), FilterContents::Radius{3}, + FilterContents::Radius{4}); + + { + Entity e; + e.SetTransformation(Matrix()); + auto actual = border_mask_blur->GetCoverage(e); + auto expected = Rect::MakeXYWH(-3, -4, 306, 408); + ASSERT_TRUE(actual.has_value()); + ASSERT_RECT_NEAR(actual.value(), expected); + } + + { + Entity e; + e.SetTransformation(Matrix::MakeRotationZ(Radians{kPi / 4})); + auto actual = border_mask_blur->GetCoverage(e); + auto expected = Rect::MakeXYWH(-287.792, -4.94975, 504.874, 504.874); + ASSERT_TRUE(actual.has_value()); + ASSERT_RECT_NEAR(actual.value(), expected); + } +} + } // namespace testing } // namespace impeller