[DisplayList] Delete (publicly) unused DlColorColorSource (flutter/engine#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.
This commit is contained in:
Jim Graham 2024-11-26 16:13:22 -08:00 committed by GitHub
parent fb62aa5d47
commit 0c245ce56b
23 changed files with 89 additions and 236 deletions

View File

@ -42540,8 +42540,6 @@ ORIGIN: ../../../flutter/display_list/effects/color_filters/dl_matrix_color_filt
ORIGIN: ../../../flutter/display_list/effects/color_filters/dl_matrix_color_filter.h + ../../../flutter/LICENSE 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.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_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.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_conical_gradient_color_source.h + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/display_list/effects/color_sources/dl_gradient_color_source_base.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
FILE: ../../../flutter/display_list/effects/color_filters/dl_matrix_color_filter.h 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.cc
FILE: ../../../flutter/display_list/effects/color_filters/dl_srgb_to_linear_gamma_color_filter.h 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.cc
FILE: ../../../flutter/display_list/effects/color_sources/dl_conical_gradient_color_source.h 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 FILE: ../../../flutter/display_list/effects/color_sources/dl_gradient_color_source_base.h

View File

@ -55,8 +55,6 @@ source_set("display_list") {
"effects/color_filters/dl_matrix_color_filter.h", "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.cc",
"effects/color_filters/dl_srgb_to_linear_gamma_color_filter.h", "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.cc",
"effects/color_sources/dl_conical_gradient_color_source.h", "effects/color_sources/dl_conical_gradient_color_source.h",
"effects/color_sources/dl_image_color_source.cc", "effects/color_sources/dl_image_color_source.cc",

View File

@ -201,12 +201,6 @@ void DisplayListBuilder::onSetColorSource(const DlColorSource* source) {
current_.setColorSource(source->shared()); current_.setColorSource(source->shared());
is_ui_thread_safe_ = is_ui_thread_safe_ && source->isUIThreadSafe(); is_ui_thread_safe_ = is_ui_thread_safe_ && source->isUIThreadSafe();
switch (source->type()) { switch (source->type()) {
case DlColorSourceType::kColor: {
const DlColorColorSource* color_source = source->asColor();
current_.setColorSource(nullptr);
setColor(color_source->color());
break;
}
case DlColorSourceType::kImage: { case DlColorSourceType::kImage: {
const DlImageColorSource* image_source = source->asImage(); const DlImageColorSource* image_source = source->asImage();
FML_DCHECK(image_source); FML_DCHECK(image_source);
@ -1953,11 +1947,9 @@ DlColor DisplayListBuilder::GetEffectiveColor(const DlPaint& paint,
if (flags.applies_color()) { if (flags.applies_color()) {
const DlColorSource* source = paint.getColorSourcePtr(); const DlColorSource* source = paint.getColorSourcePtr();
if (source) { if (source) {
if (source->asColor()) { // Suspecting that we need to modulate the ColorSource color by the
color = source->asColor()->color(); // color property, see https://github.com/flutter/flutter/issues/159507
} else { color = source->is_opaque() ? DlColor::kBlack() : kAnyColor;
color = source->is_opaque() ? DlColor::kBlack() : kAnyColor;
}
} else { } else {
color = paint.getColor(); color = paint.getColor();
} }

View File

@ -56,7 +56,16 @@ TEST(DisplayListPaint, ConstructorDefaults) {
EXPECT_NE(paint, DlPaint().setStrokeWidth(6)); EXPECT_NE(paint, DlPaint().setStrokeWidth(6));
EXPECT_NE(paint, DlPaint().setStrokeMiter(7)); 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)); EXPECT_NE(paint, DlPaint().setColorSource(color_source));
auto color_filter = auto color_filter =
@ -95,19 +104,28 @@ TEST(DisplayListPaint, NullSharedPointerSetGet) {
} }
TEST(DisplayListPaint, ChainingConstructor) { TEST(DisplayListPaint, ChainingConstructor) {
DlColor colors[2] = {
DlColor::kGreen(),
DlColor::kBlue(),
};
float stops[2] = {
0.0f,
1.0f,
};
DlPaint paint = DlPaint paint =
DlPaint() // DlPaint() //
.setAntiAlias(true) // .setAntiAlias(true) //
.setInvertColors(true) // .setInvertColors(true) //
.setColor(DlColor::kGreen()) // .setColor(DlColor::kGreen()) //
.setAlpha(0x7F) // .setAlpha(0x7F) //
.setBlendMode(DlBlendMode::kLuminosity) // .setBlendMode(DlBlendMode::kLuminosity) //
.setDrawStyle(DlDrawStyle::kStrokeAndFill) // .setDrawStyle(DlDrawStyle::kStrokeAndFill) //
.setStrokeCap(DlStrokeCap::kSquare) // .setStrokeCap(DlStrokeCap::kSquare) //
.setStrokeJoin(DlStrokeJoin::kBevel) // .setStrokeJoin(DlStrokeJoin::kBevel) //
.setStrokeWidth(42) // .setStrokeWidth(42) //
.setStrokeMiter(1.5) // .setStrokeMiter(1.5) //
.setColorSource(DlColorSource::MakeColor(DlColor::kMagenta())) // .setColorSource(DlColorSource::MakeLinear( //
{0, 0}, {10, 10}, 2, colors, stops, DlTileMode::kClamp)) //
.setColorFilter( .setColorFilter(
DlColorFilter::MakeBlend(DlColor::kYellow(), DlBlendMode::kDstIn)) DlColorFilter::MakeBlend(DlColor::kYellow(), DlBlendMode::kDstIn))
.setImageFilter(DlImageFilter::MakeBlur(1.3, 4.7, DlTileMode::kClamp)) .setImageFilter(DlImageFilter::MakeBlur(1.3, 4.7, DlTileMode::kClamp))
@ -123,7 +141,8 @@ TEST(DisplayListPaint, ChainingConstructor) {
EXPECT_EQ(paint.getStrokeWidth(), 42); EXPECT_EQ(paint.getStrokeWidth(), 42);
EXPECT_EQ(paint.getStrokeMiter(), 1.5); EXPECT_EQ(paint.getStrokeMiter(), 1.5);
EXPECT_TRUE(Equals(paint.getColorSource(), EXPECT_TRUE(Equals(paint.getColorSource(),
DlColorSource::MakeColor(DlColor::kMagenta()))); DlColorSource::MakeLinear({0, 0}, {10, 10}, 2, colors,
stops, DlTileMode::kClamp)));
EXPECT_TRUE(Equals( EXPECT_TRUE(Equals(
paint.getColorFilter(), paint.getColorFilter(),
DlColorFilter::MakeBlend(DlColor::kYellow(), DlBlendMode::kDstIn))); DlColorFilter::MakeBlend(DlColor::kYellow(), DlBlendMode::kDstIn)));

View File

@ -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

View File

@ -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_

View File

@ -20,10 +20,6 @@ static void DlGradientDeleter(void* p) {
::operator delete(p); ::operator delete(p);
} }
std::shared_ptr<DlColorSource> DlColorSource::MakeColor(DlColor color) {
return std::make_shared<DlColorColorSource>(color);
}
std::shared_ptr<DlColorSource> DlColorSource::MakeImage( std::shared_ptr<DlColorSource> DlColorSource::MakeImage(
const sk_sp<const DlImage>& image, const sk_sp<const DlImage>& image,
DlTileMode horizontal_tile_mode, DlTileMode horizontal_tile_mode,

View File

@ -15,7 +15,6 @@
namespace flutter { namespace flutter {
class DlColorColorSource;
class DlImageColorSource; class DlImageColorSource;
class DlLinearGradientColorSource; class DlLinearGradientColorSource;
class DlRadialGradientColorSource; class DlRadialGradientColorSource;
@ -34,7 +33,6 @@ class DlRuntimeEffectColorSource;
// attributes, and the final blend with the pixels in the destination. // attributes, and the final blend with the pixels in the destination.
enum class DlColorSourceType { enum class DlColorSourceType {
kColor,
kImage, kImage,
kLinearGradient, kLinearGradient,
kRadialGradient, kRadialGradient,
@ -45,8 +43,6 @@ enum class DlColorSourceType {
class DlColorSource : public DlAttribute<DlColorSource, DlColorSourceType> { class DlColorSource : public DlAttribute<DlColorSource, DlColorSourceType> {
public: public:
static std::shared_ptr<DlColorSource> MakeColor(DlColor color);
static std::shared_ptr<DlColorSource> MakeImage( static std::shared_ptr<DlColorSource> MakeImage(
const sk_sp<const DlImage>& image, const sk_sp<const DlImage>& image,
DlTileMode horizontal_tile_mode, DlTileMode horizontal_tile_mode,
@ -120,10 +116,6 @@ class DlColorSource : public DlAttribute<DlColorSource, DlColorSourceType> {
/// ///
virtual bool isGradient() const { return false; } 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 // Return a DlImageColorSource pointer to this object iff it is an Image
// type of ColorSource, otherwise return nullptr. // type of ColorSource, otherwise return nullptr.
virtual const DlImageColorSource* asImage() const { return nullptr; } virtual const DlImageColorSource* asImage() const { return nullptr; }

View File

@ -88,53 +88,6 @@ static constexpr DlPoint kTestPoints2[2] = {
DlPoint(107, 118), 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) { TEST(DisplayListColorSource, ImageConstructor) {
DlImageColorSource source(kTestImage1, DlTileMode::kClamp, DlTileMode::kClamp, DlImageColorSource source(kTestImage1, DlTileMode::kClamp, DlTileMode::kClamp,
DlImageSampling::kLinear, &kTestMatrix1); DlImageSampling::kLinear, &kTestMatrix1);
@ -153,11 +106,11 @@ TEST(DisplayListColorSource, ImageAsImage) {
ASSERT_NE(source.asImage(), nullptr); ASSERT_NE(source.asImage(), nullptr);
ASSERT_EQ(source.asImage(), &source); ASSERT_EQ(source.asImage(), &source);
ASSERT_EQ(source.asColor(), nullptr);
ASSERT_EQ(source.asLinearGradient(), nullptr); ASSERT_EQ(source.asLinearGradient(), nullptr);
ASSERT_EQ(source.asRadialGradient(), nullptr); ASSERT_EQ(source.asRadialGradient(), nullptr);
ASSERT_EQ(source.asConicalGradient(), nullptr); ASSERT_EQ(source.asConicalGradient(), nullptr);
ASSERT_EQ(source.asSweepGradient(), nullptr); ASSERT_EQ(source.asSweepGradient(), nullptr);
ASSERT_EQ(source.asRuntimeEffect(), nullptr);
} }
TEST(DisplayListColorSource, ImageContents) { TEST(DisplayListColorSource, ImageContents) {
@ -251,7 +204,6 @@ TEST(DisplayListColorSource, LinearGradientAsLinear) {
ASSERT_NE(source->asLinearGradient(), nullptr); ASSERT_NE(source->asLinearGradient(), nullptr);
ASSERT_EQ(source->asLinearGradient(), source.get()); ASSERT_EQ(source->asLinearGradient(), source.get());
ASSERT_EQ(source->asColor(), nullptr);
ASSERT_EQ(source->asImage(), nullptr); ASSERT_EQ(source->asImage(), nullptr);
ASSERT_EQ(source->asRadialGradient(), nullptr); ASSERT_EQ(source->asRadialGradient(), nullptr);
ASSERT_EQ(source->asConicalGradient(), nullptr); ASSERT_EQ(source->asConicalGradient(), nullptr);
@ -370,7 +322,6 @@ TEST(DisplayListColorSource, RadialGradientAsRadial) {
ASSERT_NE(source->asRadialGradient(), nullptr); ASSERT_NE(source->asRadialGradient(), nullptr);
ASSERT_EQ(source->asRadialGradient(), source.get()); ASSERT_EQ(source->asRadialGradient(), source.get());
ASSERT_EQ(source->asColor(), nullptr);
ASSERT_EQ(source->asImage(), nullptr); ASSERT_EQ(source->asImage(), nullptr);
ASSERT_EQ(source->asLinearGradient(), nullptr); ASSERT_EQ(source->asLinearGradient(), nullptr);
ASSERT_EQ(source->asConicalGradient(), nullptr); ASSERT_EQ(source->asConicalGradient(), nullptr);
@ -489,7 +440,6 @@ TEST(DisplayListColorSource, ConicalGradientAsConical) {
ASSERT_NE(source->asConicalGradient(), nullptr); ASSERT_NE(source->asConicalGradient(), nullptr);
ASSERT_EQ(source->asConicalGradient(), source.get()); ASSERT_EQ(source->asConicalGradient(), source.get());
ASSERT_EQ(source->asColor(), nullptr);
ASSERT_EQ(source->asImage(), nullptr); ASSERT_EQ(source->asImage(), nullptr);
ASSERT_EQ(source->asLinearGradient(), nullptr); ASSERT_EQ(source->asLinearGradient(), nullptr);
ASSERT_EQ(source->asRadialGradient(), nullptr); ASSERT_EQ(source->asRadialGradient(), nullptr);
@ -624,7 +574,6 @@ TEST(DisplayListColorSource, SweepGradientAsSweep) {
ASSERT_NE(source->asSweepGradient(), nullptr); ASSERT_NE(source->asSweepGradient(), nullptr);
ASSERT_EQ(source->asSweepGradient(), source.get()); ASSERT_EQ(source->asSweepGradient(), source.get());
ASSERT_EQ(source->asColor(), nullptr);
ASSERT_EQ(source->asImage(), nullptr); ASSERT_EQ(source->asImage(), nullptr);
ASSERT_EQ(source->asLinearGradient(), nullptr); ASSERT_EQ(source->asLinearGradient(), nullptr);
ASSERT_EQ(source->asRadialGradient(), nullptr); ASSERT_EQ(source->asRadialGradient(), nullptr);
@ -743,7 +692,6 @@ TEST(DisplayListColorSource, RuntimeEffect) {
ASSERT_NE(source2->asRuntimeEffect(), source1.get()); ASSERT_NE(source2->asRuntimeEffect(), source1.get());
ASSERT_EQ(source1->asImage(), nullptr); ASSERT_EQ(source1->asImage(), nullptr);
ASSERT_EQ(source1->asColor(), nullptr);
ASSERT_EQ(source1->asLinearGradient(), nullptr); ASSERT_EQ(source1->asLinearGradient(), nullptr);
ASSERT_EQ(source1->asRadialGradient(), nullptr); ASSERT_EQ(source1->asRadialGradient(), nullptr);
ASSERT_EQ(source1->asConicalGradient(), nullptr); ASSERT_EQ(source1->asConicalGradient(), nullptr);

View File

@ -5,7 +5,6 @@
#ifndef FLUTTER_DISPLAY_LIST_EFFECTS_DL_COLOR_SOURCES_H_ #ifndef FLUTTER_DISPLAY_LIST_EFFECTS_DL_COLOR_SOURCES_H_
#define 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_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_image_color_source.h"
#include "flutter/display_list/effects/color_sources/dl_linear_gradient_color_source.h" #include "flutter/display_list/effects/color_sources/dl_linear_gradient_color_source.h"

View File

@ -83,11 +83,6 @@ sk_sp<SkShader> ToSk(const DlColorSource* source) {
return sk_colors; return sk_colors;
}; };
switch (source->type()) { 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: { case DlColorSourceType::kImage: {
const DlImageColorSource* image_source = source->asImage(); const DlImageColorSource* image_source = source->asImage();
FML_DCHECK(image_source != nullptr); FML_DCHECK(image_source != nullptr);

View File

@ -64,11 +64,6 @@ TEST(DisplayListUtils, SetColorSourceDoesNotDitherIfNotGradient) {
EXPECT_FALSE(helper.paint(true).isDither()); EXPECT_FALSE(helper.paint(true).isDither());
EXPECT_FALSE(helper.paint(false).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()); helper.setColorSource(kTestSource1.get());
EXPECT_FALSE(helper.paint(true).isDither()); EXPECT_FALSE(helper.paint(true).isDither());
EXPECT_FALSE(helper.paint(false).isDither()); EXPECT_FALSE(helper.paint(false).isDither());
@ -98,13 +93,6 @@ TEST(DisplayListUtils, SkDispatcherSetColorSourceDoesNotDitherIfNotGradient) {
EXPECT_FALSE(dispatcher.safe_paint(true)->isDither()); EXPECT_FALSE(dispatcher.safe_paint(true)->isDither());
// Calling safe_paint(false) returns a nullptr // 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()); dispatcher.setColorSource(kTestSource1.get());
EXPECT_FALSE(dispatcher.paint(true).isDither()); EXPECT_FALSE(dispatcher.paint(true).isDither());
EXPECT_FALSE(dispatcher.paint(false).isDither()); EXPECT_FALSE(dispatcher.paint(false).isDither());

View File

@ -863,7 +863,7 @@ class TestParameters {
bool impeller_compatible(const DlPaint& paint) const { bool impeller_compatible(const DlPaint& paint) const {
if (is_draw_text_blob()) { if (is_draw_text_blob()) {
// Non-color text is rendered as paths // Non-color text is rendered as paths
if (paint.getColorSourcePtr() && !paint.getColorSourcePtr()->asColor()) { if (paint.getColorSourcePtr()) {
return false; return false;
} }
// Non-filled text (stroke or stroke and fill) is rendered as paths // Non-filled text (stroke or stroke and fill) is rendered as paths

View File

@ -54,9 +54,7 @@ static bool UseColorSourceContents(
if (vertices->HasVertexColors()) { if (vertices->HasVertexColors()) {
return false; return false;
} }
if (vertices->HasTextureCoordinates() && if (vertices->HasTextureCoordinates() && !paint.color_source) {
(!paint.color_source ||
paint.color_source->type() == flutter::DlColorSourceType::kColor)) {
return true; return true;
} }
return !vertices->HasTextureCoordinates(); return !vertices->HasTextureCoordinates();
@ -314,8 +312,7 @@ bool Canvas::AttemptDrawBlurredRRect(const Rect& rect,
return false; return false;
} }
if (paint.color_source && if (paint.color_source) {
paint.color_source->type() != flutter::DlColorSourceType::kColor) {
return false; return false;
} }
@ -736,8 +733,7 @@ void Canvas::DrawVertices(const std::shared_ptr<VerticesGeometry>& vertices,
// Override the blend mode with kDestination in order to match the behavior // 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 // of Skia's SK_LEGACY_IGNORE_DRAW_VERTICES_BLEND_WITH_NO_SHADER flag, which
// is enabled when the Flutter engine builds Skia. // is enabled when the Flutter engine builds Skia.
if (!paint.color_source || if (!paint.color_source) {
paint.color_source->type() == flutter::DlColorSourceType::kColor) {
blend_mode = BlendMode::kDestination; blend_mode = BlendMode::kDestination;
} }

View File

@ -222,11 +222,7 @@ void DlDispatcherBase::setStrokeJoin(flutter::DlStrokeJoin join) {
void DlDispatcherBase::setColorSource(const flutter::DlColorSource* source) { void DlDispatcherBase::setColorSource(const flutter::DlColorSource* source) {
AUTO_DEPTH_WATCHER(0u); AUTO_DEPTH_WATCHER(0u);
if (!source || source->type() == flutter::DlColorSourceType::kColor) { paint_.color_source = source;
paint_.color_source = nullptr;
} else {
paint_.color_source = source;
}
} }
// |flutter::DlOpReceiver| // |flutter::DlOpReceiver|

View File

@ -1256,30 +1256,41 @@ TEST_P(DisplayListTest, MaskBlursApplyCorrectlyToColorSources) {
std::array<flutter::DlColor, 2> colors = {flutter::DlColor::kBlue(), std::array<flutter::DlColor, 2> colors = {flutter::DlColor::kBlue(),
flutter::DlColor::kGreen()}; flutter::DlColor::kGreen()};
std::array<float, 2> stops = {0, 1}; 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 = { 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::DlColorSource::MakeLinear(
flutter::DlPoint(0, 0), flutter::DlPoint(100, 50), 2, colors.data(), 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) { for (const auto& color_source : color_sources) {
flutter::DlPaint paint; flutter::DlPaint paint;
paint.setColorSource(color_source); paint.setColorSource(color_source);
paint.setMaskFilter(blur_filter); paint.setMaskFilter(blur_filter);
builder.Save();
builder.Translate(100, 0);
paint.setDrawStyle(flutter::DlDrawStyle::kFill); paint.setDrawStyle(flutter::DlDrawStyle::kFill);
builder.DrawRRect( builder.DrawRRect(SkRRect::MakeRectXY(SkRect::MakeWH(100, 50), 30, 30),
SkRRect::MakeRectXY(SkRect::MakeXYWH(100, offset, 100, 50), 30, 30), paint);
paint);
paint.setDrawStyle(flutter::DlDrawStyle::kStroke); paint.setDrawStyle(flutter::DlDrawStyle::kStroke);
paint.setStrokeWidth(10); paint.setStrokeWidth(10);
builder.DrawRRect( builder.Translate(200, 0);
SkRRect::MakeRectXY(SkRect::MakeXYWH(300, offset, 100, 50), 30, 30), builder.DrawRRect(SkRRect::MakeRectXY(SkRect::MakeWH(100, 50), 30, 30),
paint); paint);
offset += 100; builder.Restore();
builder.Translate(0, 100);
} }
builder.Restore();
ASSERT_TRUE(OpenPlaygroundHere(builder.Build())); ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
} }

View File

@ -239,11 +239,6 @@ std::shared_ptr<ColorSourceContents> Paint::CreateContents() const {
contents->SetTextureInputs(std::move(texture_inputs)); contents->SetTextureInputs(std::move(texture_inputs));
return contents; return contents;
} }
case flutter::DlColorSourceType::kColor: {
auto contents = std::make_shared<SolidColorContents>();
contents->SetColor(color);
return contents;
}
} }
FML_UNREACHABLE(); FML_UNREACHABLE();
} }

View File

@ -4,8 +4,6 @@
#include "flutter/shell/common/dl_op_spy.h" #include "flutter/shell/common/dl_op_spy.h"
#include "flutter/display_list/effects/color_sources/dl_color_color_source.h"
namespace flutter { namespace flutter {
bool DlOpSpy::did_draw() { bool DlOpSpy::did_draw() {
@ -13,6 +11,7 @@ bool DlOpSpy::did_draw() {
} }
void DlOpSpy::setColor(DlColor color) { void DlOpSpy::setColor(DlColor color) {
color_ = color;
if (color.isTransparent()) { if (color.isTransparent()) {
will_draw_ = false; will_draw_ = false;
} else { } else {
@ -21,11 +20,8 @@ void DlOpSpy::setColor(DlColor color) {
} }
void DlOpSpy::setColorSource(const DlColorSource* source) { void DlOpSpy::setColorSource(const DlColorSource* source) {
if (!source) { if (!source) {
return; // Restore settings based on previously set color
} setColor(color_);
const DlColorColorSource* color_source = source->asColor();
if (color_source && color_source->color().isTransparent()) {
will_draw_ = false;
return; return;
} }
will_draw_ = true; will_draw_ = true;

View File

@ -106,6 +106,9 @@ class DlOpSpy final : public virtual DlOpReceiver,
bool transparent_occluder, bool transparent_occluder,
DlScalar dpr) override; 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 // 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 // destination. For now, the test only checks if there is a non-transparent
// color set. // color set.

View File

@ -84,29 +84,26 @@ TEST(DlOpSpy, SetColorSource) {
dl->Dispatch(dl_op_spy); dl->Dispatch(dl_op_spy);
ASSERT_DID_DRAW(dl_op_spy, dl); ASSERT_DID_DRAW(dl_op_spy, dl);
} }
{ // Set transparent color. { // setColorSource(null) restores previous color visibility
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();
DlOpSpy dl_op_spy; DlOpSpy dl_op_spy;
dl->Dispatch(dl_op_spy); DlOpReceiver* receiver = &dl_op_spy;
ASSERT_NO_DRAW(dl_op_spy, dl); receiver->setColor(DlColor::kTransparent());
} receiver->drawRect(DlRect::MakeWH(5, 5));
{ // Set black color. ASSERT_FALSE(dl_op_spy.did_draw());
DisplayListBuilder builder; DlColor colors[2] = {
DlPaint paint; DlColor::kGreen(),
auto color = DlColor::kBlack(); DlColor::kBlue(),
DlColorColorSource color_source_transparent(color); };
paint.setColorSource(color_source_transparent.shared()); float stops[2] = {
builder.DrawRect(SkRect::MakeWH(5, 5), paint); 0.0f,
sk_sp<DisplayList> dl = builder.Build(); 1.0f,
DlOpSpy dl_op_spy; };
dl->Dispatch(dl_op_spy); auto color_source = DlColorSource::MakeLinear({0, 0}, {10, 10}, 2, colors,
ASSERT_DID_DRAW(dl_op_spy, dl); stops, DlTileMode::kClamp);
receiver->setColorSource(color_source.get());
receiver->setColorSource(nullptr);
receiver->drawRect(DlRect::MakeWH(5, 5));
ASSERT_FALSE(dl_op_spy.did_draw());
} }
} }

View File

@ -444,12 +444,6 @@ void DisplayListStreamDispatcher::setColorSource(const DlColorSource* source) {
} }
startl() << "setColorSource("; startl() << "setColorSource(";
switch (source->type()) { 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: { case DlColorSourceType::kImage: {
const DlImageColorSource* image_src = source->asImage(); const DlImageColorSource* image_src = source->asImage();
FML_DCHECK(image_src); FML_DCHECK(image_src);

View File

@ -263,7 +263,6 @@ class DisplayListGeneralReceiver : public DlOpReceiver {
case DlColorSourceType::kRuntimeEffect: case DlColorSourceType::kRuntimeEffect:
RecordByType(DisplayListOpType::kSetRuntimeEffectColorSource); RecordByType(DisplayListOpType::kSetRuntimeEffectColorSource);
break; break;
case DlColorSourceType::kColor:
case DlColorSourceType::kLinearGradient: case DlColorSourceType::kLinearGradient:
case DlColorSourceType::kRadialGradient: case DlColorSourceType::kRadialGradient:
case DlColorSourceType::kConicalGradient: case DlColorSourceType::kConicalGradient:

View File

@ -191,7 +191,7 @@ class DisplayListParagraphPainter : public skt::ParagraphPainter {
// rendering will be faster as it avoids software rasterization. A stroke // rendering will be faster as it avoids software rasterization. A stroke
// width of four was chosen by eyeballing the point at which the path // width of four was chosen by eyeballing the point at which the path
// text looks good enough, with some room for error. // text looks good enough, with some room for error.
return (paint.getColorSource() && !paint.getColorSource()->asColor()) || return paint.getColorSource() ||
(paint.getDrawStyle() == DlDrawStyle::kStroke && (paint.getDrawStyle() == DlDrawStyle::kStroke &&
paint.getStrokeWidth() > 4); paint.getStrokeWidth() > 4);
} }