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 " display_list/dl_color.h"
6+ #include " display_list/dl_tile_mode.h"
57#include " flutter/testing/testing.h"
68#include " impeller/display_list/skia_conversions.h"
79#include " impeller/geometry/scalar.h"
@@ -23,5 +25,136 @@ TEST(SkiaConversionsTest, ToColor) {
2325 ASSERT_TRUE (ScalarNearlyEqual (converted_color.blue , 0x20 * (1 .0f / 255 )));
2426}
2527
28+ TEST (SkiaConversionsTest, GradientStopConversion) {
29+ // Typical gradient.
30+ std::vector<flutter::DlColor> colors = {flutter::DlColor::kBlue (),
31+ flutter::DlColor::kRed (),
32+ flutter::DlColor::kGreen ()};
33+ std::vector<float > stops = {0.0 , 0.5 , 1.0 };
34+ const auto gradient =
35+ flutter::DlColorSource::MakeLinear (SkPoint::Make (0 , 0 ), //
36+ SkPoint::Make (1.0 , 1.0 ), //
37+ 3 , //
38+ colors.data (), //
39+ stops.data (), //
40+ flutter::DlTileMode::kClamp , //
41+ nullptr //
42+ );
43+
44+ std::vector<Color> converted_colors;
45+ std::vector<Scalar> converted_stops;
46+ skia_conversions::ConvertStops (gradient.get (), converted_colors,
47+ converted_stops);
48+
49+ ASSERT_TRUE (ScalarNearlyEqual (converted_stops[0 ], 0 .0f ));
50+ ASSERT_TRUE (ScalarNearlyEqual (converted_stops[1 ], 0 .5f ));
51+ ASSERT_TRUE (ScalarNearlyEqual (converted_stops[2 ], 1 .0f ));
52+ }
53+
54+ TEST (SkiaConversionsTest, GradientMissing0) {
55+ std::vector<flutter::DlColor> colors = {flutter::DlColor::kBlue (),
56+ flutter::DlColor::kRed ()};
57+ std::vector<float > stops = {0.5 , 1.0 };
58+ const auto gradient =
59+ flutter::DlColorSource::MakeLinear (SkPoint::Make (0 , 0 ), //
60+ SkPoint::Make (1.0 , 1.0 ), //
61+ 2 , //
62+ colors.data (), //
63+ stops.data (), //
64+ flutter::DlTileMode::kClamp , //
65+ nullptr //
66+ );
67+
68+ std::vector<Color> converted_colors;
69+ std::vector<Scalar> converted_stops;
70+ skia_conversions::ConvertStops (gradient.get (), converted_colors,
71+ converted_stops);
72+
73+ // First color is inserted as blue.
74+ ASSERT_TRUE (ScalarNearlyEqual (converted_colors[0 ].blue , 1 .0f ));
75+ ASSERT_TRUE (ScalarNearlyEqual (converted_stops[0 ], 0 .0f ));
76+ ASSERT_TRUE (ScalarNearlyEqual (converted_stops[1 ], 0 .5f ));
77+ ASSERT_TRUE (ScalarNearlyEqual (converted_stops[2 ], 1 .0f ));
78+ }
79+
80+ TEST (SkiaConversionsTest, GradientMissingLastValue) {
81+ std::vector<flutter::DlColor> colors = {flutter::DlColor::kBlue (),
82+ flutter::DlColor::kRed ()};
83+ std::vector<float > stops = {0.0 , .5 };
84+ const auto gradient =
85+ flutter::DlColorSource::MakeLinear (SkPoint::Make (0 , 0 ), //
86+ SkPoint::Make (1.0 , 1.0 ), //
87+ 2 , //
88+ colors.data (), //
89+ stops.data (), //
90+ flutter::DlTileMode::kClamp , //
91+ nullptr //
92+ );
93+
94+ std::vector<Color> converted_colors;
95+ std::vector<Scalar> converted_stops;
96+ skia_conversions::ConvertStops (gradient.get (), converted_colors,
97+ converted_stops);
98+
99+ // Last color is inserted as red.
100+ ASSERT_TRUE (ScalarNearlyEqual (converted_colors[2 ].red , 1 .0f ));
101+ ASSERT_TRUE (ScalarNearlyEqual (converted_stops[0 ], 0 .0f ));
102+ ASSERT_TRUE (ScalarNearlyEqual (converted_stops[1 ], 0 .5f ));
103+ ASSERT_TRUE (ScalarNearlyEqual (converted_stops[2 ], 1 .0f ));
104+ }
105+
106+ TEST (SkiaConversionsTest, GradientStopGreaterThan1) {
107+ std::vector<flutter::DlColor> colors = {flutter::DlColor::kBlue (),
108+ flutter::DlColor::kGreen (),
109+ flutter::DlColor::kRed ()};
110+ std::vector<float > stops = {0.0 , 100 , 1.0 };
111+ const auto gradient =
112+ flutter::DlColorSource::MakeLinear (SkPoint::Make (0 , 0 ), //
113+ SkPoint::Make (1.0 , 1.0 ), //
114+ 3 , //
115+ colors.data (), //
116+ stops.data (), //
117+ flutter::DlTileMode::kClamp , //
118+ nullptr //
119+ );
120+
121+ std::vector<Color> converted_colors;
122+ std::vector<Scalar> converted_stops;
123+ skia_conversions::ConvertStops (gradient.get (), converted_colors,
124+ converted_stops);
125+
126+ // Value is clamped to 1.0
127+ ASSERT_TRUE (ScalarNearlyEqual (converted_stops[0 ], 0 .0f ));
128+ ASSERT_TRUE (ScalarNearlyEqual (converted_stops[1 ], 1 .0f ));
129+ ASSERT_TRUE (ScalarNearlyEqual (converted_stops[2 ], 1 .0f ));
130+ }
131+
132+ TEST (SkiaConversionsTest, GradientConversionNonMonotonic) {
133+ std::vector<flutter::DlColor> colors = {
134+ flutter::DlColor::kBlue (), flutter::DlColor::kGreen (),
135+ flutter::DlColor::kGreen (), flutter::DlColor::kRed ()};
136+ std::vector<float > stops = {0.0 , 0.5 , 0.4 , 1.0 };
137+ const auto gradient =
138+ flutter::DlColorSource::MakeLinear (SkPoint::Make (0 , 0 ), //
139+ SkPoint::Make (1.0 , 1.0 ), //
140+ 4 , //
141+ colors.data (), //
142+ stops.data (), //
143+ flutter::DlTileMode::kClamp , //
144+ nullptr //
145+ );
146+
147+ std::vector<Color> converted_colors;
148+ std::vector<Scalar> converted_stops;
149+ skia_conversions::ConvertStops (gradient.get (), converted_colors,
150+ converted_stops);
151+
152+ // Value is clamped to 0.5
153+ ASSERT_TRUE (ScalarNearlyEqual (converted_stops[0 ], 0 .0f ));
154+ ASSERT_TRUE (ScalarNearlyEqual (converted_stops[1 ], 0 .5f ));
155+ ASSERT_TRUE (ScalarNearlyEqual (converted_stops[2 ], 0 .5f ));
156+ ASSERT_TRUE (ScalarNearlyEqual (converted_stops[3 ], 1 .0f ));
157+ }
158+
26159} // namespace testing
27160} // namespace impeller
0 commit comments