diff --git a/impeller/aiks/paint.cc b/impeller/aiks/paint.cc index d88043c8c3b68..04b93e248bea1 100644 --- a/impeller/aiks/paint.cc +++ b/impeller/aiks/paint.cc @@ -45,9 +45,9 @@ std::shared_ptr Paint::WithFilters( std::optional is_solid_color, const Matrix& effect_transform) const { bool is_solid_color_val = is_solid_color.value_or(!color_source); + input = WithColorFilter(input); input = WithMaskBlur(input, is_solid_color_val, effect_transform); input = WithImageFilter(input, effect_transform); - input = WithColorFilter(input); return input; } diff --git a/impeller/display_list/display_list_unittests.cc b/impeller/display_list/display_list_unittests.cc index fb637ed509019..f640d17d2036c 100644 --- a/impeller/display_list/display_list_unittests.cc +++ b/impeller/display_list/display_list_unittests.cc @@ -959,5 +959,34 @@ TEST_P(DisplayListTest, CanBlendDstOverAndDstCorrectly) { ASSERT_TRUE(OpenPlaygroundHere(builder.Build())); } +TEST_P(DisplayListTest, CanDrawCorrectlyWithColorFilterAndImageFilter) { + flutter::DisplayListBuilder builder; + const float green_color_matrix[20] = { + 0, 0, 0, 0, 0, // + 0, 0, 0, 0, 1, // + 0, 0, 0, 0, 0, // + 0, 0, 0, 1, 0, // + }; + const float blue_color_matrix[20] = { + 0, 0, 0, 0, 0, // + 0, 0, 0, 0, 0, // + 0, 0, 0, 0, 1, // + 0, 0, 0, 1, 0, // + }; + auto green_color_filter = + std::make_shared(green_color_matrix); + auto blue_color_filter = + std::make_shared(blue_color_matrix); + auto blue_image_filter = + std::make_shared(blue_color_filter); + + flutter::DlPaint paint; + paint.setColor(flutter::DlColor::kRed()); + paint.setColorFilter(green_color_filter); + paint.setImageFilter(blue_image_filter); + builder.drawRect(SkRect::MakeLTRB(100, 100, 500, 500), paint); + ASSERT_TRUE(OpenPlaygroundHere(builder.Build())); +} + } // namespace testing } // namespace impeller