Flutter Impeller
rounding_radii.h
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 #ifndef FLUTTER_IMPELLER_GEOMETRY_ROUNDING_RADII_H_
6 #define FLUTTER_IMPELLER_GEOMETRY_ROUNDING_RADII_H_
7 
11 
12 namespace impeller {
13 
14 struct RoundingRadii {
19 
20  constexpr static RoundingRadii MakeRadius(Scalar radius) {
21  return {Size(radius), Size(radius), Size(radius), Size(radius)};
22  }
23 
24  constexpr static RoundingRadii MakeRadii(Size radii) {
25  return {radii, radii, radii, radii};
26  }
27 
28  constexpr static RoundingRadii MakeNinePatch(Scalar left,
29  Scalar top,
30  Scalar right,
31  Scalar bottom) {
32  return {
33  .top_left = Size{left, top},
34  .top_right = Size{right, top},
35  .bottom_left = Size(left, bottom),
36  .bottom_right = Size(right, bottom),
37  };
38  }
39 
40  constexpr bool IsFinite() const {
41  return top_left.IsFinite() && //
42  top_right.IsFinite() && //
43  bottom_left.IsFinite() && //
45  }
46 
47  constexpr bool AreAllCornersEmpty() const {
48  return top_left.IsEmpty() && //
49  top_right.IsEmpty() && //
50  bottom_left.IsEmpty() && //
52  }
53 
54  constexpr bool AreAllCornersSame(Scalar tolerance = kEhCloseEnough) const {
55  return ScalarNearlyEqual(top_left.width, top_right.width, tolerance) &&
61  }
62 
63  /// @brief Returns a scaled copy of this object, ensuring that the sum of the
64  /// corner radii on each side does not exceed the width or height of
65  /// the given bounds.
66  ///
67  /// See the [Skia scaling
68  /// implementation](https://github.com/google/skia/blob/main/src/core/SkRRect.cpp)
69  /// for more details.
70  RoundingRadii Scaled(const Rect& bounds) const;
71 
72  constexpr inline RoundingRadii operator*(Scalar scale) {
73  return {
74  .top_left = top_left * scale,
75  .top_right = top_right * scale,
76  .bottom_left = bottom_left * scale,
77  .bottom_right = bottom_right * scale,
78  };
79  }
80 
81  [[nodiscard]] constexpr bool operator==(const RoundingRadii& rr) const {
82  return top_left == rr.top_left && //
83  top_right == rr.top_right && //
84  bottom_left == rr.bottom_left && //
86  }
87 
88  [[nodiscard]] constexpr bool operator!=(const RoundingRadii& rr) const {
89  return !(*this == rr);
90  }
91 };
92 
93 } // namespace impeller
94 
95 namespace std {
96 
97 inline std::ostream& operator<<(std::ostream& out,
98  const impeller::RoundingRadii& rr) {
99  out << "(" //
100  << "ul: " << rr.top_left << ", " //
101  << "ur: " << rr.top_right << ", " //
102  << "ll: " << rr.bottom_left << ", " //
103  << "lr: " << rr.bottom_right //
104  << ")";
105  return out;
106 }
107 
108 } // namespace std
109 
110 #endif // FLUTTER_IMPELLER_GEOMETRY_ROUNDING_RADII_H_
float Scalar
Definition: scalar.h:19
constexpr float kEhCloseEnough
Definition: constants.h:57
TSize< Scalar > Size
Definition: size.h:159
constexpr bool ScalarNearlyEqual(Scalar x, Scalar y, Scalar tolerance=kEhCloseEnough)
Definition: scalar.h:36
Definition: comparable.h:95
std::ostream & operator<<(std::ostream &out, const impeller::Arc &a)
Definition: arc.h:141
constexpr static RoundingRadii MakeNinePatch(Scalar left, Scalar top, Scalar right, Scalar bottom)
constexpr bool operator==(const RoundingRadii &rr) const
constexpr bool AreAllCornersEmpty() const
constexpr static RoundingRadii MakeRadii(Size radii)
constexpr bool IsFinite() const
RoundingRadii Scaled(const Rect &bounds) const
Returns a scaled copy of this object, ensuring that the sum of the corner radii on each side does not...
constexpr bool operator!=(const RoundingRadii &rr) const
constexpr RoundingRadii operator*(Scalar scale)
constexpr bool AreAllCornersSame(Scalar tolerance=kEhCloseEnough) const
constexpr static RoundingRadii MakeRadius(Scalar radius)
Type height
Definition: size.h:29
Type width
Definition: size.h:28
IsFinite() const
Definition: size.h:126
constexpr bool IsEmpty() const
Returns true if either of the width or height are 0, negative, or NaN.
Definition: size.h:123