@@ -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+
62152TEST (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