Flutter Engine
 
Loading...
Searching...
No Matches
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
12namespace impeller {
13
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
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
89} // namespace impeller
90
91namespace std {
92
93inline 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_
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 ref_ptr.h:261
std::ostream & operator<<(std::ostream &out, const impeller::Arc &a)
Definition arc.h:141
constexpr bool operator==(const RoundingRadii &rr) const
static constexpr RoundingRadii MakeRadii(Size radii)
constexpr bool AreAllCornersEmpty() const
constexpr bool IsFinite() const
static constexpr RoundingRadii MakeNinePatch(Scalar left, Scalar top, Scalar right, Scalar bottom)
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...
static constexpr RoundingRadii MakeRadius(Scalar radius)
constexpr RoundingRadii operator*(Scalar scale)
constexpr bool AreAllCornersSame(Scalar tolerance=kEhCloseEnough) const
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