[DisplayList] Delete (publicly) unused DlColorColorSource (#56825)

While recently updating the DlColorSource sources I noticed some questionably implementation choices in the Color variant of the color sources.

I then realized that there was no public use of these classes (other than mostly their own unit tests) and so they should be deleted to focus on implementing the variants that are actually used by Flutter.
diff --git a/ci/licenses_golden/licenses_flutter b/ci/licenses_golden/licenses_flutter
index 15bb634..34e34f9 100644
--- a/ci/licenses_golden/licenses_flutter
+++ b/ci/licenses_golden/licenses_flutter
@@ -42540,8 +42540,6 @@
 ORIGIN: ../../../flutter/display_list/effects/color_filters/dl_matrix_color_filter.h + ../../../flutter/LICENSE
 ORIGIN: ../../../flutter/display_list/effects/color_filters/dl_srgb_to_linear_gamma_color_filter.cc + ../../../flutter/LICENSE
 ORIGIN: ../../../flutter/display_list/effects/color_filters/dl_srgb_to_linear_gamma_color_filter.h + ../../../flutter/LICENSE
-ORIGIN: ../../../flutter/display_list/effects/color_sources/dl_color_color_source.cc + ../../../flutter/LICENSE
-ORIGIN: ../../../flutter/display_list/effects/color_sources/dl_color_color_source.h + ../../../flutter/LICENSE
 ORIGIN: ../../../flutter/display_list/effects/color_sources/dl_conical_gradient_color_source.cc + ../../../flutter/LICENSE
 ORIGIN: ../../../flutter/display_list/effects/color_sources/dl_conical_gradient_color_source.h + ../../../flutter/LICENSE
 ORIGIN: ../../../flutter/display_list/effects/color_sources/dl_gradient_color_source_base.h + ../../../flutter/LICENSE
@@ -45467,8 +45465,6 @@
 FILE: ../../../flutter/display_list/effects/color_filters/dl_matrix_color_filter.h
 FILE: ../../../flutter/display_list/effects/color_filters/dl_srgb_to_linear_gamma_color_filter.cc
 FILE: ../../../flutter/display_list/effects/color_filters/dl_srgb_to_linear_gamma_color_filter.h
-FILE: ../../../flutter/display_list/effects/color_sources/dl_color_color_source.cc
-FILE: ../../../flutter/display_list/effects/color_sources/dl_color_color_source.h
 FILE: ../../../flutter/display_list/effects/color_sources/dl_conical_gradient_color_source.cc
 FILE: ../../../flutter/display_list/effects/color_sources/dl_conical_gradient_color_source.h
 FILE: ../../../flutter/display_list/effects/color_sources/dl_gradient_color_source_base.h
diff --git a/display_list/BUILD.gn b/display_list/BUILD.gn
index b8b863d..3ed4e72 100644
--- a/display_list/BUILD.gn
+++ b/display_list/BUILD.gn
@@ -55,8 +55,6 @@
     "effects/color_filters/dl_matrix_color_filter.h",
     "effects/color_filters/dl_srgb_to_linear_gamma_color_filter.cc",
     "effects/color_filters/dl_srgb_to_linear_gamma_color_filter.h",
-    "effects/color_sources/dl_color_color_source.cc",
-    "effects/color_sources/dl_color_color_source.h",
     "effects/color_sources/dl_conical_gradient_color_source.cc",
     "effects/color_sources/dl_conical_gradient_color_source.h",
     "effects/color_sources/dl_image_color_source.cc",
diff --git a/display_list/dl_builder.cc b/display_list/dl_builder.cc
index a6ff898..3e0e18d 100644
--- a/display_list/dl_builder.cc
+++ b/display_list/dl_builder.cc
@@ -201,12 +201,6 @@
     current_.setColorSource(source->shared());
     is_ui_thread_safe_ = is_ui_thread_safe_ && source->isUIThreadSafe();
     switch (source->type()) {
-      case DlColorSourceType::kColor: {
-        const DlColorColorSource* color_source = source->asColor();
-        current_.setColorSource(nullptr);
-        setColor(color_source->color());
-        break;
-      }
       case DlColorSourceType::kImage: {
         const DlImageColorSource* image_source = source->asImage();
         FML_DCHECK(image_source);
@@ -1953,11 +1947,9 @@
   if (flags.applies_color()) {
     const DlColorSource* source = paint.getColorSourcePtr();
     if (source) {
-      if (source->asColor()) {
-        color = source->asColor()->color();
-      } else {
-        color = source->is_opaque() ? DlColor::kBlack() : kAnyColor;
-      }
+      // Suspecting that we need to modulate the ColorSource color by the
+      // color property, see https://github.com/flutter/flutter/issues/159507
+      color = source->is_opaque() ? DlColor::kBlack() : kAnyColor;
     } else {
       color = paint.getColor();
     }
diff --git a/display_list/dl_paint_unittests.cc b/display_list/dl_paint_unittests.cc
index 617a7b5..e03f02e 100644
--- a/display_list/dl_paint_unittests.cc
+++ b/display_list/dl_paint_unittests.cc
@@ -56,7 +56,16 @@
   EXPECT_NE(paint, DlPaint().setStrokeWidth(6));
   EXPECT_NE(paint, DlPaint().setStrokeMiter(7));
 
-  auto color_source = DlColorSource::MakeColor(DlColor::kMagenta());
+  DlColor colors[2] = {
+      DlColor::kGreen(),
+      DlColor::kBlue(),
+  };
+  float stops[2] = {
+      0.0f,
+      1.0f,
+  };
+  auto color_source = DlColorSource::MakeLinear({0, 0}, {10, 10}, 2, colors,
+                                                stops, DlTileMode::kClamp);
   EXPECT_NE(paint, DlPaint().setColorSource(color_source));
 
   auto color_filter =
@@ -95,19 +104,28 @@
 }
 
 TEST(DisplayListPaint, ChainingConstructor) {
+  DlColor colors[2] = {
+      DlColor::kGreen(),
+      DlColor::kBlue(),
+  };
+  float stops[2] = {
+      0.0f,
+      1.0f,
+  };
   DlPaint paint =
-      DlPaint()                                                           //
-          .setAntiAlias(true)                                             //
-          .setInvertColors(true)                                          //
-          .setColor(DlColor::kGreen())                                    //
-          .setAlpha(0x7F)                                                 //
-          .setBlendMode(DlBlendMode::kLuminosity)                         //
-          .setDrawStyle(DlDrawStyle::kStrokeAndFill)                      //
-          .setStrokeCap(DlStrokeCap::kSquare)                             //
-          .setStrokeJoin(DlStrokeJoin::kBevel)                            //
-          .setStrokeWidth(42)                                             //
-          .setStrokeMiter(1.5)                                            //
-          .setColorSource(DlColorSource::MakeColor(DlColor::kMagenta()))  //
+      DlPaint()                                                         //
+          .setAntiAlias(true)                                           //
+          .setInvertColors(true)                                        //
+          .setColor(DlColor::kGreen())                                  //
+          .setAlpha(0x7F)                                               //
+          .setBlendMode(DlBlendMode::kLuminosity)                       //
+          .setDrawStyle(DlDrawStyle::kStrokeAndFill)                    //
+          .setStrokeCap(DlStrokeCap::kSquare)                           //
+          .setStrokeJoin(DlStrokeJoin::kBevel)                          //
+          .setStrokeWidth(42)                                           //
+          .setStrokeMiter(1.5)                                          //
+          .setColorSource(DlColorSource::MakeLinear(                    //
+              {0, 0}, {10, 10}, 2, colors, stops, DlTileMode::kClamp))  //
           .setColorFilter(
               DlColorFilter::MakeBlend(DlColor::kYellow(), DlBlendMode::kDstIn))
           .setImageFilter(DlImageFilter::MakeBlur(1.3, 4.7, DlTileMode::kClamp))
@@ -123,7 +141,8 @@
   EXPECT_EQ(paint.getStrokeWidth(), 42);
   EXPECT_EQ(paint.getStrokeMiter(), 1.5);
   EXPECT_TRUE(Equals(paint.getColorSource(),
-                     DlColorSource::MakeColor(DlColor::kMagenta())));
+                     DlColorSource::MakeLinear({0, 0}, {10, 10}, 2, colors,
+                                               stops, DlTileMode::kClamp)));
   EXPECT_TRUE(Equals(
       paint.getColorFilter(),
       DlColorFilter::MakeBlend(DlColor::kYellow(), DlBlendMode::kDstIn)));
diff --git a/display_list/effects/color_sources/dl_color_color_source.cc b/display_list/effects/color_sources/dl_color_color_source.cc
deleted file mode 100644
index e9f56f7..0000000
--- a/display_list/effects/color_sources/dl_color_color_source.cc
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright 2013 The Flutter Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "flutter/display_list/effects/color_sources/dl_color_color_source.h"
-
-namespace flutter {
-
-bool DlColorColorSource::equals_(DlColorSource const& other) const {
-  FML_DCHECK(other.type() == DlColorSourceType::kColor);
-  auto that = static_cast<DlColorColorSource const*>(&other);
-  return color_ == that->color_;
-}
-
-}  // namespace flutter
diff --git a/display_list/effects/color_sources/dl_color_color_source.h b/display_list/effects/color_sources/dl_color_color_source.h
deleted file mode 100644
index c873448..0000000
--- a/display_list/effects/color_sources/dl_color_color_source.h
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2013 The Flutter Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef FLUTTER_DISPLAY_LIST_EFFECTS_COLOR_SOURCES_DL_COLOR_COLOR_SOURCE_H_
-#define FLUTTER_DISPLAY_LIST_EFFECTS_COLOR_SOURCES_DL_COLOR_COLOR_SOURCE_H_
-
-#include "flutter/display_list/effects/dl_color_source.h"
-
-namespace flutter {
-
-class DlColorColorSource final : public DlColorSource {
- public:
-  explicit DlColorColorSource(DlColor color) : color_(color) {}
-
-  bool isUIThreadSafe() const override { return true; }
-
-  std::shared_ptr<DlColorSource> shared() const override {
-    return std::make_shared<DlColorColorSource>(color_);
-  }
-
-  const DlColorColorSource* asColor() const override { return this; }
-
-  DlColorSourceType type() const override { return DlColorSourceType::kColor; }
-  size_t size() const override { return sizeof(*this); }
-
-  bool is_opaque() const override { return color_.getAlpha() == 255; }
-
-  DlColor color() const { return color_; }
-
- protected:
-  bool equals_(DlColorSource const& other) const override;
-
- private:
-  DlColor color_;
-
-  FML_DISALLOW_COPY_ASSIGN_AND_MOVE(DlColorColorSource);
-};
-
-}  // namespace flutter
-
-#endif  // FLUTTER_DISPLAY_LIST_EFFECTS_COLOR_SOURCES_DL_COLOR_COLOR_SOURCE_H_
diff --git a/display_list/effects/dl_color_source.cc b/display_list/effects/dl_color_source.cc
index 6009096..5a5fa8b 100644
--- a/display_list/effects/dl_color_source.cc
+++ b/display_list/effects/dl_color_source.cc
@@ -20,10 +20,6 @@
   ::operator delete(p);
 }
 
-std::shared_ptr<DlColorSource> DlColorSource::MakeColor(DlColor color) {
-  return std::make_shared<DlColorColorSource>(color);
-}
-
 std::shared_ptr<DlColorSource> DlColorSource::MakeImage(
     const sk_sp<const DlImage>& image,
     DlTileMode horizontal_tile_mode,
diff --git a/display_list/effects/dl_color_source.h b/display_list/effects/dl_color_source.h
index 8b25644..05fe3ca 100644
--- a/display_list/effects/dl_color_source.h
+++ b/display_list/effects/dl_color_source.h
@@ -15,7 +15,6 @@
 
 namespace flutter {
 
-class DlColorColorSource;
 class DlImageColorSource;
 class DlLinearGradientColorSource;
 class DlRadialGradientColorSource;
@@ -34,7 +33,6 @@
 // attributes, and the final blend with the pixels in the destination.
 
 enum class DlColorSourceType {
-  kColor,
   kImage,
   kLinearGradient,
   kRadialGradient,
@@ -45,8 +43,6 @@
 
 class DlColorSource : public DlAttribute<DlColorSource, DlColorSourceType> {
  public:
-  static std::shared_ptr<DlColorSource> MakeColor(DlColor color);
-
   static std::shared_ptr<DlColorSource> MakeImage(
       const sk_sp<const DlImage>& image,
       DlTileMode horizontal_tile_mode,
@@ -120,10 +116,6 @@
   ///
   virtual bool isGradient() const { return false; }
 
-  // Return a DlColorColorSource pointer to this object iff it is an Color
-  // type of ColorSource, otherwise return nullptr.
-  virtual const DlColorColorSource* asColor() const { return nullptr; }
-
   // Return a DlImageColorSource pointer to this object iff it is an Image
   // type of ColorSource, otherwise return nullptr.
   virtual const DlImageColorSource* asImage() const { return nullptr; }
diff --git a/display_list/effects/dl_color_source_unittests.cc b/display_list/effects/dl_color_source_unittests.cc
index 423c5c4..944de9c 100644
--- a/display_list/effects/dl_color_source_unittests.cc
+++ b/display_list/effects/dl_color_source_unittests.cc
@@ -88,53 +88,6 @@
     DlPoint(107, 118),
 };
 
-TEST(DisplayListColorSource, ColorConstructor) {
-  DlColorColorSource source(DlColor::kRed());
-}
-
-TEST(DisplayListColorSource, ColorShared) {
-  DlColorColorSource source(DlColor::kRed());
-  ASSERT_NE(source.shared().get(), &source);
-  ASSERT_EQ(*source.shared(), source);
-}
-
-TEST(DisplayListColorSource, ColorAsColor) {
-  DlColorColorSource source(DlColor::kRed());
-  ASSERT_NE(source.asColor(), nullptr);
-  ASSERT_EQ(source.asColor(), &source);
-
-  ASSERT_EQ(source.asImage(), nullptr);
-  ASSERT_EQ(source.asLinearGradient(), nullptr);
-  ASSERT_EQ(source.asRadialGradient(), nullptr);
-  ASSERT_EQ(source.asConicalGradient(), nullptr);
-  ASSERT_EQ(source.asSweepGradient(), nullptr);
-  ASSERT_EQ(source.asRuntimeEffect(), nullptr);
-}
-
-TEST(DisplayListColorSource, ColorContents) {
-  DlColorColorSource source(DlColor::kRed());
-  ASSERT_EQ(source.color(), DlColor::kRed());
-  ASSERT_EQ(source.is_opaque(), true);
-  for (int i = 0; i < 255; i++) {
-    SkColor alpha_color = SkColorSetA(SK_ColorRED, i);
-    auto const alpha_source = DlColorColorSource(DlColor(alpha_color));
-    ASSERT_EQ(alpha_source.color(), alpha_color);
-    ASSERT_EQ(alpha_source.is_opaque(), false);
-  }
-}
-
-TEST(DisplayListColorSource, ColorEquals) {
-  DlColorColorSource source1(DlColor::kRed());
-  DlColorColorSource source2(DlColor::kRed());
-  TestEquals(source1, source2);
-}
-
-TEST(DisplayListColorSource, ColorNotEquals) {
-  DlColorColorSource source1(DlColor::kRed());
-  DlColorColorSource source2(DlColor::kBlue());
-  TestNotEquals(source1, source2, "Color differs");
-}
-
 TEST(DisplayListColorSource, ImageConstructor) {
   DlImageColorSource source(kTestImage1, DlTileMode::kClamp, DlTileMode::kClamp,
                             DlImageSampling::kLinear, &kTestMatrix1);
@@ -153,11 +106,11 @@
   ASSERT_NE(source.asImage(), nullptr);
   ASSERT_EQ(source.asImage(), &source);
 
-  ASSERT_EQ(source.asColor(), nullptr);
   ASSERT_EQ(source.asLinearGradient(), nullptr);
   ASSERT_EQ(source.asRadialGradient(), nullptr);
   ASSERT_EQ(source.asConicalGradient(), nullptr);
   ASSERT_EQ(source.asSweepGradient(), nullptr);
+  ASSERT_EQ(source.asRuntimeEffect(), nullptr);
 }
 
 TEST(DisplayListColorSource, ImageContents) {
@@ -251,7 +204,6 @@
   ASSERT_NE(source->asLinearGradient(), nullptr);
   ASSERT_EQ(source->asLinearGradient(), source.get());
 
-  ASSERT_EQ(source->asColor(), nullptr);
   ASSERT_EQ(source->asImage(), nullptr);
   ASSERT_EQ(source->asRadialGradient(), nullptr);
   ASSERT_EQ(source->asConicalGradient(), nullptr);
@@ -370,7 +322,6 @@
   ASSERT_NE(source->asRadialGradient(), nullptr);
   ASSERT_EQ(source->asRadialGradient(), source.get());
 
-  ASSERT_EQ(source->asColor(), nullptr);
   ASSERT_EQ(source->asImage(), nullptr);
   ASSERT_EQ(source->asLinearGradient(), nullptr);
   ASSERT_EQ(source->asConicalGradient(), nullptr);
@@ -489,7 +440,6 @@
   ASSERT_NE(source->asConicalGradient(), nullptr);
   ASSERT_EQ(source->asConicalGradient(), source.get());
 
-  ASSERT_EQ(source->asColor(), nullptr);
   ASSERT_EQ(source->asImage(), nullptr);
   ASSERT_EQ(source->asLinearGradient(), nullptr);
   ASSERT_EQ(source->asRadialGradient(), nullptr);
@@ -624,7 +574,6 @@
   ASSERT_NE(source->asSweepGradient(), nullptr);
   ASSERT_EQ(source->asSweepGradient(), source.get());
 
-  ASSERT_EQ(source->asColor(), nullptr);
   ASSERT_EQ(source->asImage(), nullptr);
   ASSERT_EQ(source->asLinearGradient(), nullptr);
   ASSERT_EQ(source->asRadialGradient(), nullptr);
@@ -743,7 +692,6 @@
   ASSERT_NE(source2->asRuntimeEffect(), source1.get());
 
   ASSERT_EQ(source1->asImage(), nullptr);
-  ASSERT_EQ(source1->asColor(), nullptr);
   ASSERT_EQ(source1->asLinearGradient(), nullptr);
   ASSERT_EQ(source1->asRadialGradient(), nullptr);
   ASSERT_EQ(source1->asConicalGradient(), nullptr);
diff --git a/display_list/effects/dl_color_sources.h b/display_list/effects/dl_color_sources.h
index ce5d802..23e810a 100644
--- a/display_list/effects/dl_color_sources.h
+++ b/display_list/effects/dl_color_sources.h
@@ -5,7 +5,6 @@
 #ifndef FLUTTER_DISPLAY_LIST_EFFECTS_DL_COLOR_SOURCES_H_
 #define FLUTTER_DISPLAY_LIST_EFFECTS_DL_COLOR_SOURCES_H_
 
-#include "flutter/display_list/effects/color_sources/dl_color_color_source.h"
 #include "flutter/display_list/effects/color_sources/dl_conical_gradient_color_source.h"
 #include "flutter/display_list/effects/color_sources/dl_image_color_source.h"
 #include "flutter/display_list/effects/color_sources/dl_linear_gradient_color_source.h"
diff --git a/display_list/skia/dl_sk_conversions.cc b/display_list/skia/dl_sk_conversions.cc
index 67fc7b3..16b3455 100644
--- a/display_list/skia/dl_sk_conversions.cc
+++ b/display_list/skia/dl_sk_conversions.cc
@@ -83,11 +83,6 @@
     return sk_colors;
   };
   switch (source->type()) {
-    case DlColorSourceType::kColor: {
-      const DlColorColorSource* color_source = source->asColor();
-      FML_DCHECK(color_source != nullptr);
-      return SkShaders::Color(ToSk(color_source->color()));
-    }
     case DlColorSourceType::kImage: {
       const DlImageColorSource* image_source = source->asImage();
       FML_DCHECK(image_source != nullptr);
diff --git a/display_list/skia/dl_sk_paint_dispatcher_unittests.cc b/display_list/skia/dl_sk_paint_dispatcher_unittests.cc
index e515537..f0bd925 100644
--- a/display_list/skia/dl_sk_paint_dispatcher_unittests.cc
+++ b/display_list/skia/dl_sk_paint_dispatcher_unittests.cc
@@ -64,11 +64,6 @@
   EXPECT_FALSE(helper.paint(true).isDither());
   EXPECT_FALSE(helper.paint(false).isDither());
 
-  DlColorColorSource color_color_source(DlColor::kBlue());
-  helper.setColorSource(&color_color_source);
-  EXPECT_FALSE(helper.paint(true).isDither());
-  EXPECT_FALSE(helper.paint(false).isDither());
-
   helper.setColorSource(kTestSource1.get());
   EXPECT_FALSE(helper.paint(true).isDither());
   EXPECT_FALSE(helper.paint(false).isDither());
@@ -98,13 +93,6 @@
   EXPECT_FALSE(dispatcher.safe_paint(true)->isDither());
   // Calling safe_paint(false) returns a nullptr
 
-  DlColorColorSource color_color_source(DlColor::kBlue());
-  dispatcher.setColorSource(&color_color_source);
-  EXPECT_FALSE(dispatcher.paint(true).isDither());
-  EXPECT_FALSE(dispatcher.paint(false).isDither());
-  EXPECT_FALSE(dispatcher.safe_paint(true)->isDither());
-  // Calling safe_paint(false) returns a nullptr
-
   dispatcher.setColorSource(kTestSource1.get());
   EXPECT_FALSE(dispatcher.paint(true).isDither());
   EXPECT_FALSE(dispatcher.paint(false).isDither());
diff --git a/display_list/testing/dl_rendering_unittests.cc b/display_list/testing/dl_rendering_unittests.cc
index 399e51c..bf75244 100644
--- a/display_list/testing/dl_rendering_unittests.cc
+++ b/display_list/testing/dl_rendering_unittests.cc
@@ -863,7 +863,7 @@
   bool impeller_compatible(const DlPaint& paint) const {
     if (is_draw_text_blob()) {
       // Non-color text is rendered as paths
-      if (paint.getColorSourcePtr() && !paint.getColorSourcePtr()->asColor()) {
+      if (paint.getColorSourcePtr()) {
         return false;
       }
       // Non-filled text (stroke or stroke and fill) is rendered as paths
diff --git a/impeller/display_list/canvas.cc b/impeller/display_list/canvas.cc
index 7b26f02..4e5a4dc 100644
--- a/impeller/display_list/canvas.cc
+++ b/impeller/display_list/canvas.cc
@@ -54,9 +54,7 @@
   if (vertices->HasVertexColors()) {
     return false;
   }
-  if (vertices->HasTextureCoordinates() &&
-      (!paint.color_source ||
-       paint.color_source->type() == flutter::DlColorSourceType::kColor)) {
+  if (vertices->HasTextureCoordinates() && !paint.color_source) {
     return true;
   }
   return !vertices->HasTextureCoordinates();
@@ -314,8 +312,7 @@
     return false;
   }
 
-  if (paint.color_source &&
-      paint.color_source->type() != flutter::DlColorSourceType::kColor) {
+  if (paint.color_source) {
     return false;
   }
 
@@ -736,8 +733,7 @@
   // Override the blend mode with kDestination in order to match the behavior
   // of Skia's SK_LEGACY_IGNORE_DRAW_VERTICES_BLEND_WITH_NO_SHADER flag, which
   // is enabled when the Flutter engine builds Skia.
-  if (!paint.color_source ||
-      paint.color_source->type() == flutter::DlColorSourceType::kColor) {
+  if (!paint.color_source) {
     blend_mode = BlendMode::kDestination;
   }
 
diff --git a/impeller/display_list/dl_dispatcher.cc b/impeller/display_list/dl_dispatcher.cc
index b1ba5b7..3fb650d 100644
--- a/impeller/display_list/dl_dispatcher.cc
+++ b/impeller/display_list/dl_dispatcher.cc
@@ -222,11 +222,7 @@
 void DlDispatcherBase::setColorSource(const flutter::DlColorSource* source) {
   AUTO_DEPTH_WATCHER(0u);
 
-  if (!source || source->type() == flutter::DlColorSourceType::kColor) {
-    paint_.color_source = nullptr;
-  } else {
-    paint_.color_source = source;
-  }
+  paint_.color_source = source;
 }
 
 // |flutter::DlOpReceiver|
diff --git a/impeller/display_list/dl_unittests.cc b/impeller/display_list/dl_unittests.cc
index 7ff0fa8..832515a 100644
--- a/impeller/display_list/dl_unittests.cc
+++ b/impeller/display_list/dl_unittests.cc
@@ -1256,30 +1256,41 @@
   std::array<flutter::DlColor, 2> colors = {flutter::DlColor::kBlue(),
                                             flutter::DlColor::kGreen()};
   std::array<float, 2> stops = {0, 1};
+  auto texture = CreateTextureForFixture("airplane.jpg");
+  auto matrix = flutter::DlMatrix::MakeTranslation({-300, -110});
   std::array<std::shared_ptr<flutter::DlColorSource>, 2> color_sources = {
-      flutter::DlColorSource::MakeColor(flutter::DlColor::kWhite()),
+      flutter::DlColorSource::MakeImage(
+          DlImageImpeller::Make(texture), flutter::DlTileMode::kRepeat,
+          flutter::DlTileMode::kRepeat, flutter::DlImageSampling::kLinear,
+          &matrix),
       flutter::DlColorSource::MakeLinear(
           flutter::DlPoint(0, 0), flutter::DlPoint(100, 50), 2, colors.data(),
-          stops.data(), flutter::DlTileMode::kClamp)};
+          stops.data(), flutter::DlTileMode::kClamp),
+  };
 
-  int offset = 100;
+  builder.Save();
+  builder.Translate(0, 100);
   for (const auto& color_source : color_sources) {
     flutter::DlPaint paint;
     paint.setColorSource(color_source);
     paint.setMaskFilter(blur_filter);
 
+    builder.Save();
+    builder.Translate(100, 0);
     paint.setDrawStyle(flutter::DlDrawStyle::kFill);
-    builder.DrawRRect(
-        SkRRect::MakeRectXY(SkRect::MakeXYWH(100, offset, 100, 50), 30, 30),
-        paint);
+    builder.DrawRRect(SkRRect::MakeRectXY(SkRect::MakeWH(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);
+    builder.Translate(200, 0);
+    builder.DrawRRect(SkRRect::MakeRectXY(SkRect::MakeWH(100, 50), 30, 30),
+                      paint);
 
-    offset += 100;
+    builder.Restore();
+    builder.Translate(0, 100);
   }
+  builder.Restore();
 
   ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
 }
diff --git a/impeller/display_list/paint.cc b/impeller/display_list/paint.cc
index 6bbdc1a..0305a4a 100644
--- a/impeller/display_list/paint.cc
+++ b/impeller/display_list/paint.cc
@@ -239,11 +239,6 @@
       contents->SetTextureInputs(std::move(texture_inputs));
       return contents;
     }
-    case flutter::DlColorSourceType::kColor: {
-      auto contents = std::make_shared<SolidColorContents>();
-      contents->SetColor(color);
-      return contents;
-    }
   }
   FML_UNREACHABLE();
 }
diff --git a/shell/common/dl_op_spy.cc b/shell/common/dl_op_spy.cc
index 5c109be..f9671cc 100644
--- a/shell/common/dl_op_spy.cc
+++ b/shell/common/dl_op_spy.cc
@@ -4,8 +4,6 @@
 
 #include "flutter/shell/common/dl_op_spy.h"
 
-#include "flutter/display_list/effects/color_sources/dl_color_color_source.h"
-
 namespace flutter {
 
 bool DlOpSpy::did_draw() {
@@ -13,6 +11,7 @@
 }
 
 void DlOpSpy::setColor(DlColor color) {
+  color_ = color;
   if (color.isTransparent()) {
     will_draw_ = false;
   } else {
@@ -21,11 +20,8 @@
 }
 void DlOpSpy::setColorSource(const DlColorSource* source) {
   if (!source) {
-    return;
-  }
-  const DlColorColorSource* color_source = source->asColor();
-  if (color_source && color_source->color().isTransparent()) {
-    will_draw_ = false;
+    // Restore settings based on previously set color
+    setColor(color_);
     return;
   }
   will_draw_ = true;
diff --git a/shell/common/dl_op_spy.h b/shell/common/dl_op_spy.h
index 3c2c63d..27fe395 100644
--- a/shell/common/dl_op_spy.h
+++ b/shell/common/dl_op_spy.h
@@ -106,6 +106,9 @@
                   bool transparent_occluder,
                   DlScalar dpr) override;
 
+  // Most recently set color, used when color_source goes to null
+  DlColor color_;
+
   // Indicates if the attributes are set to values that will modify the
   // destination. For now, the test only checks if there is a non-transparent
   // color set.
diff --git a/shell/common/dl_op_spy_unittests.cc b/shell/common/dl_op_spy_unittests.cc
index b04c6d6..8dc4873 100644
--- a/shell/common/dl_op_spy_unittests.cc
+++ b/shell/common/dl_op_spy_unittests.cc
@@ -84,29 +84,26 @@
     dl->Dispatch(dl_op_spy);
     ASSERT_DID_DRAW(dl_op_spy, dl);
   }
-  {  // Set transparent color.
-    DisplayListBuilder builder;
-    DlPaint paint;
-    auto color = DlColor::kTransparent();
-    DlColorColorSource color_source_transparent(color);
-    paint.setColorSource(color_source_transparent.shared());
-    builder.DrawRect(SkRect::MakeWH(5, 5), paint);
-    sk_sp<DisplayList> dl = builder.Build();
+  {  // setColorSource(null) restores previous color visibility
     DlOpSpy dl_op_spy;
-    dl->Dispatch(dl_op_spy);
-    ASSERT_NO_DRAW(dl_op_spy, dl);
-  }
-  {  // Set black color.
-    DisplayListBuilder builder;
-    DlPaint paint;
-    auto color = DlColor::kBlack();
-    DlColorColorSource color_source_transparent(color);
-    paint.setColorSource(color_source_transparent.shared());
-    builder.DrawRect(SkRect::MakeWH(5, 5), paint);
-    sk_sp<DisplayList> dl = builder.Build();
-    DlOpSpy dl_op_spy;
-    dl->Dispatch(dl_op_spy);
-    ASSERT_DID_DRAW(dl_op_spy, dl);
+    DlOpReceiver* receiver = &dl_op_spy;
+    receiver->setColor(DlColor::kTransparent());
+    receiver->drawRect(DlRect::MakeWH(5, 5));
+    ASSERT_FALSE(dl_op_spy.did_draw());
+    DlColor colors[2] = {
+        DlColor::kGreen(),
+        DlColor::kBlue(),
+    };
+    float stops[2] = {
+        0.0f,
+        1.0f,
+    };
+    auto color_source = DlColorSource::MakeLinear({0, 0}, {10, 10}, 2, colors,
+                                                  stops, DlTileMode::kClamp);
+    receiver->setColorSource(color_source.get());
+    receiver->setColorSource(nullptr);
+    receiver->drawRect(DlRect::MakeWH(5, 5));
+    ASSERT_FALSE(dl_op_spy.did_draw());
   }
 }
 
diff --git a/testing/display_list_testing.cc b/testing/display_list_testing.cc
index b969daa..b3c6fe6 100644
--- a/testing/display_list_testing.cc
+++ b/testing/display_list_testing.cc
@@ -444,12 +444,6 @@
   }
   startl() << "setColorSource(";
   switch (source->type()) {
-    case DlColorSourceType::kColor: {
-      const DlColorColorSource* color_src = source->asColor();
-      FML_DCHECK(color_src);
-      os_ << "DlColorColorSource(" << color_src->color() << ")";
-      break;
-    }
     case DlColorSourceType::kImage: {
       const DlImageColorSource* image_src = source->asImage();
       FML_DCHECK(image_src);
diff --git a/testing/display_list_testing.h b/testing/display_list_testing.h
index 9a707bb..17cf01d 100644
--- a/testing/display_list_testing.h
+++ b/testing/display_list_testing.h
@@ -263,7 +263,6 @@
         case DlColorSourceType::kRuntimeEffect:
           RecordByType(DisplayListOpType::kSetRuntimeEffectColorSource);
           break;
-        case DlColorSourceType::kColor:
         case DlColorSourceType::kLinearGradient:
         case DlColorSourceType::kRadialGradient:
         case DlColorSourceType::kConicalGradient:
diff --git a/third_party/txt/src/skia/paragraph_skia.cc b/third_party/txt/src/skia/paragraph_skia.cc
index b3521dd..38065e9 100644
--- a/third_party/txt/src/skia/paragraph_skia.cc
+++ b/third_party/txt/src/skia/paragraph_skia.cc
@@ -191,7 +191,7 @@
     // rendering will be faster as it avoids software rasterization. A stroke
     // width of four was chosen by eyeballing the point at which the path
     // text looks good enough, with some room for error.
-    return (paint.getColorSource() && !paint.getColorSource()->asColor()) ||
+    return paint.getColorSource() ||
            (paint.getDrawStyle() == DlDrawStyle::kStroke &&
             paint.getStrokeWidth() > 4);
   }