Flutter Impeller
uber_sdf_parameters_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 
5 #include "gtest/gtest.h"
8 
9 namespace impeller {
10 namespace testing {
11 
12 TEST(UberSDFParametersTest, MakeFillRect) {
13  auto rect = Rect::MakeLTRB(100, 100, 200, 200);
14  auto params = UberSDFParameters::MakeRect(Color::Red(), rect, std::nullopt);
15 
16  EXPECT_EQ(params.type, UberSDFParameters::Type::kRect);
17  EXPECT_EQ(params.color, Color::Red());
18  EXPECT_EQ(params.center, Point(150, 150));
19  EXPECT_EQ(params.size, Point(50, 50));
20  EXPECT_FALSE(params.stroke.has_value());
21 }
22 
23 TEST(UberSDFParametersTest, MakeStrokeRect) {
24  auto rect = Rect::MakeLTRB(100, 100, 200, 200);
25  StrokeParameters stroke = {.width = 4.0f};
26  auto params = UberSDFParameters::MakeRect(Color::Red(), rect, stroke);
27 
28  EXPECT_EQ(params.type, UberSDFParameters::Type::kRect);
29  EXPECT_EQ(params.color, Color::Red());
30  EXPECT_EQ(params.center, Point(150, 150));
31  EXPECT_EQ(params.size, Point(50, 50));
32  EXPECT_EQ(params.stroke, stroke);
33 }
34 
35 TEST(UberSDFParametersTest, MakeStrokeRectLowMiterLimitBecomesBevel) {
36  auto rect = Rect::MakeLTRB(100, 100, 200, 200);
37  StrokeParameters stroke = {
38  .width = 4.0f, .join = Join::kMiter, .miter_limit = 1.0f};
39  auto params = UberSDFParameters::MakeRect(Color::Red(), rect, stroke);
40 
41  EXPECT_EQ(params.type, UberSDFParameters::Type::kRect);
42  EXPECT_EQ(params.color, Color::Red());
43  EXPECT_EQ(params.center, Point(150, 150));
44  EXPECT_EQ(params.size, Point(50, 50));
45  StrokeParameters expected_stroke = {.width = 4.0f, .join = Join::kBevel};
46  EXPECT_EQ(params.stroke, expected_stroke);
47 }
48 
49 TEST(UberSDFParametersTest, MakeFillCircle) {
50  Point center = {50, 50};
51  auto params =
52  UberSDFParameters::MakeCircle(Color::Red(), center, 10.0f, std::nullopt);
53 
54  EXPECT_EQ(params.type, UberSDFParameters::Type::kCircle);
55  EXPECT_EQ(params.color, Color::Red());
56  EXPECT_EQ(params.center, center);
57  EXPECT_EQ(params.size, Point(10.0f, 10.0f));
58  EXPECT_FALSE(params.stroke.has_value());
59 }
60 
61 TEST(UberSDFParametersTest, MakeStrokeCircle) {
62  Point center = {50, 50};
63  StrokeParameters stroke = {.width = 4.0f};
64  auto params =
65  UberSDFParameters::MakeCircle(Color::Red(), center, 10.0f, stroke);
66 
67  EXPECT_EQ(params.type, UberSDFParameters::Type::kCircle);
68  EXPECT_EQ(params.color, Color::Red());
69  EXPECT_EQ(params.center, center);
70  EXPECT_EQ(params.size, Point(10.0f, 10.0f));
71  EXPECT_EQ(params.stroke, stroke);
72 }
73 
74 TEST(UberSDFParametersTest, MakeFillOval) {
75  Point center = {25, 25};
76  Size size = Size(50, 50);
77  Rect bounds = Rect::MakeOriginSize(Point(), size);
78 
79  auto params = UberSDFParameters::MakeOval(Color::Red(), bounds, std::nullopt);
80 
81  EXPECT_EQ(params.type, UberSDFParameters::Type::kOval);
82  EXPECT_EQ(params.color, Color::Red());
83  EXPECT_EQ(params.center, center);
84  EXPECT_EQ(params.size, Point(size) * 0.5f);
85  EXPECT_FALSE(params.stroke.has_value());
86 }
87 
88 TEST(UberSDFParametersTest, MakeStrokeOval) {
89  Point center = {25, 25};
90  Size size = Size(50, 50);
91  Rect bounds = Rect::MakeOriginSize(Point(), size);
92  StrokeParameters stroke = {.width = 4.0f};
93 
94  auto params = UberSDFParameters::MakeOval(Color::Red(), bounds, stroke);
95 
96  EXPECT_EQ(params.type, UberSDFParameters::Type::kOval);
97  EXPECT_EQ(params.color, Color::Red());
98  EXPECT_EQ(params.center, center);
99  EXPECT_EQ(params.size, Point(size) * 0.5f);
100  EXPECT_EQ(params.stroke, stroke);
101 }
102 
103 TEST(UberSDFParametersTest, MakeRoundedRect) {
104  Rect rect = Rect::MakeXYWH(10, 20, 100, 100);
105  RoundingRadii radii = {
106  .top_left = Size(1.0f, 1.0f),
107  .top_right = Size(2.0f, 2.0f),
108  .bottom_left = Size(3.0f, 3.0f),
109  .bottom_right = Size(4.0f, 4.0f),
110  };
112  /*color=*/Color::Red(), /*rect=*/rect, /*radii=*/radii,
113  /*stroke=*/std::nullopt);
114 
115  EXPECT_EQ(params.type, UberSDFParameters::Type::kRoundedRect);
116  EXPECT_EQ(params.color, Color::Red());
117  EXPECT_EQ(params.center, Point(60, 70));
118  EXPECT_EQ(params.size, Point(50, 50));
119  EXPECT_EQ(params.radii.w, 1.0f);
120  EXPECT_EQ(params.radii.y, 2.0f);
121  EXPECT_EQ(params.radii.z, 3.0f);
122  EXPECT_EQ(params.radii.x, 4.0f);
123  EXPECT_FALSE(params.stroke.has_value());
124 }
125 
126 TEST(UberSDFParametersTest, MakeRoundedSuperellipse) {
127  Rect rect = Rect::MakeXYWH(10, 20, 100, 100);
128  RoundingRadii radii = {
129  .top_left = Size(10.0f, 10.0f),
130  .top_right = Size(10.0f, 10.0f),
131  .bottom_left = Size(10.0f, 10.0f),
132  .bottom_right = Size(10.0f, 10.0f),
133  };
134  auto round_superellipse_params =
137  /*color=*/Color::Red(), /*bounds=*/rect,
138  /*round_superellipse_params=*/round_superellipse_params,
139  /*stroke=*/std::nullopt);
140 
141  EXPECT_EQ(params.type,
143  EXPECT_EQ(params.color, Color::Red());
144  EXPECT_EQ(params.center, Point(60, 70));
145  EXPECT_EQ(params.size, Point(50, 50));
146  EXPECT_FALSE(params.stroke.has_value());
147 
148  EXPECT_EQ(params.radii.x,
149  round_superellipse_params.top_right.top.circle_radius);
150  EXPECT_EQ(params.radii.y,
151  round_superellipse_params.top_right.right.circle_radius);
152 
153  EXPECT_EQ(params.superellipse_degree.x,
154  round_superellipse_params.top_right.top.se_n);
155  EXPECT_EQ(params.superellipse_degree.y,
156  round_superellipse_params.top_right.right.se_n);
157 
158  EXPECT_EQ(params.superellipse_scale.x,
159  round_superellipse_params.top_right.signed_scale.Abs().x);
160  EXPECT_EQ(params.superellipse_scale.y,
161  round_superellipse_params.top_right.signed_scale.Abs().y);
162 }
163 
164 } // namespace testing
165 } // namespace impeller
TEST(AllocationSizeTest, CanCreateTypedAllocations)
TPoint< Scalar > Point
Definition: point.h:426
TSize< Scalar > Size
Definition: size.h:159
static constexpr Color Red()
Definition: color.h:277
static RoundSuperellipseParam MakeBoundsRadii(const Rect &bounds, const RoundingRadii &radii)
A structure to store all of the parameters related to stroking a path or basic geometry object.
constexpr static TRect MakeOriginSize(const TPoint< Type > &origin, const TSize< Type > &size)
Definition: rect.h:144
constexpr static TRect MakeXYWH(Type x, Type y, Type width, Type height)
Definition: rect.h:136
constexpr static TRect MakeLTRB(Type left, Type top, Type right, Type bottom)
Definition: rect.h:129
static UberSDFParameters MakeCircle(Color color, const Point &center, Scalar radius, std::optional< StrokeParameters > stroke)
Creates UberSDFParameters for a circle.
static UberSDFParameters MakeOval(Color color, const Rect &bounds, std::optional< StrokeParameters > stroke)
Creates UberSDFParameters for an Oval.
static UberSDFParameters MakeRoundedRect(Color color, const Rect &rect, const RoundingRadii &radii, std::optional< StrokeParameters > stroke)
Creates UberSDFParameters for a rounded rectangle.
static UberSDFParameters MakeRoundedSuperellipse(Color color, const Rect &bounds, const RoundSuperellipseParam &round_superellipse_params, std::optional< StrokeParameters > stroke)
Creates UberSDFParameters for an asymmetric round superellipse.
static UberSDFParameters MakeRect(Color color, const Rect &rect, std::optional< StrokeParameters > stroke)
Creates UberSDFParameters for a rectangle.