| 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
8 #include "flutter/impeller/geometry/point.h"
9 #include "flutter/impeller/geometry/rect.h"
10 #include "flutter/impeller/geometry/size.h"
11
12 namespace impeller {
13
14 struct RoundingRadii {
15 Size top_left;
16 Size top_right;
17 Size bottom_left;
18 Size bottom_right;
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() && //
44 bottom_right.IsFinite();
45 }
46
47 constexpr bool AreAllCornersEmpty() const {
48 return top_left.IsEmpty() && //
49 top_right.IsEmpty() && //
50 bottom_left.IsEmpty() && //
51 bottom_right.IsEmpty();
52 }
53
54 constexpr bool AreAllCornersSame(Scalar tolerance = kEhCloseEnough) const {
55 return ScalarNearlyEqual(top_left.width, top_right.width, tolerance) &&
56 ScalarNearlyEqual(top_left.width, bottom_right.width, tolerance) &&
57 ScalarNearlyEqual(top_left.width, bottom_left.width, tolerance) &&
58 ScalarNearlyEqual(top_left.height, top_right.height, tolerance) &&
59 ScalarNearlyEqual(top_left.height, bottom_right.height, tolerance) &&
60 ScalarNearlyEqual(top_left.height, bottom_left.height, 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 && //
85 bottom_right == rr.bottom_right;
86 }
87 };
88
89 } // namespace impeller
90
91 namespace std {
92
93 inline std::ostream& operator<<(std::ostream& out,
94 const impeller::RoundingRadii& rr) {
95 out << "(" //
96 << "ul: " << rr.top_left << ", " //
97 << "ur: " << rr.top_right << ", " //
98 << "ll: " << rr.bottom_left << ", " //
99 << "lr: " << rr.bottom_right //
100 << ")";
101 return out;
102 }
103
104 } // namespace std
105
106 #endif // FLUTTER_IMPELLER_GEOMETRY_ROUNDING_RADII_H_
impeller
Definition: allocation.cc:12
impeller::Scalar
float Scalar
Definition: scalar.h:19
impeller::kEhCloseEnough
constexpr float kEhCloseEnough
Definition: constants.h:57
impeller::Size
TSize< Scalar > Size
Definition: size.h:159
impeller::ScalarNearlyEqual
constexpr bool ScalarNearlyEqual(Scalar x, Scalar y, Scalar tolerance=kEhCloseEnough)
Definition: scalar.h:36
std
Definition: comparable.h:95
std::operator<<
std::ostream & operator<<(std::ostream &out, const impeller::Arc &a)
Definition: arc.h:141
point.h
rect.h
size.h
impeller::RoundingRadii
Definition: rounding_radii.h:14
impeller::RoundingRadii::MakeNinePatch
constexpr static RoundingRadii MakeNinePatch(Scalar left, Scalar top, Scalar right, Scalar bottom)
Definition: rounding_radii.h:28
impeller::RoundingRadii::top_right
Size top_right
Definition: rounding_radii.h:16
impeller::RoundingRadii::bottom_left
Size bottom_left
Definition: rounding_radii.h:17
impeller::RoundingRadii::bottom_right
Size bottom_right
Definition: rounding_radii.h:18
impeller::RoundingRadii::operator==
constexpr bool operator==(const RoundingRadii &rr) const
Definition: rounding_radii.h:81
impeller::RoundingRadii::top_left
Size top_left
Definition: rounding_radii.h:15
impeller::RoundingRadii::AreAllCornersEmpty
constexpr bool AreAllCornersEmpty() const
Definition: rounding_radii.h:47
impeller::RoundingRadii::MakeRadii
constexpr static RoundingRadii MakeRadii(Size radii)
Definition: rounding_radii.h:24
impeller::RoundingRadii::IsFinite
constexpr bool IsFinite() const
Definition: rounding_radii.h:40
impeller::RoundingRadii::Scaled
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...
Definition: rounding_radii.cc:26
impeller::RoundingRadii::operator*
constexpr RoundingRadii operator*(Scalar scale)
Definition: rounding_radii.h:72
impeller::RoundingRadii::AreAllCornersSame
constexpr bool AreAllCornersSame(Scalar tolerance=kEhCloseEnough) const
Definition: rounding_radii.h:54
impeller::RoundingRadii::MakeRadius
constexpr static RoundingRadii MakeRadius(Scalar radius)
Definition: rounding_radii.h:20
impeller::TRect< Scalar >
impeller::TSize< Scalar >
impeller::TSize::height
Type height
Definition: size.h:29
impeller::TSize::width
Type width
Definition: size.h:28
impeller::TSize::IsFinite
IsFinite() const
Definition: size.h:126
impeller::TSize::IsEmpty
constexpr bool IsEmpty() const
Returns true if either of the width or height are 0, negative, or NaN.
Definition: size.h:123