libcamera v0.0.0+3240-f2a18172-dirty (2022-05-13T19:42:47+00:00)
Supporting cameras in Linux since 2019
geometry.h
Go to the documentation of this file.
1/* SPDX-License-Identifier: LGPL-2.1-or-later */
2/*
3 * Copyright (C) 2019, Google Inc.
4 *
5 * geometry.h - Geometry-related classes
6 */
7
8#ifndef __LIBCAMERA_GEOMETRY_H__
9#define __LIBCAMERA_GEOMETRY_H__
10
11#include <algorithm>
12#include <string>
13
14#include <libcamera/compiler.h>
15
16namespace libcamera {
17
18class Rectangle;
19
20class Point
21{
22public:
23 constexpr Point()
24 : x(0), y(0)
25 {
26 }
27
28 constexpr Point(int xpos, int ypos)
29 : x(xpos), y(ypos)
30 {
31 }
32
33 int x;
34 int y;
35
36 const std::string toString() const;
37
38 constexpr Point operator-() const
39 {
40 return { -x, -y };
41 }
42};
43
44bool operator==(const Point &lhs, const Point &rhs);
45static inline bool operator!=(const Point &lhs, const Point &rhs)
46{
47 return !(lhs == rhs);
48}
49
50class Size
51{
52public:
53 constexpr Size()
54 : Size(0, 0)
55 {
56 }
57
58 constexpr Size(unsigned int w, unsigned int h)
59 : width(w), height(h)
60 {
61 }
62
63 unsigned int width;
64 unsigned int height;
65
66 bool isNull() const { return !width && !height; }
67 const std::string toString() const;
68
69 Size &alignDownTo(unsigned int hAlignment, unsigned int vAlignment)
70 {
71 width = width / hAlignment * hAlignment;
72 height = height / vAlignment * vAlignment;
73 return *this;
74 }
75
76 Size &alignUpTo(unsigned int hAlignment, unsigned int vAlignment)
77 {
78 width = (width + hAlignment - 1) / hAlignment * hAlignment;
79 height = (height + vAlignment - 1) / vAlignment * vAlignment;
80 return *this;
81 }
82
83 Size &boundTo(const Size &bound)
84 {
85 width = std::min(width, bound.width);
86 height = std::min(height, bound.height);
87 return *this;
88 }
89
90 Size &expandTo(const Size &expand)
91 {
92 width = std::max(width, expand.width);
93 height = std::max(height, expand.height);
94 return *this;
95 }
96
97 Size &growBy(const Size &margins)
98 {
99 width += margins.width;
100 height += margins.height;
101 return *this;
102 }
103
104 Size &shrinkBy(const Size &margins)
105 {
106 width = width > margins.width ? width - margins.width : 0;
107 height = height > margins.height ? height - margins.height : 0;
108 return *this;
109 }
110
111 __nodiscard constexpr Size alignedDownTo(unsigned int hAlignment,
112 unsigned int vAlignment) const
113 {
114 return {
115 width / hAlignment * hAlignment,
116 height / vAlignment * vAlignment
117 };
118 }
119
120 __nodiscard constexpr Size alignedUpTo(unsigned int hAlignment,
121 unsigned int vAlignment) const
122 {
123 return {
124 (width + hAlignment - 1) / hAlignment * hAlignment,
125 (height + vAlignment - 1) / vAlignment * vAlignment
126 };
127 }
128
129 __nodiscard constexpr Size boundedTo(const Size &bound) const
130 {
131 return {
132 std::min(width, bound.width),
133 std::min(height, bound.height)
134 };
135 }
136
137 __nodiscard constexpr Size expandedTo(const Size &expand) const
138 {
139 return {
140 std::max(width, expand.width),
141 std::max(height, expand.height)
142 };
143 }
144
145 __nodiscard constexpr Size grownBy(const Size &margins) const
146 {
147 return {
148 width + margins.width,
149 height + margins.height
150 };
151 }
152
153 __nodiscard constexpr Size shrunkBy(const Size &margins) const
154 {
155 return {
156 width > margins.width ? width - margins.width : 0,
157 height > margins.height ? height - margins.height : 0
158 };
159 }
160
161 __nodiscard Size boundedToAspectRatio(const Size &ratio) const;
162 __nodiscard Size expandedToAspectRatio(const Size &ratio) const;
163
164 __nodiscard Rectangle centeredTo(const Point &center) const;
165
166 Size operator*(float factor) const;
167 Size operator/(float factor) const;
168
169 Size &operator*=(float factor);
170 Size &operator/=(float factor);
171};
172
173bool operator==(const Size &lhs, const Size &rhs);
174bool operator<(const Size &lhs, const Size &rhs);
175
176static inline bool operator!=(const Size &lhs, const Size &rhs)
177{
178 return !(lhs == rhs);
179}
180
181static inline bool operator<=(const Size &lhs, const Size &rhs)
182{
183 return lhs < rhs || lhs == rhs;
184}
185
186static inline bool operator>(const Size &lhs, const Size &rhs)
187{
188 return !(lhs <= rhs);
189}
190
191static inline bool operator>=(const Size &lhs, const Size &rhs)
192{
193 return !(lhs < rhs);
194}
195
197{
198public:
200 : hStep(0), vStep(0)
201 {
202 }
203
204 SizeRange(const Size &size)
205 : min(size), max(size), hStep(1), vStep(1)
206 {
207 }
208
209 SizeRange(const Size &minSize, const Size &maxSize)
210 : min(minSize), max(maxSize), hStep(1), vStep(1)
211 {
212 }
213
214 SizeRange(const Size &minSize, const Size &maxSize,
215 unsigned int hstep, unsigned int vstep)
216 : min(minSize), max(maxSize), hStep(hstep), vStep(vstep)
217 {
218 }
219
220 bool contains(const Size &size) const;
221
222 std::string toString() const;
223
226 unsigned int hStep;
227 unsigned int vStep;
228};
229
230bool operator==(const SizeRange &lhs, const SizeRange &rhs);
231static inline bool operator!=(const SizeRange &lhs, const SizeRange &rhs)
232{
233 return !(lhs == rhs);
234}
235
237{
238public:
239 constexpr Rectangle()
240 : Rectangle(0, 0, 0, 0)
241 {
242 }
243
244 constexpr Rectangle(int xpos, int ypos, const Size &size)
245 : x(xpos), y(ypos), width(size.width), height(size.height)
246 {
247 }
248
249 constexpr Rectangle(int xpos, int ypos, unsigned int w, unsigned int h)
250 : x(xpos), y(ypos), width(w), height(h)
251 {
252 }
253
254 constexpr explicit Rectangle(const Size &size)
255 : x(0), y(0), width(size.width), height(size.height)
256 {
257 }
258
259 int x;
260 int y;
261 unsigned int width;
262 unsigned int height;
263
264 bool isNull() const { return !width && !height; }
265 const std::string toString() const;
266
267 Point center() const;
268
269 Size size() const
270 {
271 return { width, height };
272 }
273
275 {
276 return { x, y };
277 }
278
279 Rectangle &scaleBy(const Size &numerator, const Size &denominator);
280 Rectangle &translateBy(const Point &point);
281
282 __nodiscard Rectangle boundedTo(const Rectangle &bound) const;
283 __nodiscard Rectangle enclosedIn(const Rectangle &boundary) const;
284 __nodiscard Rectangle scaledBy(const Size &numerator,
285 const Size &denominator) const;
286 __nodiscard Rectangle translatedBy(const Point &point) const;
287};
288
289bool operator==(const Rectangle &lhs, const Rectangle &rhs);
290static inline bool operator!=(const Rectangle &lhs, const Rectangle &rhs)
291{
292 return !(lhs == rhs);
293}
294
295} /* namespace libcamera */
296
297#endif /* __LIBCAMERA_GEOMETRY_H__ */
Describe a point in two-dimensional space.
Definition: geometry.h:21
int y
The y-coordinate of the Point.
Definition: geometry.h:34
constexpr Point()
Construct a Point with x and y set to 0.
Definition: geometry.h:23
constexpr Point operator-() const
Negate a Point by negating both its x and y coordinates.
Definition: geometry.h:38
int x
The x-coordinate of the Point.
Definition: geometry.h:33
constexpr Point(int xpos, int ypos)
Construct a Point at given xpos and ypos values.
Definition: geometry.h:28
const std::string toString() const
Assemble and return a string describing the point.
Definition: geometry.cpp:56
Describe a rectangle's position and dimensions.
Definition: geometry.h:237
Rectangle & scaleBy(const Size &numerator, const Size &denominator)
Apply a non-uniform rational scaling in place to this Rectangle.
Definition: geometry.cpp:665
int y
The vertical coordinate of the rectangle's top-left corner.
Definition: geometry.h:260
Point center() const
Retrieve the center point of this rectangle.
Definition: geometry.cpp:637
__nodiscard Rectangle translatedBy(const Point &point) const
Translate a Rectangle by the given amounts.
Definition: geometry.cpp:778
unsigned int height
The distance between the top and bottom sides.
Definition: geometry.h:262
constexpr Rectangle(const Size &size)
Construct a Rectangle of size with its top left corner located at (0,0)
Definition: geometry.h:254
constexpr Rectangle(int xpos, int ypos, const Size &size)
Construct a Rectangle with the given position and size.
Definition: geometry.h:244
const std::string toString() const
Assemble and return a string describing the rectangle.
Definition: geometry.cpp:624
constexpr Rectangle(int xpos, int ypos, unsigned int w, unsigned int h)
Construct a Rectangle with the given position and size.
Definition: geometry.h:249
Point topLeft() const
Retrieve the coordinates of the top left corner of this Rectangle.
Definition: geometry.h:274
__nodiscard Rectangle enclosedIn(const Rectangle &boundary) const
Enclose a Rectangle so as not to exceed another Rectangle.
Definition: geometry.cpp:735
bool isNull() const
Check if the rectangle is null.
Definition: geometry.h:264
unsigned int width
The distance between the left and right sides.
Definition: geometry.h:261
Rectangle & translateBy(const Point &point)
Translate this Rectangle in place by the given Point.
Definition: geometry.cpp:684
Size size() const
Retrieve the size of this rectangle.
Definition: geometry.h:269
constexpr Rectangle()
Construct a Rectangle with all coordinates set to 0.
Definition: geometry.h:239
int x
The horizontal coordinate of the rectangle's top-left corner.
Definition: geometry.h:259
__nodiscard Rectangle boundedTo(const Rectangle &bound) const
Calculate the intersection of this Rectangle with another.
Definition: geometry.cpp:704
__nodiscard Rectangle scaledBy(const Size &numerator, const Size &denominator) const
Apply a non-uniform rational scaling to this Rectangle.
Definition: geometry.cpp:759
Describe a range of sizes.
Definition: geometry.h:197
SizeRange(const Size &minSize, const Size &maxSize, unsigned int hstep, unsigned int vstep)
Construct a size range with specified min, max and step.
Definition: geometry.h:214
SizeRange(const Size &minSize, const Size &maxSize)
Construct a size range with specified min and max, and steps of 1.
Definition: geometry.h:209
unsigned int vStep
The vertical step.
Definition: geometry.h:227
SizeRange(const Size &size)
Construct a size range representing a single size.
Definition: geometry.h:204
Size max
The maximum size.
Definition: geometry.h:225
unsigned int hStep
The horizontal step.
Definition: geometry.h:226
SizeRange()
Construct a size range initialized to 0.
Definition: geometry.h:199
Size min
The minimum size.
Definition: geometry.h:224
bool contains(const Size &size) const
Test if a size is contained in the range.
Definition: geometry.cpp:513
std::string toString() const
Assemble and return a string describing the size range.
Definition: geometry.cpp:528
Describe a two-dimensional size.
Definition: geometry.h:51
Size & operator/=(float factor)
Scale this size down by the given factor in place.
Definition: geometry.cpp:358
__nodiscard constexpr Size shrunkBy(const Size &margins) const
Shrink the size by margins.
Definition: geometry.h:153
Size & alignUpTo(unsigned int hAlignment, unsigned int vAlignment)
Align the size up horizontally and vertically in place.
Definition: geometry.h:76
Size & shrinkBy(const Size &margins)
Shrink the size by margins in place.
Definition: geometry.h:104
const std::string toString() const
Assemble and return a string describing the size.
Definition: geometry.cpp:125
Size operator/(float factor) const
Scale size down by the given factor.
Definition: geometry.cpp:336
__nodiscard constexpr Size expandedTo(const Size &expand) const
Expand the size to expand.
Definition: geometry.h:137
constexpr Size()
Construct a Size with width and height set to 0.
Definition: geometry.h:53
__nodiscard constexpr Size alignedDownTo(unsigned int hAlignment, unsigned int vAlignment) const
Align the size down horizontally and vertically.
Definition: geometry.h:111
Size & boundTo(const Size &bound)
Bound the size to bound in place.
Definition: geometry.h:83
__nodiscard constexpr Size grownBy(const Size &margins) const
Grow the size by margins.
Definition: geometry.h:145
unsigned int width
The Size width.
Definition: geometry.h:63
Size & alignDownTo(unsigned int hAlignment, unsigned int vAlignment)
Align the size down horizontally and vertically in place.
Definition: geometry.h:69
__nodiscard Rectangle centeredTo(const Point &center) const
Center a rectangle of this size at a given Point.
Definition: geometry.cpp:313
constexpr Size(unsigned int w, unsigned int h)
Construct a Size with given width and height.
Definition: geometry.h:58
bool isNull() const
Check if the size is null.
Definition: geometry.h:66
Size & expandTo(const Size &expand)
Expand the size to expand.
Definition: geometry.h:90
__nodiscard constexpr Size boundedTo(const Size &bound) const
Bound the size to bound.
Definition: geometry.h:129
__nodiscard Size boundedToAspectRatio(const Size &ratio) const
Bound the size down to match the aspect ratio given by ratio.
Definition: geometry.cpp:264
__nodiscard Size expandedToAspectRatio(const Size &ratio) const
Expand the size to match the aspect ratio given by ratio.
Definition: geometry.cpp:289
Size operator*(float factor) const
Scale size up by the given factor.
Definition: geometry.cpp:326
__nodiscard constexpr Size alignedUpTo(unsigned int hAlignment, unsigned int vAlignment) const
Align the size up horizontally and vertically.
Definition: geometry.h:120
unsigned int height
The Size height.
Definition: geometry.h:64
Size & growBy(const Size &margins)
Grow the size by margins in place.
Definition: geometry.h:97
Size & operator*=(float factor)
Scale this size up by the given factor in place.
Definition: geometry.cpp:346
Top-level libcamera namespace.
Definition: backtrace.h:17
bool operator<(const Size &lhs, const Size &rhs)
Compare sizes for smaller than order.
Definition: geometry.cpp:385
bool operator==(const Point &lhs, const Point &rhs)
Compare points for equality.
Definition: geometry.cpp:75