OpenTTD Source 20260712-master-gcf48f866eb
geometry_type.hpp
Go to the documentation of this file.
1/*
2 * This file is part of OpenTTD.
3 * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
4 * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
5 * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <https://www.gnu.org/licenses/old-licenses/gpl-2.0>.
6 */
7
9
10#ifndef GEOMETRY_TYPE_HPP
11#define GEOMETRY_TYPE_HPP
12
13#if defined(__APPLE__)
14 /* Mac OS X already has both Rect and Point declared */
15# define Rect OTTD_Rect
16# define Point OTTD_Point
17#endif /* __APPLE__ */
18
27
29enum class AlignmentV : uint8_t {
33};
34
36struct Alignment {
39
45 constexpr Alignment(AlignmentH h, AlignmentV v) : h(h), v(v) {}
46
52
53 AlignmentH ResolveRTL() const;
54};
55
63inline int CentreBounds(int min, int max, int size)
64{
65 return (min + max - size + 1) / 2;
66}
67
69template <typename T>
70struct Coord2D {
71 T x = 0;
72 T y = 0;
73
74 constexpr Coord2D() = default;
75 constexpr Coord2D(T x, T y) : x(x), y(y) {}
76
81 constexpr auto operator<=>(const Coord2D<T> &) const = default;
82};
83
85template <typename T>
86struct Coord3D {
87 T x = 0;
88 T y = 0;
89 T z = 0;
90
91 constexpr Coord3D() = default;
92 constexpr Coord3D(T x, T y, T z) : x(x), y(y), z(z) {}
93
98 constexpr auto operator<=>(const Coord3D<T> &) const = default;
99};
100
103
105struct Dimension {
106 uint width;
107 uint height;
108
109 constexpr Dimension() : width(0), height(0) {}
110 constexpr Dimension(uint w, uint h) : width(w), height(h) {}
111
112 bool operator< (const Dimension &other) const
113 {
114 int x = this->width - other.width;
115 if (x != 0) return x < 0;
116 return this->height < other.height;
117 }
118
119 bool operator== (const Dimension &other) const
120 {
121 return this->width == other.width && this->height == other.height;
122 }
123};
124
127 uint8_t left = 0;
128 uint8_t top = 0;
129 uint8_t right = 0;
130 uint8_t bottom = 0;
131
132 static const RectPadding zero;
133
138 constexpr uint Horizontal() const { return this->left + this->right; }
139
144 constexpr uint Vertical() const { return this->top + this->bottom; }
145};
146
147inline const RectPadding RectPadding::zero{};
148
150struct Rect {
151 int left = 0;
152 int top = 0;
153 int right = 0;
154 int bottom = 0;
155
160 inline int Width() const { return this->right - this->left + 1; }
161
166 inline int Height() const { return this->bottom - this->top + 1; }
167
173 [[nodiscard]] inline Rect Shrink(int s) const
174 {
175 return {this->left + s, this->top + s, this->right - s, this->bottom - s};
176 }
177
184 [[nodiscard]] inline Rect Shrink(int h, int v) const
185 {
186 return {this->left + h, this->top + v, this->right - h, this->bottom - v};
187 }
188
197 [[nodiscard]] inline Rect Shrink(int left, int top, int right, int bottom) const
198 {
199 return {this->left + left, this->top + top, this->right - right, this->bottom - bottom};
200 }
201
207 [[nodiscard]] inline Rect Shrink(const RectPadding &other) const
208 {
209 return {this->left + other.left, this->top + other.top, this->right - other.right, this->bottom - other.bottom};
210 }
211
218 [[nodiscard]] inline Rect Shrink(const RectPadding &horz, const RectPadding &vert) const
219 {
220 return {this->left + horz.left, this->top + vert.top, this->right - horz.right, this->bottom - vert.bottom};
221 }
222
228 [[nodiscard]] inline Rect Expand(int s) const
229 {
230 return this->Shrink(-s);
231 }
232
238 [[nodiscard]] inline Rect Expand(const RectPadding &other) const
239 {
240 return {this->left - other.left, this->top - other.top, this->right + other.right, this->bottom + other.bottom};
241 }
242
249 [[nodiscard]] inline Rect Translate(int x, int y) const
250 {
251 return {this->left + x, this->top + y, this->right + x, this->bottom + y};
252 }
253
260 [[nodiscard]] inline Rect WithWidth(int width, bool end) const
261 {
262 return end
263 ? this->WithX(this->right - width + 1, this->right)
264 : this->WithX(this->left, this->left + width - 1);
265 }
266
273 [[nodiscard]] inline Rect Indent(int indent, bool end) const
274 {
275 return end
276 ? this->WithX(this->left, this->right - indent)
277 : this->WithX(this->left + indent, this->right);
278 }
279
286 [[nodiscard]] inline Rect WithHeight(int height, bool end = false) const
287 {
288 return end
289 ? this->WithY(this->bottom - height + 1, this->bottom)
290 : this->WithY(this->top, this->top + height - 1);
291 }
292
298 inline bool Contains(const Point &pt) const
299 {
300 /* This is a local version of IsInsideMM, to avoid including math_func everywhere. */
301 return (uint)(pt.x - this->left) <= (uint)(this->right - this->left) && (uint)(pt.y - this->top) <= (uint)(this->bottom - this->top);
302 }
303
309 [[nodiscard]] inline Rect CentreToHeight(int height) const
310 {
311 int new_top = CentreBounds(this->top, this->bottom, height);
312 return {this->left, new_top, this->right, new_top + height - 1};
313 }
314
321 [[nodiscard]] inline Rect WithX(int new_left, int new_right) const { return {new_left, this->top, new_right, this->bottom}; }
322
329 [[nodiscard]] inline Rect WithY(int new_top, int new_bottom) const { return {this->left, new_top, this->right, new_bottom}; }
330
336 [[nodiscard]] inline Rect WithX(const Rect &other) const { return this->WithX(other.left, other.right); }
337
343 [[nodiscard]] inline Rect WithY(const Rect &other) const { return this->WithY(other.top, other.bottom); }
344};
345
351 int x = 0;
352 int y = 0;
353 int width = 0;
354 int height = 0;
355};
356
357#endif /* GEOMETRY_TYPE_HPP */
#define T
Climate temperate.
Definition engines.h:91
AlignmentH
Horizontal alignments.
@ ForceRight
Force align to the right.
@ Centre
Align to the centre.
@ End
Align to the end, LTR/RTL aware.
@ Start
Align to the start, LTR/RTL aware.
@ ForceLeft
Force align to the left.
Coord2D< int > Point
Coordinates of a point in 2D.
int CentreBounds(int min, int max, int size)
Determine where to position a centred object.
AlignmentV
Vertical alignments.
@ Bottom
Align to the bottom.
@ Top
Align to the top.
@ Middle
Align to the middle.
#define Point
Macro that prevents name conflicts between included headers.
AlignmentH ResolveRTL() const
Resolve horizontal alignment for the current text direction.
constexpr Alignment(AlignmentH h, AlignmentV v)
Construct an alignment with the specified horizontal and vertical alignment.
AlignmentV v
Vertical alignment.
AlignmentH h
Horizontal alignment.
constexpr Alignment(AlignmentH h)
Construct an alignment with the specific horizontal alignment.
A coordinate with two dimensions.
constexpr auto operator<=>(const Coord2D< T > &) const =default
Compare with another instance of this class.
T x
X coordinate.
T y
Y coordinate.
constexpr auto operator<=>(const Coord3D< T > &) const =default
Compare with another instance of this class.
T z
Z coordinate.
Specification of a rectangle with an absolute top-left coordinate and a (relative) width/height.
Padding dimensions to apply to each side of a Rect.
constexpr uint Horizontal() const
Get total horizontal padding of RectPadding.
constexpr uint Vertical() const
Get total vertical padding of RectPadding.
Specification of a rectangle with absolute coordinates of all edges.
Rect WithWidth(int width, bool end) const
Copy Rect and set its width.
int Width() const
Get width of Rect.
Rect Expand(const RectPadding &other) const
Copy and expand Rect by a RectPadding.
Rect Shrink(int s) const
Copy and shrink Rect by s pixels.
Rect Shrink(const RectPadding &other) const
Copy and shrink Rect by a RectPadding.
Rect WithHeight(int height, bool end=false) const
Copy Rect and set its height.
Rect Indent(int indent, bool end) const
Copy Rect and indent it from its position.
Rect CentreToHeight(int height) const
Centre a vertical dimension within this Rect.
int Height() const
Get height of Rect.
Rect WithY(int new_top, int new_bottom) const
Create a new Rect, replacing the top and bottom coordinates.
Rect WithX(int new_left, int new_right) const
Create a new Rect, replacing the left and right coordinates.
Rect WithX(const Rect &other) const
Create a new Rect, replacing the left and right coordinates.
Rect Shrink(int h, int v) const
Copy and shrink Rect by h horizontal and v vertical pixels.
Rect Translate(int x, int y) const
Copy and translate Rect by x,y pixels.
Rect Shrink(int left, int top, int right, int bottom) const
Copy and shrink Rect by pixels.
Rect WithY(const Rect &other) const
Create a new Rect, replacing the top and bottom coordinates.
Rect Shrink(const RectPadding &horz, const RectPadding &vert) const
Copy and shrink Rect by a different horizontal and vertical RectPadding.
bool Contains(const Point &pt) const
Test if a point falls inside this Rect.
Rect Expand(int s) const
Copy and expand Rect by s pixels.