Add playground to demonstrate mask blur problems (#37574)

diff --git a/impeller/aiks/aiks_unittests.cc b/impeller/aiks/aiks_unittests.cc
index 368a400..9b06d08 100644
--- a/impeller/aiks/aiks_unittests.cc
+++ b/impeller/aiks/aiks_unittests.cc
@@ -12,6 +12,7 @@
 #include "impeller/aiks/aiks_playground.h"
 #include "impeller/aiks/canvas.h"
 #include "impeller/aiks/image.h"
+#include "impeller/entity/contents/filters/inputs/filter_input.h"
 #include "impeller/entity/contents/tiled_texture_contents.h"
 #include "impeller/geometry/color.h"
 #include "impeller/geometry/geometry_unittests.h"
diff --git a/impeller/aiks/canvas.cc b/impeller/aiks/canvas.cc
index 6ff111b..f1a2ae4 100644
--- a/impeller/aiks/canvas.cc
+++ b/impeller/aiks/canvas.cc
@@ -161,7 +161,7 @@
                                      Scalar corner_radius,
                                      const Paint& paint) {
   // TODO(114184): This should return false when the paint's ColorSource is not
-  //               solid color.
+  //               color.
   if (!paint.mask_blur_descriptor.has_value() ||
       paint.mask_blur_descriptor->style != FilterContents::BlurStyle::kNormal ||
       paint.style != Paint::Style::kFill) {
diff --git a/impeller/display_list/display_list_unittests.cc b/impeller/display_list/display_list_unittests.cc
index 47cf96e..91e8863 100644
--- a/impeller/display_list/display_list_unittests.cc
+++ b/impeller/display_list/display_list_unittests.cc
@@ -2,12 +2,15 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include <array>
 #include <cmath>
+#include <memory>
 #include <vector>
 
 #include "display_list/display_list_blend_mode.h"
 #include "display_list/display_list_color.h"
 #include "display_list/display_list_color_filter.h"
+#include "display_list/display_list_color_source.h"
 #include "display_list/display_list_image_filter.h"
 #include "display_list/display_list_paint.h"
 #include "display_list/display_list_tile_mode.h"
@@ -20,11 +23,12 @@
 #include "impeller/geometry/constants.h"
 #include "impeller/geometry/point.h"
 #include "impeller/playground/widgets.h"
-#include "include/core/SkRRect.h"
 #include "third_party/imgui/imgui.h"
+#include "third_party/skia/include/core/SkBlurTypes.h"
 #include "third_party/skia/include/core/SkClipOp.h"
 #include "third_party/skia/include/core/SkColor.h"
 #include "third_party/skia/include/core/SkPathBuilder.h"
+#include "third_party/skia/include/core/SkRRect.h"
 
 namespace impeller {
 namespace testing {
@@ -1013,5 +1017,42 @@
   ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
 }
 
+TEST_P(DisplayListTest, MaskBlursApplyCorrectlyToColorSources) {
+  auto blur_filter = std::make_shared<flutter::DlBlurMaskFilter>(
+      SkBlurStyle::kNormal_SkBlurStyle, 10);
+
+  flutter::DisplayListBuilder builder;
+
+  std::array<flutter::DlColor, 2> colors = {flutter::DlColor::kBlue(),
+                                            flutter::DlColor::kGreen()};
+  std::array<float, 2> stops = {0, 1};
+  std::array<std::shared_ptr<flutter::DlColorSource>, 2> color_sources = {
+      std::make_shared<flutter::DlColorColorSource>(flutter::DlColor::kWhite()),
+      flutter::DlColorSource::MakeLinear(
+          SkPoint::Make(0, 0), SkPoint::Make(100, 50), 2, colors.data(),
+          stops.data(), flutter::DlTileMode::kClamp)};
+
+  int offset = 100;
+  for (auto color_source : color_sources) {
+    flutter::DlPaint paint;
+    paint.setColorSource(color_source);
+    paint.setMaskFilter(blur_filter);
+
+    paint.setDrawStyle(flutter::DlDrawStyle::kFill);
+    builder.drawRRect(
+        SkRRect::MakeRectXY(SkRect::MakeXYWH(100, offset, 100, 50), 30, 30),
+        paint);
+    paint.setDrawStyle(flutter::DlDrawStyle::kStroke);
+    paint.setStrokeWidth(10);
+    builder.drawRRect(
+        SkRRect::MakeRectXY(SkRect::MakeXYWH(300, offset, 100, 50), 30, 30),
+        paint);
+
+    offset += 100;
+  }
+
+  ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
+}
+
 }  // namespace testing
 }  // namespace impeller