Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions ci/licenses_golden/licenses_flutter
Original file line number Diff line number Diff line change
Expand Up @@ -42532,6 +42532,14 @@ ORIGIN: ../../../flutter/display_list/dl_storage.h + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/display_list/dl_tile_mode.h + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/display_list/dl_vertices.cc + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/display_list/dl_vertices.h + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/display_list/effects/color_filters/dl_blend_color_filter.cc + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/display_list/effects/color_filters/dl_blend_color_filter.h + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/display_list/effects/color_filters/dl_linear_to_srgb_gamma_color_filter.cc + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/display_list/effects/color_filters/dl_linear_to_srgb_gamma_color_filter.h + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/display_list/effects/color_filters/dl_matrix_color_filter.cc + ../../../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.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
Expand All @@ -42550,6 +42558,7 @@ ORIGIN: ../../../flutter/display_list/effects/color_sources/dl_sweep_gradient_co
ORIGIN: ../../../flutter/display_list/effects/color_sources/dl_sweep_gradient_color_source.h + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/display_list/effects/dl_color_filter.cc + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/display_list/effects/dl_color_filter.h + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/display_list/effects/dl_color_filters.h + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/display_list/effects/dl_color_source.cc + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/display_list/effects/dl_color_source.h + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/display_list/effects/dl_color_sources.h + ../../../flutter/LICENSE
Expand Down Expand Up @@ -45450,6 +45459,14 @@ FILE: ../../../flutter/display_list/dl_storage.h
FILE: ../../../flutter/display_list/dl_tile_mode.h
FILE: ../../../flutter/display_list/dl_vertices.cc
FILE: ../../../flutter/display_list/dl_vertices.h
FILE: ../../../flutter/display_list/effects/color_filters/dl_blend_color_filter.cc
FILE: ../../../flutter/display_list/effects/color_filters/dl_blend_color_filter.h
FILE: ../../../flutter/display_list/effects/color_filters/dl_linear_to_srgb_gamma_color_filter.cc
FILE: ../../../flutter/display_list/effects/color_filters/dl_linear_to_srgb_gamma_color_filter.h
FILE: ../../../flutter/display_list/effects/color_filters/dl_matrix_color_filter.cc
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
Expand All @@ -45468,6 +45485,7 @@ FILE: ../../../flutter/display_list/effects/color_sources/dl_sweep_gradient_colo
FILE: ../../../flutter/display_list/effects/color_sources/dl_sweep_gradient_color_source.h
FILE: ../../../flutter/display_list/effects/dl_color_filter.cc
FILE: ../../../flutter/display_list/effects/dl_color_filter.h
FILE: ../../../flutter/display_list/effects/dl_color_filters.h
FILE: ../../../flutter/display_list/effects/dl_color_source.cc
FILE: ../../../flutter/display_list/effects/dl_color_source.h
FILE: ../../../flutter/display_list/effects/dl_color_sources.h
Expand Down
10 changes: 10 additions & 0 deletions display_list/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,14 @@ source_set("display_list") {
"dl_tile_mode.h",
"dl_vertices.cc",
"dl_vertices.h",
"effects/color_filters/dl_blend_color_filter.cc",
"effects/color_filters/dl_blend_color_filter.h",
"effects/color_filters/dl_linear_to_srgb_gamma_color_filter.cc",
"effects/color_filters/dl_linear_to_srgb_gamma_color_filter.h",
"effects/color_filters/dl_matrix_color_filter.cc",
"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",
Expand All @@ -63,8 +71,10 @@ source_set("display_list") {
"effects/color_sources/dl_sweep_gradient_color_source.h",
"effects/dl_color_filter.cc",
"effects/dl_color_filter.h",
"effects/dl_color_filters.h",
"effects/dl_color_source.cc",
"effects/dl_color_source.h",
"effects/dl_color_sources.h",
"effects/dl_image_filter.cc",
"effects/dl_image_filter.h",
"effects/dl_image_filters.h",
Expand Down
30 changes: 15 additions & 15 deletions display_list/display_list_unittests.cc
Original file line number Diff line number Diff line change
Expand Up @@ -518,7 +518,7 @@ TEST_F(DisplayListTest, BuildRestoresAttributes) {
builder.Build();
check_defaults(builder, cull_rect);

receiver.setColorFilter(&kTestMatrixColorFilter1);
receiver.setColorFilter(kTestMatrixColorFilter1.get());
builder.Build();
check_defaults(builder, cull_rect);

Expand Down Expand Up @@ -940,7 +940,7 @@ TEST_F(DisplayListTest, DisplayListSaveLayerBoundsWithAlphaFilter) {
0, 0, 0, 1, 0,
};
// clang-format on
DlMatrixColorFilter base_color_filter(color_matrix);
auto base_color_filter = DlColorFilter::MakeMatrix(color_matrix);
// clang-format off
const float alpha_matrix[] = {
0, 0, 0, 0, 0,
Expand All @@ -949,7 +949,7 @@ TEST_F(DisplayListTest, DisplayListSaveLayerBoundsWithAlphaFilter) {
0, 0, 0, 0, 1,
};
// clang-format on
DlMatrixColorFilter alpha_color_filter(alpha_matrix);
auto alpha_color_filter = DlColorFilter::MakeMatrix(alpha_matrix);
sk_sp<SkColorFilter> sk_alpha_color_filter =
SkColorFilters::Matrix(alpha_matrix);

Expand All @@ -967,7 +967,7 @@ TEST_F(DisplayListTest, DisplayListSaveLayerBoundsWithAlphaFilter) {
// Now checking that a normal color filter still produces rect bounds
DisplayListBuilder builder(build_bounds);
DlPaint save_paint;
save_paint.setColorFilter(&base_color_filter);
save_paint.setColorFilter(base_color_filter);
builder.SaveLayer(&save_bounds, &save_paint);
builder.DrawRect(rect, DlPaint());
builder.Restore();
Expand Down Expand Up @@ -999,7 +999,7 @@ TEST_F(DisplayListTest, DisplayListSaveLayerBoundsWithAlphaFilter) {
// save layer that modifies an unbounded region
DisplayListBuilder builder(build_bounds);
DlPaint save_paint;
save_paint.setColorFilter(&alpha_color_filter);
save_paint.setColorFilter(alpha_color_filter);
builder.SaveLayer(&save_bounds, &save_paint);
builder.DrawRect(rect, DlPaint());
builder.Restore();
Expand All @@ -1012,7 +1012,7 @@ TEST_F(DisplayListTest, DisplayListSaveLayerBoundsWithAlphaFilter) {
// to the behavior in the previous example
DisplayListBuilder builder(build_bounds);
DlPaint save_paint;
save_paint.setColorFilter(&alpha_color_filter);
save_paint.setColorFilter(alpha_color_filter);
builder.SaveLayer(nullptr, &save_paint);
builder.DrawRect(rect, DlPaint());
builder.Restore();
Expand Down Expand Up @@ -1668,7 +1668,7 @@ TEST_F(DisplayListTest, SaveLayerColorFilterDoesNotInheritOpacity) {
DisplayListBuilder builder;
DlPaint save_paint;
save_paint.setColor(DlColor(SkColorSetARGB(127, 255, 255, 255)));
save_paint.setColorFilter(&kTestMatrixColorFilter1);
save_paint.setColorFilter(kTestMatrixColorFilter1);
builder.SaveLayer(nullptr, &save_paint);
builder.DrawRect(SkRect{10, 10, 20, 20}, DlPaint());
builder.Restore();
Expand Down Expand Up @@ -1720,7 +1720,7 @@ TEST_F(DisplayListTest, SaveLayerColorFilterOnChildDoesNotInheritOpacity) {
save_paint.setColor(DlColor(SkColorSetARGB(127, 255, 255, 255)));
builder.SaveLayer(nullptr, &save_paint);
DlPaint draw_paint = save_paint;
draw_paint.setColorFilter(&kTestMatrixColorFilter1);
draw_paint.setColorFilter(kTestMatrixColorFilter1);
builder.DrawRect(SkRect{10, 10, 20, 20}, draw_paint);
builder.Restore();

Expand Down Expand Up @@ -2671,7 +2671,7 @@ TEST_F(DisplayListTest, RemoveUnnecessarySaveRestorePairsInSetPaint) {
0, 0, 0, 0, 1,
};
// clang-format on
DlMatrixColorFilter alpha_color_filter(alpha_matrix);
auto alpha_color_filter = DlColorFilter::MakeMatrix(alpha_matrix);
// Making sure hiding a problematic ColorFilter as an ImageFilter
// will generate the same behavior as setting it as a ColorFilter

Expand Down Expand Up @@ -3957,7 +3957,7 @@ TEST_F(DisplayListTest, FloodingSaveLayerBoundsComputationOfSimpleRect) {
SkRect rect = SkRect::MakeLTRB(100.0f, 100.0f, 200.0f, 200.0f);
DlPaint save_paint;
auto color_filter =
DlBlendColorFilter::Make(DlColor::kRed(), DlBlendMode::kSrc);
DlColorFilter::MakeBlend(DlColor::kRed(), DlBlendMode::kSrc);
ASSERT_TRUE(color_filter->modifies_transparent_black());
save_paint.setColorFilter(color_filter);
SkRect clip_rect = rect.makeOutset(100.0f, 100.0f);
Expand All @@ -3983,7 +3983,7 @@ TEST_F(DisplayListTest, NestedFloodingSaveLayerBoundsComputationOfSimpleRect) {
SkRect rect = SkRect::MakeLTRB(100.0f, 100.0f, 200.0f, 200.0f);
DlPaint save_paint;
auto color_filter =
DlBlendColorFilter::Make(DlColor::kRed(), DlBlendMode::kSrc);
DlColorFilter::MakeBlend(DlColor::kRed(), DlBlendMode::kSrc);
ASSERT_TRUE(color_filter->modifies_transparent_black());
save_paint.setColorFilter(color_filter);
SkRect clip_rect = rect.makeOutset(100.0f, 100.0f);
Expand Down Expand Up @@ -4016,7 +4016,7 @@ TEST_F(DisplayListTest, SaveLayerBoundsComputationOfFloodingImageFilter) {
SkRect rect = SkRect::MakeLTRB(100.0f, 100.0f, 200.0f, 200.0f);
DlPaint draw_paint;
auto color_filter =
DlBlendColorFilter::Make(DlColor::kRed(), DlBlendMode::kSrc);
DlColorFilter::MakeBlend(DlColor::kRed(), DlBlendMode::kSrc);
ASSERT_TRUE(color_filter->modifies_transparent_black());
auto image_filter = DlImageFilter::MakeColorFilter(color_filter);
draw_paint.setImageFilter(image_filter);
Expand All @@ -4043,7 +4043,7 @@ TEST_F(DisplayListTest, SaveLayerBoundsComputationOfFloodingColorFilter) {
SkRect rect = SkRect::MakeLTRB(100.0f, 100.0f, 200.0f, 200.0f);
DlPaint draw_paint;
auto color_filter =
DlBlendColorFilter::Make(DlColor::kRed(), DlBlendMode::kSrc);
DlColorFilter::MakeBlend(DlColor::kRed(), DlBlendMode::kSrc);
ASSERT_TRUE(color_filter->modifies_transparent_black());
draw_paint.setColorFilter(color_filter);
SkRect clip_rect = rect.makeOutset(100.0f, 100.0f);
Expand Down Expand Up @@ -4233,7 +4233,7 @@ TEST_F(DisplayListTest, FloodingFilteredLayerPushesRestoreOpIndex) {
0.5f, 0.0f, 0.0f, 0.0f, 0.5f
};
// clang-format on
auto color_filter = DlMatrixColorFilter::Make(matrix);
auto color_filter = DlColorFilter::MakeMatrix(matrix);
save_paint.setImageFilter(DlImageFilter::MakeColorFilter(color_filter));
builder.SaveLayer(nullptr, &save_paint);
int save_layer_id = DisplayListBuilderTestingLastOpIndex(builder);
Expand Down Expand Up @@ -5817,7 +5817,7 @@ TEST_F(DisplayListTest, UnboundedRenderOpsAreReportedUnlessClipped) {
0.0f, 0.0f, 0.0f, 0.0f, 1.0f,
};
// clang-format on
auto unbounded_cf = DlMatrixColorFilter::Make(matrix);
auto unbounded_cf = DlColorFilter::MakeMatrix(matrix);
// ColorFilter must modify transparent black to be "unbounded"
ASSERT_TRUE(unbounded_cf->modifies_transparent_black());
auto unbounded_if = DlImageFilter::MakeColorFilter(unbounded_cf);
Expand Down
1 change: 1 addition & 0 deletions display_list/dl_builder.cc
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
#include "flutter/display_list/dl_blend_mode.h"
#include "flutter/display_list/dl_op_flags.h"
#include "flutter/display_list/dl_op_records.h"
#include "flutter/display_list/effects/dl_color_filters.h"
#include "flutter/display_list/effects/dl_color_source.h"
#include "flutter/display_list/effects/dl_image_filters.h"
#include "flutter/display_list/utils/dl_accumulation_rect.h"
Expand Down
14 changes: 8 additions & 6 deletions display_list/dl_paint_unittests.cc
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

#include "flutter/display_list/dl_paint.h"

#include "flutter/display_list/testing/dl_test_equality.h"
#include "flutter/display_list/utils/dl_comparable.h"
#include "gtest/gtest.h"

Expand Down Expand Up @@ -58,8 +59,9 @@ TEST(DisplayListPaint, ConstructorDefaults) {
auto color_source = DlColorSource::MakeColor(DlColor::kMagenta());
EXPECT_NE(paint, DlPaint().setColorSource(color_source));

DlBlendColorFilter color_filter(DlColor::kYellow(), DlBlendMode::kDstIn);
EXPECT_NE(paint, DlPaint().setColorFilter(color_filter.shared()));
auto color_filter =
DlColorFilter::MakeBlend(DlColor::kYellow(), DlBlendMode::kDstATop);
EXPECT_NE(paint, DlPaint().setColorFilter(color_filter));

auto image_filter = DlImageFilter::MakeBlur(1.3, 4.7, DlTileMode::kClamp);
EXPECT_NE(paint, DlPaint().setImageFilter(image_filter));
Expand Down Expand Up @@ -107,8 +109,7 @@ TEST(DisplayListPaint, ChainingConstructor) {
.setStrokeMiter(1.5) //
.setColorSource(DlColorSource::MakeColor(DlColor::kMagenta())) //
.setColorFilter(
DlBlendColorFilter(DlColor::kYellow(), DlBlendMode::kDstIn)
.shared())
DlColorFilter::MakeBlend(DlColor::kYellow(), DlBlendMode::kDstIn))
.setImageFilter(DlImageFilter::MakeBlur(1.3, 4.7, DlTileMode::kClamp))
.setMaskFilter(DlBlurMaskFilter(DlBlurStyle::kInner, 3.14).shared());
EXPECT_TRUE(paint.isAntiAlias());
Expand All @@ -123,8 +124,9 @@ TEST(DisplayListPaint, ChainingConstructor) {
EXPECT_EQ(paint.getStrokeMiter(), 1.5);
EXPECT_TRUE(Equals(paint.getColorSource(),
DlColorSource::MakeColor(DlColor::kMagenta())));
EXPECT_EQ(*paint.getColorFilter(),
DlBlendColorFilter(DlColor::kYellow(), DlBlendMode::kDstIn));
EXPECT_TRUE(Equals(
paint.getColorFilter(),
DlColorFilter::MakeBlend(DlColor::kYellow(), DlBlendMode::kDstIn)));
EXPECT_TRUE(Equals(paint.getImageFilter(),
DlImageFilter::MakeBlur(1.3, 4.7, DlTileMode::kClamp)));
EXPECT_EQ(*paint.getMaskFilter(),
Expand Down
126 changes: 126 additions & 0 deletions display_list/effects/color_filters/dl_blend_color_filter.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
// 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_filters/dl_blend_color_filter.h"

namespace flutter {

std::shared_ptr<const DlColorFilter> DlBlendColorFilter::Make(
DlColor color,
DlBlendMode mode) {
switch (mode) {
case DlBlendMode::kDst: {
return nullptr;
}
case DlBlendMode::kSrcOver: {
if (color.isTransparent()) {
return nullptr;
}
if (color.isOpaque()) {
mode = DlBlendMode::kSrc;
}
break;
}
case DlBlendMode::kDstOver:
case DlBlendMode::kDstOut:
case DlBlendMode::kSrcATop:
case DlBlendMode::kXor:
case DlBlendMode::kDarken: {
if (color.isTransparent()) {
return nullptr;
}
break;
}
case DlBlendMode::kDstIn: {
if (color.isOpaque()) {
return nullptr;
}
break;
}
default:
break;
}
return std::make_shared<DlBlendColorFilter>(color, mode);
}

bool DlBlendColorFilter::modifies_transparent_black() const {
switch (mode_) {
// These modes all act like kSrc when the dest is all 0s.
// So they modify transparent black when the src color is
// not transparent.
case DlBlendMode::kSrc:
case DlBlendMode::kSrcOver:
case DlBlendMode::kDstOver:
case DlBlendMode::kSrcOut:
case DlBlendMode::kDstATop:
case DlBlendMode::kXor:
case DlBlendMode::kPlus:
case DlBlendMode::kScreen:
case DlBlendMode::kOverlay:
case DlBlendMode::kDarken:
case DlBlendMode::kLighten:
case DlBlendMode::kColorDodge:
case DlBlendMode::kColorBurn:
case DlBlendMode::kHardLight:
case DlBlendMode::kSoftLight:
case DlBlendMode::kDifference:
case DlBlendMode::kExclusion:
case DlBlendMode::kMultiply:
case DlBlendMode::kHue:
case DlBlendMode::kSaturation:
case DlBlendMode::kColor:
case DlBlendMode::kLuminosity:
return !color_.isTransparent();

// These modes are all like kDst when the dest is all 0s.
// So they never modify transparent black.
case DlBlendMode::kClear:
case DlBlendMode::kDst:
case DlBlendMode::kSrcIn:
case DlBlendMode::kDstIn:
case DlBlendMode::kDstOut:
case DlBlendMode::kSrcATop:
case DlBlendMode::kModulate:
return false;
}
}

bool DlBlendColorFilter::can_commute_with_opacity() const {
switch (mode_) {
case DlBlendMode::kClear:
case DlBlendMode::kDst:
case DlBlendMode::kSrcIn:
case DlBlendMode::kDstIn:
case DlBlendMode::kDstOut:
case DlBlendMode::kSrcATop:
case DlBlendMode::kModulate:
return true;

case DlBlendMode::kSrc:
case DlBlendMode::kSrcOver:
case DlBlendMode::kDstOver:
case DlBlendMode::kSrcOut:
case DlBlendMode::kDstATop:
case DlBlendMode::kXor:
case DlBlendMode::kPlus:
case DlBlendMode::kScreen:
case DlBlendMode::kOverlay:
case DlBlendMode::kDarken:
case DlBlendMode::kLighten:
case DlBlendMode::kColorDodge:
case DlBlendMode::kColorBurn:
case DlBlendMode::kHardLight:
case DlBlendMode::kSoftLight:
case DlBlendMode::kDifference:
case DlBlendMode::kExclusion:
case DlBlendMode::kMultiply:
case DlBlendMode::kHue:
case DlBlendMode::kSaturation:
case DlBlendMode::kColor:
case DlBlendMode::kLuminosity:
return color_.isTransparent();
}
}

} // namespace flutter
Loading