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
34 changes: 34 additions & 0 deletions ci/licenses_golden/licenses_flutter
Original file line number Diff line number Diff line change
Expand Up @@ -42530,16 +42530,33 @@ 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/dl_blur_image_filter.cc + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/display_list/effects/dl_blur_image_filter.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_filter_image_filter.cc + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/display_list/effects/dl_color_filter_image_filter.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_compose_image_filter.cc + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/display_list/effects/dl_compose_image_filter.h + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/display_list/effects/dl_dilate_image_filter.cc + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/display_list/effects/dl_dilate_image_filter.h + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/display_list/effects/dl_erode_image_filter.cc + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/display_list/effects/dl_erode_image_filter.h + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/display_list/effects/dl_image_filter.cc + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/display_list/effects/dl_image_filter.h + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/display_list/effects/dl_image_filters.h + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/display_list/effects/dl_local_matrix_image_filter.cc + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/display_list/effects/dl_local_matrix_image_filter.h + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/display_list/effects/dl_mask_filter.cc + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/display_list/effects/dl_mask_filter.h + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/display_list/effects/dl_matrix_image_filter.cc + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/display_list/effects/dl_matrix_image_filter.h + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/display_list/effects/dl_runtime_effect.cc + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/display_list/effects/dl_runtime_effect.h + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/display_list/effects/dl_runtime_effect_image_filter.cc + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/display_list/effects/dl_runtime_effect_image_filter.h + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/display_list/geometry/dl_geometry_types.h + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/display_list/geometry/dl_path.cc + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/display_list/geometry/dl_path.h + ../../../flutter/LICENSE
Expand Down Expand Up @@ -45399,16 +45416,33 @@ 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/dl_blur_image_filter.cc
FILE: ../../../flutter/display_list/effects/dl_blur_image_filter.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_filter_image_filter.cc
FILE: ../../../flutter/display_list/effects/dl_color_filter_image_filter.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_compose_image_filter.cc
FILE: ../../../flutter/display_list/effects/dl_compose_image_filter.h
FILE: ../../../flutter/display_list/effects/dl_dilate_image_filter.cc
FILE: ../../../flutter/display_list/effects/dl_dilate_image_filter.h
FILE: ../../../flutter/display_list/effects/dl_erode_image_filter.cc
FILE: ../../../flutter/display_list/effects/dl_erode_image_filter.h
FILE: ../../../flutter/display_list/effects/dl_image_filter.cc
FILE: ../../../flutter/display_list/effects/dl_image_filter.h
FILE: ../../../flutter/display_list/effects/dl_image_filters.h
FILE: ../../../flutter/display_list/effects/dl_local_matrix_image_filter.cc
FILE: ../../../flutter/display_list/effects/dl_local_matrix_image_filter.h
FILE: ../../../flutter/display_list/effects/dl_mask_filter.cc
FILE: ../../../flutter/display_list/effects/dl_mask_filter.h
FILE: ../../../flutter/display_list/effects/dl_matrix_image_filter.cc
FILE: ../../../flutter/display_list/effects/dl_matrix_image_filter.h
FILE: ../../../flutter/display_list/effects/dl_runtime_effect.cc
FILE: ../../../flutter/display_list/effects/dl_runtime_effect.h
FILE: ../../../flutter/display_list/effects/dl_runtime_effect_image_filter.cc
FILE: ../../../flutter/display_list/effects/dl_runtime_effect_image_filter.h
FILE: ../../../flutter/display_list/geometry/dl_geometry_types.h
FILE: ../../../flutter/display_list/geometry/dl_path.cc
FILE: ../../../flutter/display_list/geometry/dl_path.h
Expand Down
17 changes: 17 additions & 0 deletions display_list/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -47,16 +47,33 @@ source_set("display_list") {
"dl_tile_mode.h",
"dl_vertices.cc",
"dl_vertices.h",
"effects/dl_blur_image_filter.cc",
"effects/dl_blur_image_filter.h",
"effects/dl_color_filter.cc",
"effects/dl_color_filter.h",
"effects/dl_color_filter_image_filter.cc",
"effects/dl_color_filter_image_filter.h",
"effects/dl_color_source.cc",
"effects/dl_color_source.h",
"effects/dl_compose_image_filter.cc",
"effects/dl_compose_image_filter.h",
"effects/dl_dilate_image_filter.cc",
"effects/dl_dilate_image_filter.h",
"effects/dl_erode_image_filter.cc",
"effects/dl_erode_image_filter.h",
"effects/dl_image_filter.cc",
"effects/dl_image_filter.h",
"effects/dl_image_filters.h",
"effects/dl_local_matrix_image_filter.cc",
"effects/dl_local_matrix_image_filter.h",
"effects/dl_mask_filter.cc",
"effects/dl_mask_filter.h",
"effects/dl_matrix_image_filter.cc",
"effects/dl_matrix_image_filter.h",
"effects/dl_runtime_effect.cc",
"effects/dl_runtime_effect.h",
"effects/dl_runtime_effect_image_filter.cc",
"effects/dl_runtime_effect_image_filter.h",
"geometry/dl_geometry_types.h",
"geometry/dl_path.cc",
"geometry/dl_path.h",
Expand Down
2 changes: 1 addition & 1 deletion display_list/benchmarking/dl_transform_benchmarks.cc
Original file line number Diff line number Diff line change
Expand Up @@ -457,7 +457,7 @@ class ImpellerMatrixAdapter : public TransformAdapter {
bool InvertAndCheck(const TestTransform& transform,
TestTransform& result) const override {
result.impeller_matrix = transform.impeller_matrix.Invert();
return transform.impeller_matrix.GetDeterminant() != 0.0f;
return transform.impeller_matrix.IsInvertible();
}
};

Expand Down
77 changes: 40 additions & 37 deletions display_list/display_list_unittests.cc
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
#include "flutter/display_list/dl_blend_mode.h"
#include "flutter/display_list/dl_builder.h"
#include "flutter/display_list/dl_paint.h"
#include "flutter/display_list/effects/dl_image_filters.h"
#include "flutter/display_list/geometry/dl_rtree.h"
#include "flutter/display_list/skia/dl_sk_dispatcher.h"
#include "flutter/display_list/testing/dl_test_snippets.h"
Expand Down Expand Up @@ -108,7 +109,7 @@ class DisplayListTestBase : public BaseT {

static void check_defaults(
DisplayListBuilder& builder,
const SkRect& cull_rect = DisplayListBuilder::kMaxCullRect) {
const DlRect& cull_rect = DisplayListBuilder::kMaxCullRect) {
DlPaint builder_paint = DisplayListBuilderTestingAttributes(builder);
DlPaint defaults;

Expand All @@ -131,8 +132,8 @@ class DisplayListTestBase : public BaseT {
EXPECT_EQ(builder.GetTransform(), SkMatrix());
EXPECT_EQ(builder.GetTransformFullPerspective(), SkM44());

EXPECT_EQ(builder.GetLocalClipBounds(), cull_rect);
EXPECT_EQ(builder.GetDestinationClipBounds(), cull_rect);
EXPECT_EQ(builder.GetLocalClipCoverage(), cull_rect);
EXPECT_EQ(builder.GetDestinationClipCoverage(), cull_rect);

EXPECT_EQ(builder.GetSaveCount(), 1);
}
Expand Down Expand Up @@ -346,7 +347,7 @@ TEST_F(DisplayListTest, BuilderCanBeReused) {
}

TEST_F(DisplayListTest, SaveRestoreRestoresTransform) {
SkRect cull_rect = SkRect::MakeLTRB(-10.0f, -10.0f, 500.0f, 500.0f);
DlRect cull_rect = DlRect::MakeLTRB(-10.0f, -10.0f, 500.0f, 500.0f);
DisplayListBuilder builder(cull_rect);

builder.Save();
Expand Down Expand Up @@ -395,7 +396,7 @@ TEST_F(DisplayListTest, SaveRestoreRestoresTransform) {
}

TEST_F(DisplayListTest, BuildRestoresTransform) {
SkRect cull_rect = SkRect::MakeLTRB(-10.0f, -10.0f, 500.0f, 500.0f);
DlRect cull_rect = DlRect::MakeLTRB(-10.0f, -10.0f, 500.0f, 500.0f);
DisplayListBuilder builder(cull_rect);

builder.Translate(10.0f, 10.0f);
Expand Down Expand Up @@ -436,7 +437,7 @@ TEST_F(DisplayListTest, BuildRestoresTransform) {
}

TEST_F(DisplayListTest, SaveRestoreRestoresClip) {
SkRect cull_rect = SkRect::MakeLTRB(-10.0f, -10.0f, 500.0f, 500.0f);
DlRect cull_rect = DlRect::MakeLTRB(-10.0f, -10.0f, 500.0f, 500.0f);
DisplayListBuilder builder(cull_rect);

builder.Save();
Expand All @@ -456,7 +457,7 @@ TEST_F(DisplayListTest, SaveRestoreRestoresClip) {
}

TEST_F(DisplayListTest, BuildRestoresClip) {
SkRect cull_rect = SkRect::MakeLTRB(-10.0f, -10.0f, 500.0f, 500.0f);
DlRect cull_rect = DlRect::MakeLTRB(-10.0f, -10.0f, 500.0f, 500.0f);
DisplayListBuilder builder(cull_rect);

builder.ClipRect(SkRect{0.0f, 0.0f, 10.0f, 10.0f});
Expand All @@ -473,7 +474,7 @@ TEST_F(DisplayListTest, BuildRestoresClip) {
}

TEST_F(DisplayListTest, BuildRestoresAttributes) {
SkRect cull_rect = SkRect::MakeLTRB(-10.0f, -10.0f, 500.0f, 500.0f);
DlRect cull_rect = DlRect::MakeLTRB(-10.0f, -10.0f, 500.0f, 500.0f);
DisplayListBuilder builder(cull_rect);
DlOpReceiver& receiver = ToReceiver(builder);

Expand Down Expand Up @@ -658,22 +659,22 @@ TEST_F(DisplayListTest, ClippedSaveLayerContentAccountsForFilter) {
}

TEST_F(DisplayListTest, OOBSaveLayerContentCulledWithBlurFilter) {
SkRect cull_rect = SkRect::MakeLTRB(100.0f, 100.0f, 200.0f, 200.0f);
SkRect draw_rect = SkRect::MakeLTRB(25.0f, 25.0f, 99.0f, 75.0f);
DlRect cull_rect = DlRect::MakeLTRB(100.0f, 100.0f, 200.0f, 200.0f);
DlRect draw_rect = DlRect::MakeLTRB(25.0f, 25.0f, 99.0f, 75.0f);
auto filter = DlBlurImageFilter::Make(10.0f, 10.0f, DlTileMode::kDecal);
DlPaint layer_paint = DlPaint().setImageFilter(filter);

// We want a draw rect that is outside the layer bounds even though its
// filtered output might be inside. The drawn rect should be culled by
// the expectations of the layer bounds even though it is close enough
// to be visible due to filtering.
ASSERT_FALSE(cull_rect.intersects(draw_rect));
SkRect mapped_rect;
ASSERT_FALSE(cull_rect.IntersectsWithRect(draw_rect));
DlRect mapped_rect;
ASSERT_TRUE(filter->map_local_bounds(draw_rect, mapped_rect));
ASSERT_TRUE(mapped_rect.intersects(cull_rect));
ASSERT_TRUE(mapped_rect.IntersectsWithRect(cull_rect));

DisplayListBuilder builder;
builder.SaveLayer(&cull_rect, &layer_paint);
builder.SaveLayer(cull_rect, &layer_paint);
{ //
builder.DrawRect(draw_rect, DlPaint());
}
Expand All @@ -687,23 +688,23 @@ TEST_F(DisplayListTest, OOBSaveLayerContentCulledWithBlurFilter) {
}

TEST_F(DisplayListTest, OOBSaveLayerContentCulledWithMatrixFilter) {
SkRect cull_rect = SkRect::MakeLTRB(100.0f, 100.0f, 200.0f, 200.0f);
SkRect draw_rect = SkRect::MakeLTRB(25.0f, 125.0f, 75.0f, 175.0f);
auto filter = DlMatrixImageFilter::Make(SkMatrix::Translate(100.0f, 0.0f),
DlImageSampling::kLinear);
DlRect cull_rect = DlRect::MakeLTRB(100.0f, 100.0f, 200.0f, 200.0f);
DlRect draw_rect = DlRect::MakeLTRB(25.0f, 125.0f, 75.0f, 175.0f);
auto filter = DlMatrixImageFilter::Make(
DlMatrix::MakeTranslation({100.0f, 0.0f}), DlImageSampling::kLinear);
DlPaint layer_paint = DlPaint().setImageFilter(filter);

// We want a draw rect that is outside the layer bounds even though its
// filtered output might be inside. The drawn rect should be culled by
// the expectations of the layer bounds even though it is close enough
// to be visible due to filtering.
ASSERT_FALSE(cull_rect.intersects(draw_rect));
SkRect mapped_rect;
ASSERT_FALSE(cull_rect.IntersectsWithRect(draw_rect));
DlRect mapped_rect;
ASSERT_TRUE(filter->map_local_bounds(draw_rect, mapped_rect));
ASSERT_TRUE(mapped_rect.intersects(cull_rect));
ASSERT_TRUE(mapped_rect.IntersectsWithRect(cull_rect));

DisplayListBuilder builder;
builder.SaveLayer(&cull_rect, &layer_paint);
builder.SaveLayer(cull_rect, &layer_paint);
{ //
builder.DrawRect(draw_rect, DlPaint());
}
Expand Down Expand Up @@ -4257,8 +4258,9 @@ TEST_F(DisplayListTest, TransformingFilterSaveLayerSimpleContentBounds) {
builder.ClipRect(SkRect::MakeLTRB(100.0f, 100.0f, 200.0f, 200.0f));

DlPaint save_paint;
auto image_filter = DlMatrixImageFilter::Make(
SkMatrix::Translate(100.0f, 100.0f), DlImageSampling::kNearestNeighbor);
auto image_filter =
DlMatrixImageFilter::Make(DlMatrix::MakeTranslation({100.0f, 100.0f}),
DlImageSampling::kNearestNeighbor);
save_paint.setImageFilter(image_filter);
builder.SaveLayer(nullptr, &save_paint);

Expand All @@ -4275,8 +4277,9 @@ TEST_F(DisplayListTest, TransformingFilterSaveLayerFloodedContentBounds) {
builder.ClipRect(SkRect::MakeLTRB(100.0f, 100.0f, 200.0f, 200.0f));

DlPaint save_paint;
auto image_filter = DlMatrixImageFilter::Make(
SkMatrix::Translate(100.0f, 100.0f), DlImageSampling::kNearestNeighbor);
auto image_filter =
DlMatrixImageFilter::Make(DlMatrix::MakeTranslation({100.0f, 100.0f}),
DlImageSampling::kNearestNeighbor);
save_paint.setImageFilter(image_filter);
builder.SaveLayer(nullptr, &save_paint);

Expand Down Expand Up @@ -5697,9 +5700,9 @@ TEST_F(DisplayListTest, BoundedRenderOpsDoNotReportUnbounded) {
}

TEST_F(DisplayListTest, UnboundedRenderOpsAreReportedUnlessClipped) {
static const SkRect root_cull = SkRect::MakeLTRB(100, 100, 200, 200);
static const SkRect clip_rect = SkRect::MakeLTRB(120, 120, 180, 180);
static const SkRect draw_rect = SkRect::MakeLTRB(110, 110, 190, 190);
static const DlRect root_cull = DlRect::MakeLTRB(100, 100, 200, 200);
static const DlRect clip_rect = DlRect::MakeLTRB(120, 120, 180, 180);
static const DlRect draw_rect = DlRect::MakeLTRB(110, 110, 190, 190);

using Renderer = const std::function<void(DlCanvas&)>;
auto test_unbounded = [](const std::string& label, //
Expand All @@ -5710,7 +5713,7 @@ TEST_F(DisplayListTest, UnboundedRenderOpsAreReportedUnlessClipped) {
renderer(builder);
auto display_list = builder.Build();

EXPECT_EQ(display_list->bounds(), root_cull) << label;
EXPECT_EQ(display_list->GetBounds(), root_cull) << label;
EXPECT_TRUE(display_list->root_is_unbounded()) << label;
}

Expand All @@ -5720,7 +5723,7 @@ TEST_F(DisplayListTest, UnboundedRenderOpsAreReportedUnlessClipped) {
renderer(builder);
auto display_list = builder.Build();

EXPECT_EQ(display_list->bounds(), clip_rect) << label;
EXPECT_EQ(display_list->GetBounds(), clip_rect) << label;
EXPECT_FALSE(display_list->root_is_unbounded()) << label;
}

Expand All @@ -5731,7 +5734,7 @@ TEST_F(DisplayListTest, UnboundedRenderOpsAreReportedUnlessClipped) {
builder.Restore();
auto display_list = builder.Build();

EXPECT_EQ(display_list->bounds(), root_cull) << label;
EXPECT_EQ(display_list->GetBounds(), root_cull) << label;
EXPECT_FALSE(display_list->root_is_unbounded()) << label;

SAVE_LAYER_EXPECTOR(expector);
Expand All @@ -5754,7 +5757,7 @@ TEST_F(DisplayListTest, UnboundedRenderOpsAreReportedUnlessClipped) {
builder.Restore();
auto display_list = builder.Build();

EXPECT_EQ(display_list->bounds(), clip_rect) << label;
EXPECT_EQ(display_list->GetBounds(), clip_rect) << label;
EXPECT_FALSE(display_list->root_is_unbounded()) << label;

SAVE_LAYER_EXPECTOR(expector);
Expand Down Expand Up @@ -5783,13 +5786,13 @@ TEST_F(DisplayListTest, UnboundedRenderOpsAreReportedUnlessClipped) {
});

test_unbounded("DrawPathEvenOddInverted", [](DlCanvas& builder) {
SkPath path = SkPath::Rect(draw_rect);
SkPath path = SkPath::Rect(ToSkRect(draw_rect));
path.setFillType(SkPathFillType::kInverseEvenOdd);
builder.DrawPath(path, DlPaint());
});

test_unbounded("DrawPathWindingInverted", [](DlCanvas& builder) {
SkPath path = SkPath::Rect(draw_rect);
SkPath path = SkPath::Rect(ToSkRect(draw_rect));
path.setFillType(SkPathFillType::kInverseWinding);
builder.DrawPath(path, DlPaint());
});
Expand All @@ -5799,7 +5802,7 @@ TEST_F(DisplayListTest, UnboundedRenderOpsAreReportedUnlessClipped) {
nested_builder.DrawPaint(DlPaint());
auto nested_display_list = nested_builder.Build();

EXPECT_EQ(nested_display_list->bounds(), root_cull);
EXPECT_EQ(nested_display_list->GetBounds(), root_cull);
ASSERT_TRUE(nested_display_list->root_is_unbounded());

builder.DrawDisplayList(nested_display_list);
Expand All @@ -5818,7 +5821,7 @@ TEST_F(DisplayListTest, UnboundedRenderOpsAreReportedUnlessClipped) {
// ColorFilter must modify transparent black to be "unbounded"
ASSERT_TRUE(unbounded_cf->modifies_transparent_black());
auto unbounded_if = DlColorFilterImageFilter::Make(unbounded_cf);
SkRect output_bounds;
DlRect output_bounds;
// ImageFilter returns null from bounds queries if it is "unbounded"
ASSERT_EQ(unbounded_if->map_local_bounds(draw_rect, output_bounds),
nullptr);
Expand Down
Loading