Flutter Impeller
paint_unittests.cc
Go to the documentation of this file.
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 
6 
7 #include "gtest/gtest.h"
8 
9 #include "flutter/display_list/dl_color.h"
10 #include "flutter/display_list/dl_tile_mode.h"
11 #include "flutter/display_list/effects/dl_color_source.h"
13 
14 namespace impeller {
15 namespace testing {
16 
17 TEST(PaintTest, OptionalStrokeWithFill) {
18  Paint paint;
19  paint.style = Paint::Style::kFill;
20  paint.stroke.cap = Cap::kRound;
21  paint.stroke.join = Join::kRound;
22  paint.stroke.width = 20.0f;
23  paint.stroke.miter_limit = 100.0f;
24 
25  EXPECT_FALSE(paint.GetStroke().has_value());
26  // Even though optional stroke wasn't returned, the underlying values
27  // are still in the Paint.
28  EXPECT_EQ(paint.stroke.cap, Cap::kRound);
29  EXPECT_EQ(paint.stroke.join, Join::kRound);
30  EXPECT_EQ(paint.stroke.width, 20.0f);
31  EXPECT_EQ(paint.stroke.miter_limit, 100.0f);
32 }
33 
34 TEST(PaintTest, OptionalStrokeWithStroke) {
35  Paint paint;
37  paint.stroke.cap = Cap::kRound;
38  paint.stroke.join = Join::kRound;
39  paint.stroke.width = 20.0f;
40  paint.stroke.miter_limit = 100.0f;
41 
42  std::optional<StrokeParameters> optional_stroke = paint.GetStroke();
43  EXPECT_TRUE(optional_stroke.has_value());
44  if (optional_stroke.has_value()) { // Test to keep clang-tidy happy.
45  EXPECT_EQ(optional_stroke->cap, Cap::kRound);
46  EXPECT_EQ(optional_stroke->join, Join::kRound);
47  EXPECT_EQ(optional_stroke->width, 20.0f);
48  EXPECT_EQ(optional_stroke->miter_limit, 100.0f);
49  }
50 }
51 
52 TEST(PaintTest, GradientStopConversion) {
53  // Typical gradient.
54  std::vector<flutter::DlColor> colors = {flutter::DlColor::kBlue(),
55  flutter::DlColor::kRed(),
56  flutter::DlColor::kGreen()};
57  std::vector<float> stops = {0.0, 0.5, 1.0};
58  const auto gradient =
59  flutter::DlColorSource::MakeLinear(flutter::DlPoint(0, 0), //
60  flutter::DlPoint(1.0, 1.0), //
61  3, //
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  Paint::ConvertStops(gradient->asLinearGradient(), converted_colors,
71  converted_stops);
72 
73  ASSERT_TRUE(ScalarNearlyEqual(converted_stops[0], 0.0f));
74  ASSERT_TRUE(ScalarNearlyEqual(converted_stops[1], 0.5f));
75  ASSERT_TRUE(ScalarNearlyEqual(converted_stops[2], 1.0f));
76 }
77 
78 TEST(PaintTest, GradientMissing0) {
79  std::vector<flutter::DlColor> colors = {flutter::DlColor::kBlue(),
80  flutter::DlColor::kRed()};
81  std::vector<float> stops = {0.5, 1.0};
82  const auto gradient =
83  flutter::DlColorSource::MakeLinear(flutter::DlPoint(0, 0), //
84  flutter::DlPoint(1.0, 1.0), //
85  2, //
86  colors.data(), //
87  stops.data(), //
88  flutter::DlTileMode::kClamp, //
89  nullptr //
90  );
91 
92  std::vector<Color> converted_colors;
93  std::vector<Scalar> converted_stops;
94  Paint::ConvertStops(gradient->asLinearGradient(), converted_colors,
95  converted_stops);
96 
97  // First color is inserted as blue.
98  ASSERT_TRUE(ScalarNearlyEqual(converted_colors[0].blue, 1.0f));
99  ASSERT_TRUE(ScalarNearlyEqual(converted_stops[0], 0.0f));
100  ASSERT_TRUE(ScalarNearlyEqual(converted_stops[1], 0.5f));
101  ASSERT_TRUE(ScalarNearlyEqual(converted_stops[2], 1.0f));
102 }
103 
104 TEST(PaintTest, GradientMissingLastValue) {
105  std::vector<flutter::DlColor> colors = {flutter::DlColor::kBlue(),
106  flutter::DlColor::kRed()};
107  std::vector<float> stops = {0.0, .5};
108  const auto gradient =
109  flutter::DlColorSource::MakeLinear(flutter::DlPoint(0, 0), //
110  flutter::DlPoint(1.0, 1.0), //
111  2, //
112  colors.data(), //
113  stops.data(), //
114  flutter::DlTileMode::kClamp, //
115  nullptr //
116  );
117 
118  std::vector<Color> converted_colors;
119  std::vector<Scalar> converted_stops;
120  Paint::ConvertStops(gradient->asLinearGradient(), converted_colors,
121  converted_stops);
122 
123  // Last color is inserted as red.
124  ASSERT_TRUE(ScalarNearlyEqual(converted_colors[2].red, 1.0f));
125  ASSERT_TRUE(ScalarNearlyEqual(converted_stops[0], 0.0f));
126  ASSERT_TRUE(ScalarNearlyEqual(converted_stops[1], 0.5f));
127  ASSERT_TRUE(ScalarNearlyEqual(converted_stops[2], 1.0f));
128 }
129 
130 TEST(PaintTest, GradientStopGreaterThan1) {
131  std::vector<flutter::DlColor> colors = {flutter::DlColor::kBlue(),
132  flutter::DlColor::kGreen(),
133  flutter::DlColor::kRed()};
134  std::vector<float> stops = {0.0, 100, 1.0};
135  const auto gradient =
136  flutter::DlColorSource::MakeLinear(flutter::DlPoint(0, 0), //
137  flutter::DlPoint(1.0, 1.0), //
138  3, //
139  colors.data(), //
140  stops.data(), //
141  flutter::DlTileMode::kClamp, //
142  nullptr //
143  );
144 
145  std::vector<Color> converted_colors;
146  std::vector<Scalar> converted_stops;
147  Paint::ConvertStops(gradient->asLinearGradient(), converted_colors,
148  converted_stops);
149 
150  // Value is clamped to 1.0
151  ASSERT_TRUE(ScalarNearlyEqual(converted_stops[0], 0.0f));
152  ASSERT_TRUE(ScalarNearlyEqual(converted_stops[1], 1.0f));
153  ASSERT_TRUE(ScalarNearlyEqual(converted_stops[2], 1.0f));
154 }
155 
156 TEST(PaintTest, GradientConversionNonMonotonic) {
157  std::vector<flutter::DlColor> colors = {
158  flutter::DlColor::kBlue(), flutter::DlColor::kGreen(),
159  flutter::DlColor::kGreen(), flutter::DlColor::kRed()};
160  std::vector<float> stops = {0.0, 0.5, 0.4, 1.0};
161  const auto gradient =
162  flutter::DlColorSource::MakeLinear(flutter::DlPoint(0, 0), //
163  flutter::DlPoint(1.0, 1.0), //
164  4, //
165  colors.data(), //
166  stops.data(), //
167  flutter::DlTileMode::kClamp, //
168  nullptr //
169  );
170 
171  std::vector<Color> converted_colors;
172  std::vector<Scalar> converted_stops;
173  Paint::ConvertStops(gradient->asLinearGradient(), converted_colors,
174  converted_stops);
175 
176  // Value is clamped to 0.5
177  ASSERT_TRUE(ScalarNearlyEqual(converted_stops[0], 0.0f));
178  ASSERT_TRUE(ScalarNearlyEqual(converted_stops[1], 0.5f));
179  ASSERT_TRUE(ScalarNearlyEqual(converted_stops[2], 0.5f));
180  ASSERT_TRUE(ScalarNearlyEqual(converted_stops[3], 1.0f));
181 }
182 
183 } // namespace testing
184 } // namespace impeller
TEST(AllocationSizeTest, CanCreateTypedAllocations)
flutter::DlPoint DlPoint
Definition: dl_dispatcher.h:29
constexpr bool ScalarNearlyEqual(Scalar x, Scalar y, Scalar tolerance=kEhCloseEnough)
Definition: scalar.h:36
std::optional< StrokeParameters > GetStroke() const
Return an optional StrokeParameters if this Paint is a stroked Paint, otherwise return a nullopt.
Definition: paint.h:95
static void ConvertStops(const flutter::DlGradientColorSourceBase *gradient, std::vector< Color > &colors, std::vector< float > &stops)
Convert display list colors + stops into impeller colors and stops, taking care to ensure that the st...
Definition: paint.cc:39
Style style
Definition: paint.h:85
StrokeParameters stroke
Definition: paint.h:84