Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 5e3163e

Browse files
committed
licenses and unit test for converted path sharing
1 parent 02f26ec commit 5e3163e

File tree

5 files changed

+154
-0
lines changed

5 files changed

+154
-0
lines changed

ci/licenses_golden/excluded_files

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
../../../flutter/display_list/effects/dl_image_filter_unittests.cc
4242
../../../flutter/display_list/effects/dl_mask_filter_unittests.cc
4343
../../../flutter/display_list/geometry/dl_geometry_types_unittests.cc
44+
../../../flutter/display_list/geometry/dl_path_unittests.cc
4445
../../../flutter/display_list/geometry/dl_region_unittests.cc
4546
../../../flutter/display_list/geometry/dl_rtree_unittests.cc
4647
../../../flutter/display_list/skia/dl_sk_conversions_unittests.cc

ci/licenses_golden/licenses_flutter

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42345,6 +42345,8 @@ ORIGIN: ../../../flutter/display_list/effects/dl_mask_filter.h + ../../../flutte
4234542345
ORIGIN: ../../../flutter/display_list/effects/dl_runtime_effect.cc + ../../../flutter/LICENSE
4234642346
ORIGIN: ../../../flutter/display_list/effects/dl_runtime_effect.h + ../../../flutter/LICENSE
4234742347
ORIGIN: ../../../flutter/display_list/geometry/dl_geometry_types.h + ../../../flutter/LICENSE
42348+
ORIGIN: ../../../flutter/display_list/geometry/dl_path.cc + ../../../flutter/LICENSE
42349+
ORIGIN: ../../../flutter/display_list/geometry/dl_path.h + ../../../flutter/LICENSE
4234842350
ORIGIN: ../../../flutter/display_list/geometry/dl_region.cc + ../../../flutter/LICENSE
4234942351
ORIGIN: ../../../flutter/display_list/geometry/dl_region.h + ../../../flutter/LICENSE
4235042352
ORIGIN: ../../../flutter/display_list/geometry/dl_rtree.cc + ../../../flutter/LICENSE
@@ -45240,6 +45242,8 @@ FILE: ../../../flutter/display_list/effects/dl_mask_filter.h
4524045242
FILE: ../../../flutter/display_list/effects/dl_runtime_effect.cc
4524145243
FILE: ../../../flutter/display_list/effects/dl_runtime_effect.h
4524245244
FILE: ../../../flutter/display_list/geometry/dl_geometry_types.h
45245+
FILE: ../../../flutter/display_list/geometry/dl_path.cc
45246+
FILE: ../../../flutter/display_list/geometry/dl_path.h
4524345247
FILE: ../../../flutter/display_list/geometry/dl_region.cc
4524445248
FILE: ../../../flutter/display_list/geometry/dl_region.h
4524545249
FILE: ../../../flutter/display_list/geometry/dl_rtree.cc

display_list/geometry/dl_path.cc

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,16 @@ bool DlPath::operator==(const DlPath& other) const {
5757
return sk_path_ == other.sk_path_;
5858
}
5959

60+
bool DlPath::IsConverted() const {
61+
if (!path_.IsEmpty()) {
62+
return true;
63+
}
64+
if (sk_path_.isEmpty()) {
65+
return true;
66+
}
67+
return false;
68+
}
69+
6070
using Path = impeller::Path;
6171
using PathBuilder = impeller::PathBuilder;
6272
using FillType = impeller::FillType;

display_list/geometry/dl_path.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ class DlPath {
3636

3737
bool operator==(const DlPath& other) const;
3838

39+
bool IsConverted() const;
40+
3941
private:
4042
const SkPath sk_path_;
4143
mutable impeller::Path path_;

display_list/geometry/dl_path_unittests.cc

Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ TEST(DisplayListPath, DefaultConstruction) {
1717
EXPECT_EQ(path.GetSkPath(), SkPath());
1818

1919
EXPECT_FALSE(path.IsInverseFillType());
20+
// Empty/default paths are always "pre-converted" by default.
21+
EXPECT_TRUE(path.IsConverted());
2022

2123
bool is_closed = false;
2224
EXPECT_FALSE(path.IsRect(nullptr));
@@ -42,6 +44,10 @@ TEST(DisplayListPath, ConstructFromEmpty) {
4244
EXPECT_EQ(path, DlPath());
4345
EXPECT_EQ(path.GetSkPath(), SkPath());
4446

47+
EXPECT_FALSE(path.IsInverseFillType());
48+
// Empty/default paths are always "pre-converted" by default.
49+
EXPECT_TRUE(path.IsConverted());
50+
4551
bool is_closed = false;
4652
EXPECT_FALSE(path.IsRect(nullptr));
4753
EXPECT_FALSE(path.IsRect(nullptr, &is_closed));
@@ -59,6 +65,90 @@ TEST(DisplayListPath, ConstructFromEmpty) {
5965
EXPECT_EQ(path.GetSkBounds(), SkRect());
6066
}
6167

68+
TEST(DisplayListPath, CopyConstruct) {
69+
SkPath sk_path = SkPath::Oval(SkRect::MakeLTRB(10, 10, 20, 20));
70+
DlPath path1(sk_path);
71+
DlPath path2 = DlPath(path1);
72+
73+
EXPECT_EQ(path2, path1);
74+
EXPECT_EQ(path2, DlPath(SkPath::Oval(SkRect::MakeLTRB(10, 10, 20, 20))));
75+
EXPECT_EQ(path2.GetSkPath(), SkPath::Oval(SkRect::MakeLTRB(10, 10, 20, 20)));
76+
77+
EXPECT_FALSE(path2.IsInverseFillType());
78+
EXPECT_FALSE(path2.IsConverted());
79+
80+
bool is_closed = false;
81+
EXPECT_FALSE(path2.IsRect(nullptr));
82+
EXPECT_FALSE(path2.IsRect(nullptr, &is_closed));
83+
EXPECT_FALSE(is_closed);
84+
EXPECT_TRUE(path2.IsOval(nullptr));
85+
86+
is_closed = false;
87+
EXPECT_FALSE(path2.IsSkRect(nullptr));
88+
EXPECT_FALSE(path2.IsSkRect(nullptr, &is_closed));
89+
EXPECT_FALSE(is_closed);
90+
EXPECT_TRUE(path2.IsSkOval(nullptr));
91+
EXPECT_FALSE(path2.IsSkRRect(nullptr));
92+
93+
EXPECT_EQ(path2.GetBounds(), DlRect::MakeLTRB(10, 10, 20, 20));
94+
EXPECT_EQ(path2.GetSkBounds(), SkRect::MakeLTRB(10, 10, 20, 20));
95+
}
96+
97+
TEST(DisplayListPath, EmbeddingSharedReference) {
98+
SkPath sk_path = SkPath::Oval(SkRect::MakeLTRB(10, 10, 20, 20));
99+
DlPath path(sk_path);
100+
101+
class ConversionSharingTester {
102+
public:
103+
explicit ConversionSharingTester(const DlPath& path) : path_(path) {}
104+
105+
bool ConvertAndTestEmpty() { return path_.GetPath().IsEmpty(); }
106+
107+
bool Test(const DlPath& reference_path, const std::string& label) {
108+
EXPECT_EQ(path_, reference_path) << label;
109+
EXPECT_EQ(path_, DlPath(SkPath::Oval(SkRect::MakeLTRB(10, 10, 20, 20))))
110+
<< label;
111+
EXPECT_EQ(path_.GetSkPath(),
112+
SkPath::Oval(SkRect::MakeLTRB(10, 10, 20, 20)))
113+
<< label;
114+
115+
EXPECT_FALSE(path_.IsInverseFillType()) << label;
116+
117+
bool is_closed = false;
118+
EXPECT_FALSE(path_.IsRect(nullptr)) << label;
119+
EXPECT_FALSE(path_.IsRect(nullptr, &is_closed)) << label;
120+
EXPECT_FALSE(is_closed) << label;
121+
EXPECT_TRUE(path_.IsOval(nullptr)) << label;
122+
123+
is_closed = false;
124+
EXPECT_FALSE(path_.IsSkRect(nullptr)) << label;
125+
EXPECT_FALSE(path_.IsSkRect(nullptr, &is_closed)) << label;
126+
EXPECT_FALSE(is_closed) << label;
127+
EXPECT_TRUE(path_.IsSkOval(nullptr)) << label;
128+
EXPECT_FALSE(path_.IsSkRRect(nullptr)) << label;
129+
130+
EXPECT_EQ(path_.GetBounds(), DlRect::MakeLTRB(10, 10, 20, 20)) << label;
131+
EXPECT_EQ(path_.GetSkBounds(), SkRect::MakeLTRB(10, 10, 20, 20)) << label;
132+
return path_.IsConverted();
133+
};
134+
135+
private:
136+
const DlPath path_;
137+
};
138+
139+
EXPECT_FALSE(path.IsConverted());
140+
ConversionSharingTester before_tester(path);
141+
EXPECT_FALSE(before_tester.Test(path, "Before triggering conversion"));
142+
EXPECT_FALSE(path.GetPath().IsEmpty());
143+
EXPECT_FALSE(before_tester.Test(path, "After conversion of source object"));
144+
EXPECT_FALSE(before_tester.ConvertAndTestEmpty());
145+
EXPECT_TRUE(before_tester.Test(path, "After conversion of captured object"));
146+
147+
EXPECT_TRUE(path.IsConverted());
148+
ConversionSharingTester after_tester(path);
149+
EXPECT_TRUE(after_tester.Test(path, "Constructed after conversion"));
150+
}
151+
62152
TEST(DisplayListPath, ConstructFromRect) {
63153
SkPath sk_path = SkPath::Rect(SkRect::MakeLTRB(10, 10, 20, 20));
64154
DlPath path(sk_path);
@@ -67,6 +157,9 @@ TEST(DisplayListPath, ConstructFromRect) {
67157
EXPECT_EQ(path.GetSkPath(), SkPath::Rect(SkRect::MakeLTRB(10, 10, 20, 20)));
68158

69159
EXPECT_FALSE(path.IsInverseFillType());
160+
EXPECT_FALSE(path.IsConverted());
161+
EXPECT_FALSE(path.GetPath().IsEmpty());
162+
EXPECT_TRUE(path.IsConverted());
70163

71164
bool is_closed = false;
72165
EXPECT_TRUE(path.IsRect(nullptr));
@@ -97,6 +190,10 @@ TEST(DisplayListPath, ConstructFromOval) {
97190
EXPECT_EQ(path.GetSkPath(), SkPath::Oval(SkRect::MakeLTRB(10, 10, 20, 20)));
98191

99192
EXPECT_FALSE(path.IsInverseFillType());
193+
EXPECT_FALSE(path.IsConverted());
194+
EXPECT_FALSE(path.GetPath().IsEmpty());
195+
EXPECT_TRUE(path.IsConverted());
196+
100197
EXPECT_FALSE(path.IsRect(nullptr));
101198
EXPECT_TRUE(path.IsOval(nullptr));
102199
DlRect dl_bounds;
@@ -124,6 +221,9 @@ TEST(DisplayListPath, ConstructFromRRect) {
124221
SkPath::RRect(SkRect::MakeLTRB(10, 10, 20, 20), 1, 2));
125222

126223
EXPECT_FALSE(path.IsInverseFillType());
224+
EXPECT_FALSE(path.IsConverted());
225+
EXPECT_FALSE(path.GetPath().IsEmpty());
226+
EXPECT_TRUE(path.IsConverted());
127227

128228
EXPECT_FALSE(path.IsRect(nullptr));
129229
EXPECT_FALSE(path.IsOval(nullptr));
@@ -157,6 +257,43 @@ TEST(DisplayListPath, ConstructFromPath) {
157257
EXPECT_EQ(path.GetSkPath(), sk_path2);
158258

159259
EXPECT_FALSE(path.IsInverseFillType());
260+
EXPECT_FALSE(path.IsConverted());
261+
EXPECT_FALSE(path.GetPath().IsEmpty());
262+
EXPECT_TRUE(path.IsConverted());
263+
264+
EXPECT_FALSE(path.IsRect(nullptr));
265+
EXPECT_FALSE(path.IsOval(nullptr));
266+
EXPECT_FALSE(path.IsSkRect(nullptr));
267+
EXPECT_FALSE(path.IsSkOval(nullptr));
268+
EXPECT_FALSE(path.IsSkRRect(nullptr));
269+
270+
EXPECT_EQ(path.GetBounds(), DlRect::MakeLTRB(10, 10, 20, 20));
271+
EXPECT_EQ(path.GetSkBounds(), SkRect::MakeLTRB(10, 10, 20, 20));
272+
}
273+
274+
TEST(DisplayListPath, ConstructFromInversePath) {
275+
SkPath sk_path1;
276+
sk_path1.moveTo(10, 10);
277+
sk_path1.lineTo(20, 20);
278+
sk_path1.lineTo(20, 10);
279+
sk_path1.setFillType(SkPathFillType::kInverseWinding);
280+
SkPath sk_path2;
281+
sk_path2.moveTo(10, 10);
282+
sk_path2.lineTo(20, 20);
283+
sk_path2.lineTo(20, 10);
284+
sk_path2.setFillType(SkPathFillType::kInverseWinding);
285+
DlPath path(sk_path1);
286+
287+
ASSERT_EQ(sk_path1, sk_path2);
288+
289+
EXPECT_EQ(path, DlPath(sk_path2));
290+
EXPECT_EQ(path.GetSkPath(), sk_path2);
291+
292+
EXPECT_TRUE(path.IsInverseFillType());
293+
EXPECT_FALSE(path.IsConverted());
294+
EXPECT_FALSE(path.GetPath().IsEmpty());
295+
EXPECT_TRUE(path.IsConverted());
296+
160297
EXPECT_FALSE(path.IsRect(nullptr));
161298
EXPECT_FALSE(path.IsOval(nullptr));
162299
EXPECT_FALSE(path.IsSkRect(nullptr));

0 commit comments

Comments
 (0)