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

Commit 3b53044

Browse files
committed
Add DlPathEffect Unittests
1 parent 9ae0860 commit 3b53044

File tree

7 files changed

+251
-65
lines changed

7 files changed

+251
-65
lines changed

display_list/BUILD.gn

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ source_set("unittests") {
6262
"display_list_complexity_unittests.cc",
6363
"display_list_enum_unittests.cc",
6464
"display_list_mask_filter_unittests.cc",
65+
"display_list_path_effect_unittests.cc",
6566
"display_list_test_utils.cc",
6667
"display_list_test_utils.h",
6768
"display_list_unittests.cc",

display_list/display_list_canvas_unittests.cc

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// Use of this source code is governed by a BSD-style license that can be
33
// found in the LICENSE file.
44

5+
#include <cstddef>
56
#include <memory>
67
#include "flutter/display_list/display_list.h"
78
#include "flutter/display_list/display_list_canvas_dispatcher.h"
@@ -388,7 +389,8 @@ class TestParameters {
388389
NotEquals(ref_attr.getColorSource(), attr.getColorSource())) {
389390
return false;
390391
}
391-
auto skia_path_effect = attr.getPathEffect()->skia_object();
392+
auto skia_path_effect =
393+
attr.getPathEffect() ? attr.getPathEffect()->skia_object() : nullptr;
392394
DisplayListSpecialGeometryFlags geo_flags =
393395
flags_.WithPathEffect(skia_path_effect);
394396
if (flags_.applies_path_effect() && //

display_list/display_list_ops.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,6 @@ struct SetBlendModeOp final : DLOp {
177177
};
178178
DEFINE_SET_CLEAR_SKREF_OP(Blender, blender)
179179
DEFINE_SET_CLEAR_SKREF_OP(ImageFilter, filter)
180-
// DEFINE_SET_CLEAR_SKREF_OP(PathEffect, effect)
181180
#undef DEFINE_SET_CLEAR_SKREF_OP
182181

183182
// Clear: 4 byte header + unused 4 byte payload uses 8 bytes

display_list/display_list_path_effect.h

Lines changed: 31 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ class DlDashPathEffect : public DlPathEffect {
128128

129129
protected:
130130
bool equals_(DlPathEffect const& other) const override {
131-
FML_DCHECK(other.type() == DlPathEffectType::kCorner);
131+
FML_DCHECK(other.type() == DlPathEffectType::kDash);
132132
auto that = static_cast<DlDashPathEffect const*>(&other);
133133
return intervals_ == that->intervals_ && count_ == that->count_ &&
134134
phase_ == that->phase_;
@@ -139,37 +139,6 @@ class DlDashPathEffect : public DlPathEffect {
139139
SkScalar phase_;
140140
};
141141

142-
class DlUnknownPathEffect final : public DlPathEffect {
143-
public:
144-
DlUnknownPathEffect(sk_sp<SkPathEffect> effect)
145-
: sk_path_effect_(std::move(effect)) {}
146-
DlUnknownPathEffect(const DlUnknownPathEffect& effect)
147-
: DlUnknownPathEffect(effect.sk_path_effect_) {}
148-
DlUnknownPathEffect(const DlUnknownPathEffect* effect)
149-
: DlUnknownPathEffect(effect->sk_path_effect_) {}
150-
151-
DlPathEffectType type() const override { return DlPathEffectType::kUnknown; }
152-
size_t size() const override { return sizeof(*this); }
153-
154-
std::shared_ptr<DlPathEffect> shared() const override {
155-
return std::make_shared<DlUnknownPathEffect>(this);
156-
}
157-
158-
sk_sp<SkPathEffect> skia_object() const override { return sk_path_effect_; }
159-
160-
virtual ~DlUnknownPathEffect() = default;
161-
162-
protected:
163-
bool equals_(const DlPathEffect& other) const override {
164-
FML_DCHECK(other.type() == DlPathEffectType::kUnknown);
165-
auto that = static_cast<DlUnknownPathEffect const*>(&other);
166-
return sk_path_effect_ == that->sk_path_effect_;
167-
}
168-
169-
private:
170-
sk_sp<SkPathEffect> sk_path_effect_;
171-
};
172-
173142
class DlDiscretePathEffect : public DlPathEffect {
174143
public:
175144
DlDiscretePathEffect(SkScalar segLength,
@@ -218,6 +187,36 @@ class DlDiscretePathEffect : public DlPathEffect {
218187
uint32_t seedAssist_ = 0;
219188
};
220189

190+
class DlUnknownPathEffect final : public DlPathEffect {
191+
public:
192+
DlUnknownPathEffect(sk_sp<SkPathEffect> effect)
193+
: sk_path_effect_(std::move(effect)) {}
194+
DlUnknownPathEffect(const DlUnknownPathEffect& effect)
195+
: DlUnknownPathEffect(effect.sk_path_effect_) {}
196+
DlUnknownPathEffect(const DlUnknownPathEffect* effect)
197+
: DlUnknownPathEffect(effect->sk_path_effect_) {}
198+
199+
DlPathEffectType type() const override { return DlPathEffectType::kUnknown; }
200+
size_t size() const override { return sizeof(*this); }
201+
202+
std::shared_ptr<DlPathEffect> shared() const override {
203+
return std::make_shared<DlUnknownPathEffect>(this);
204+
}
205+
206+
sk_sp<SkPathEffect> skia_object() const override { return sk_path_effect_; }
207+
208+
virtual ~DlUnknownPathEffect() = default;
209+
210+
protected:
211+
bool equals_(const DlPathEffect& other) const override {
212+
FML_DCHECK(other.type() == DlPathEffectType::kUnknown);
213+
auto that = static_cast<DlUnknownPathEffect const*>(&other);
214+
return sk_path_effect_ == that->sk_path_effect_;
215+
}
216+
217+
private:
218+
sk_sp<SkPathEffect> sk_path_effect_;
219+
};
221220
class DlPairPathEffect : public DlPathEffect {
222221
protected:
223222
DlPairPathEffect(sk_sp<SkPathEffect> pe0, sk_sp<SkPathEffect> pe1)
Lines changed: 210 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,210 @@
1+
// Copyright 2013 The Flutter Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style license that can be
3+
// found in the LICENSE file.
4+
5+
#include "flutter/display_list/display_list_attributes_testing.h"
6+
#include "flutter/display_list/display_list_builder.h"
7+
#include "flutter/display_list/display_list_comparable.h"
8+
#include "flutter/display_list/types.h"
9+
#include "gtest/gtest.h"
10+
#include "include/core/SkPath.h"
11+
12+
namespace flutter {
13+
namespace testing {
14+
15+
const SkScalar TestDashes1[] = {4.0, 2.0};
16+
const SkScalar TestDashes2[] = {1.0, 1.5};
17+
18+
TEST(DisplayListPathEffect, BuilderSetGet) {
19+
DlDashPathEffect dash_path_effect(TestDashes1, 2, 0.0);
20+
DisplayListBuilder builder;
21+
ASSERT_EQ(builder.getPathEffect(), nullptr);
22+
builder.setPathEffect(&dash_path_effect);
23+
ASSERT_NE(builder.getPathEffect(), nullptr);
24+
ASSERT_TRUE(Equals(builder.getPathEffect(),
25+
static_cast<DlPathEffect*>(&dash_path_effect)));
26+
builder.setPathEffect(nullptr);
27+
ASSERT_EQ(builder.getPathEffect(), nullptr);
28+
}
29+
30+
TEST(DisplayListPathEffect, FromSkiaNullPathEffect) {
31+
std::shared_ptr<DlPathEffect> path_effect = DlPathEffect::From(nullptr);
32+
ASSERT_EQ(path_effect, nullptr);
33+
ASSERT_EQ(path_effect.get(), nullptr);
34+
}
35+
36+
TEST(DisplayListPathEffect, FromSkiaPathEffect) {
37+
sk_sp<SkPathEffect> sk_path_effect =
38+
SkDashPathEffect::Make(TestDashes2, 2, 0.0);
39+
std::shared_ptr<DlPathEffect> dl_path_effect =
40+
DlPathEffect::From(sk_path_effect);
41+
42+
ASSERT_EQ(dl_path_effect->type(), DlPathEffectType::kUnknown);
43+
// We cannot recapture the dash parameters from an SkDashPathEffect
44+
ASSERT_EQ(dl_path_effect->asDash(), nullptr);
45+
ASSERT_EQ(dl_path_effect->skia_object(), sk_path_effect);
46+
}
47+
48+
TEST(DisplayListPathEffect, EffectShared) {
49+
DlDashPathEffect effect(TestDashes2, 2, 0.0);
50+
ASSERT_NE(effect.shared().get(), &effect);
51+
ASSERT_EQ(*effect.shared(), effect);
52+
}
53+
54+
TEST(DisplayListPathEffect, DashEffectAsDash) {
55+
DlDashPathEffect effect(TestDashes2, 2, 0.0);
56+
ASSERT_NE(effect.asDash(), nullptr);
57+
ASSERT_EQ(effect.asDash(), &effect);
58+
}
59+
60+
TEST(DisplayListPathEffect, DashEffectEquals) {
61+
DlDashPathEffect effect1(TestDashes2, 2, 0.0);
62+
DlDashPathEffect effect2(TestDashes2, 2, 0.0);
63+
TestEquals(effect1, effect2);
64+
}
65+
66+
TEST(DisplayListPathEffect, BlurNotEquals) {
67+
DlDashPathEffect effect1(TestDashes1, 2, 0.0);
68+
DlDashPathEffect effect2(TestDashes2, 2, 0.0);
69+
DlDashPathEffect effect3(TestDashes2, 3, 0.0);
70+
TestNotEquals(effect1, effect2, "intervals differs");
71+
TestNotEquals(effect2, effect3, "phase differs");
72+
}
73+
74+
TEST(DisplayListPathEffect, UnknownConstructor) {
75+
DlUnknownPathEffect path_effect(SkDashPathEffect::Make(TestDashes1, 2, 0.0));
76+
}
77+
78+
TEST(DisplayListPathEffect, UnknownShared) {
79+
DlUnknownPathEffect path_effect(SkDashPathEffect::Make(TestDashes1, 2, 0.0));
80+
ASSERT_NE(path_effect.shared().get(), &path_effect);
81+
ASSERT_EQ(*path_effect.shared(), path_effect);
82+
}
83+
84+
TEST(DisplayListPathEffect, UnknownContents) {
85+
sk_sp<SkPathEffect> sk_effect = SkDashPathEffect::Make(TestDashes1, 2, 0.0);
86+
DlUnknownPathEffect effect(sk_effect);
87+
ASSERT_EQ(effect.skia_object(), sk_effect);
88+
ASSERT_EQ(effect.skia_object().get(), sk_effect.get());
89+
}
90+
91+
TEST(DisplayListPathEffect, UnknownEquals) {
92+
sk_sp<SkPathEffect> sk_effect = SkDashPathEffect::Make(TestDashes1, 2, 0.0);
93+
DlUnknownPathEffect effect1(sk_effect);
94+
DlUnknownPathEffect effect2(sk_effect);
95+
TestEquals(effect1, effect1);
96+
}
97+
98+
TEST(DisplayListPathEffect, UnknownNotEquals) {
99+
// Even though the effect is the same, it is a different instance
100+
// and we cannot currently tell them apart because the Skia
101+
// DashEffect::Make objects do not implement ==
102+
DlUnknownPathEffect path_effect1(SkDashPathEffect::Make(TestDashes1, 2, 0.0));
103+
DlUnknownPathEffect path_effect2(SkDashPathEffect::Make(TestDashes1, 2, 0.0));
104+
TestNotEquals(path_effect1, path_effect2,
105+
"SkDashPathEffect instance differs");
106+
}
107+
108+
void testEquals(DlPathEffect* a, DlPathEffect* b) {
109+
// a and b have the same nullness or values
110+
ASSERT_TRUE(Equals(a, b));
111+
ASSERT_FALSE(NotEquals(a, b));
112+
ASSERT_TRUE(Equals(b, a));
113+
ASSERT_FALSE(NotEquals(b, a));
114+
}
115+
116+
void testNotEquals(DlPathEffect* a, DlPathEffect* b) {
117+
// a and b do not have the same nullness or values
118+
ASSERT_FALSE(Equals(a, b));
119+
ASSERT_TRUE(NotEquals(a, b));
120+
ASSERT_FALSE(Equals(b, a));
121+
ASSERT_TRUE(NotEquals(b, a));
122+
}
123+
124+
void testEquals(std::shared_ptr<const DlPathEffect> a, DlPathEffect* b) {
125+
// a and b have the same nullness or values
126+
ASSERT_TRUE(Equals(a, b));
127+
ASSERT_FALSE(NotEquals(a, b));
128+
ASSERT_TRUE(Equals(b, a));
129+
ASSERT_FALSE(NotEquals(b, a));
130+
}
131+
132+
void testNotEquals(std::shared_ptr<const DlPathEffect> a, DlPathEffect* b) {
133+
// a and b do not have the same nullness or values
134+
ASSERT_FALSE(Equals(a, b));
135+
ASSERT_TRUE(NotEquals(a, b));
136+
ASSERT_FALSE(Equals(b, a));
137+
ASSERT_TRUE(NotEquals(b, a));
138+
}
139+
140+
void testEquals(std::shared_ptr<const DlPathEffect> a,
141+
std::shared_ptr<const DlPathEffect> b) {
142+
// a and b have the same nullness or values
143+
ASSERT_TRUE(Equals(a, b));
144+
ASSERT_FALSE(NotEquals(a, b));
145+
ASSERT_TRUE(Equals(b, a));
146+
ASSERT_FALSE(NotEquals(b, a));
147+
}
148+
149+
void testNotEquals(std::shared_ptr<const DlPathEffect> a,
150+
std::shared_ptr<const DlPathEffect> b) {
151+
// a and b do not have the same nullness or values
152+
ASSERT_FALSE(Equals(a, b));
153+
ASSERT_TRUE(NotEquals(a, b));
154+
ASSERT_FALSE(Equals(b, a));
155+
ASSERT_TRUE(NotEquals(b, a));
156+
}
157+
158+
TEST(DisplayListPathEffect, ComparableTemplates) {
159+
DlDashPathEffect effect1(TestDashes1, 2, 0.0);
160+
DlDashPathEffect effect2(TestDashes1, 2, 0.0);
161+
DlDashPathEffect effect3(TestDashes2, 3, 0.0);
162+
std::shared_ptr<DlPathEffect> shared_null;
163+
164+
// null to null
165+
testEquals(nullptr, nullptr);
166+
testEquals(shared_null, nullptr);
167+
testEquals(shared_null, shared_null);
168+
169+
// ptr to null
170+
testNotEquals(&effect1, nullptr);
171+
testNotEquals(&effect2, nullptr);
172+
testNotEquals(&effect3, nullptr);
173+
174+
// shared_ptr to null and shared_null to ptr
175+
testNotEquals(effect1.shared(), nullptr);
176+
testNotEquals(effect2.shared(), nullptr);
177+
testNotEquals(effect3.shared(), nullptr);
178+
testNotEquals(shared_null, &effect1);
179+
testNotEquals(shared_null, &effect2);
180+
testNotEquals(shared_null, &effect3);
181+
182+
// ptr to ptr
183+
testEquals(&effect1, &effect1);
184+
testEquals(&effect1, &effect2);
185+
testEquals(&effect3, &effect3);
186+
testEquals(&effect2, &effect2);
187+
188+
// shared_ptr to ptr
189+
testEquals(effect1.shared(), &effect1);
190+
testEquals(effect1.shared(), &effect2);
191+
testEquals(effect2.shared(), &effect2);
192+
testEquals(effect3.shared(), &effect3);
193+
testNotEquals(effect1.shared(), &effect3);
194+
testNotEquals(effect2.shared(), &effect3);
195+
testNotEquals(effect3.shared(), &effect1);
196+
testNotEquals(effect3.shared(), &effect2);
197+
198+
// shared_ptr to shared_ptr
199+
testEquals(effect1.shared(), effect1.shared());
200+
testEquals(effect1.shared(), effect2.shared());
201+
testEquals(effect2.shared(), effect2.shared());
202+
testEquals(effect3.shared(), effect3.shared());
203+
testNotEquals(effect1.shared(), effect3.shared());
204+
testNotEquals(effect2.shared(), effect3.shared());
205+
testNotEquals(effect3.shared(), effect1.shared());
206+
testNotEquals(effect3.shared(), effect2.shared());
207+
}
208+
209+
} // namespace testing
210+
} // namespace flutter

display_list/display_list_unittests.cc

Lines changed: 5 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
// Use of this source code is governed by a BSD-style license that can be
33
// found in the LICENSE file.
44

5-
#include <memory>
5+
#include <cstddef>
66
#include "flutter/display_list/display_list.h"
77
#include "flutter/display_list/display_list_builder.h"
88
#include "flutter/display_list/display_list_canvas_recorder.h"
@@ -137,10 +137,8 @@ static const DlBlendColorFilter TestBlendColorFilter3(SK_ColorRED,
137137
SkBlendMode::kDstIn);
138138
static const DlMatrixColorFilter TestMatrixColorFilter1(rotate_color_matrix);
139139
static const DlMatrixColorFilter TestMatrixColorFilter2(invert_color_matrix);
140-
static const std::shared_ptr<DlPathEffect> TestPathEffect1 =
141-
DlDashPathEffect::Make(TestDashes1, 2, 0.0f);
142-
static const std::shared_ptr<DlPathEffect> TestPathEffect2 =
143-
DlDashPathEffect::Make(TestDashes2, 2, 0.0f);
140+
static const DlDashPathEffect TestPathEffect1(TestDashes1, 2, 0.0f);
141+
static const DlDashPathEffect TestPathEffect2(TestDashes2, 2, 0.0f);
144142
static const DlBlurMaskFilter TestMaskFilter1(kNormal_SkBlurStyle, 3.0);
145143
static const DlBlurMaskFilter TestMaskFilter2(kNormal_SkBlurStyle, 5.0);
146144
static const DlBlurMaskFilter TestMaskFilter3(kSolid_SkBlurStyle, 3.0);
@@ -375,8 +373,8 @@ std::vector<DisplayListInvocationGroup> allGroups = {
375373
}
376374
},
377375
{ "SetPathEffect", {
378-
{0, 16, 0, 0, [](DisplayListBuilder& b) {b.setPathEffect(TestPathEffect1.get());}},
379-
{0, 16, 0, 0, [](DisplayListBuilder& b) {b.setPathEffect(TestPathEffect2.get());}},
376+
{0, 32, 0, 0, [](DisplayListBuilder& b) {b.setPathEffect(&TestPathEffect1);}},
377+
{0, 32, 0, 0, [](DisplayListBuilder& b) {b.setPathEffect(&TestPathEffect2);}},
380378
{0, 0, 0, 0, [](DisplayListBuilder& b) {b.setPathEffect(nullptr);}},
381379
}
382380
},
@@ -1301,29 +1299,6 @@ TEST(DisplayList, DisplayListBlenderRefHandling) {
13011299
ASSERT_TRUE(tester.ref_is_unique());
13021300
}
13031301

1304-
TEST(DisplayList, DisplayListPathEffectRefHandling) {
1305-
class PathEffectRefTester : public virtual AttributeRefTester {
1306-
public:
1307-
void setRefToPaint(SkPaint& paint) const override {
1308-
paint.setPathEffect(path_effect->skia_object());
1309-
}
1310-
void setRefToDisplayList(DisplayListBuilder& builder) const override {
1311-
builder.setPathEffect(path_effect.get());
1312-
}
1313-
bool ref_is_unique() const override {
1314-
return path_effect->skia_object()->unique();
1315-
}
1316-
1317-
private:
1318-
std::shared_ptr<DlPathEffect> path_effect =
1319-
DlDashPathEffect::Make(TestDashes1, 2, 0.0);
1320-
};
1321-
1322-
PathEffectRefTester tester;
1323-
tester.test();
1324-
ASSERT_TRUE(tester.ref_is_unique());
1325-
}
1326-
13271302
TEST(DisplayList, DisplayListFullPerspectiveTransformHandling) {
13281303
// SkM44 constructor takes row-major order
13291304
SkM44 sk_matrix = SkM44(

0 commit comments

Comments
 (0)