OpenTTD Source  20240915-master-g3784a3d3d6
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 <http://www.gnu.org/licenses/>.
6  */
7 
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 
19 
21 struct Point {
22  int x;
23  int y;
24 
25  constexpr Point() : x(0), y(0) {}
26  constexpr Point(int x, int y) : x(x), y(y) {}
27 };
28 
30 struct Dimension {
31  uint width;
32  uint height;
33 
34  constexpr Dimension() : width(0), height(0) {}
35  constexpr Dimension(uint w, uint h) : width(w), height(h) {}
36 
37  bool operator< (const Dimension &other) const
38  {
39  int x = (*this).width - other.width;
40  if (x != 0) return x < 0;
41  return (*this).height < other.height;
42  }
43 
44  bool operator== (const Dimension &other) const
45  {
46  return (*this).width == other.width && (*this).height == other.height;
47  }
48 };
49 
51 struct RectPadding {
52  uint8_t left;
53  uint8_t top;
54  uint8_t right;
55  uint8_t bottom;
56 
57  static const RectPadding zero;
58 
63  constexpr uint Horizontal() const { return this->left + this->right; }
64 
69  constexpr uint Vertical() const { return this->top + this->bottom; }
70 };
71 
72 inline const RectPadding RectPadding::zero{};
73 
75 struct Rect {
76  int left;
77  int top;
78  int right;
79  int bottom;
80 
85  inline int Width() const { return this->right - this->left + 1; }
86 
91  inline int Height() const { return this->bottom - this->top + 1; }
92 
98  [[nodiscard]] inline Rect Shrink(int s) const
99  {
100  return {this->left + s, this->top + s, this->right - s, this->bottom - s};
101  }
102 
109  [[nodiscard]] inline Rect Shrink(int h, int v) const
110  {
111  return {this->left + h, this->top + v, this->right - h, this->bottom - v};
112  }
113 
122  [[nodiscard]] inline Rect Shrink(int left, int top, int right, int bottom) const
123  {
124  return {this->left + left, this->top + top, this->right - right, this->bottom - bottom};
125  }
126 
132  [[nodiscard]] inline Rect Shrink(const RectPadding &other) const
133  {
134  return {this->left + other.left, this->top + other.top, this->right - other.right, this->bottom - other.bottom};
135  }
136 
143  [[nodiscard]] inline Rect Shrink(const RectPadding &horz, const RectPadding &vert) const
144  {
145  return {this->left + horz.left, this->top + vert.top, this->right - horz.right, this->bottom - vert.bottom};
146  }
147 
153  [[nodiscard]] inline Rect Expand(int s) const
154  {
155  return this->Shrink(-s);
156  }
157 
163  [[nodiscard]] inline Rect Expand(const RectPadding &other) const
164  {
165  return {this->left - other.left, this->top - other.top, this->right + other.right, this->bottom + other.bottom};
166  }
167 
174  [[nodiscard]] inline Rect Translate(int x, int y) const
175  {
176  return {this->left + x, this->top + y, this->right + x, this->bottom + y};
177  }
178 
185  [[nodiscard]] inline Rect WithWidth(int width, bool end) const
186  {
187  return end
188  ? Rect {this->right - width + 1, this->top, this->right, this->bottom}
189  : Rect {this->left, this->top, this->left + width - 1, this->bottom};
190  }
191 
198  [[nodiscard]] inline Rect Indent(int indent, bool end) const
199  {
200  return end
201  ? Rect {this->left, this->top, this->right - indent, this->bottom}
202  : Rect {this->left + indent, this->top, this->right, this->bottom};
203  }
204 
211  [[nodiscard]] inline Rect WithHeight(int height, bool end = false) const
212  {
213  return end
214  ? Rect {this->left, this->bottom - height + 1, this->right, this->bottom}
215  : Rect {this->left, this->top, this->right, this->top + height - 1};
216  }
217 
223  inline bool Contains(const Point &pt) const
224  {
225  /* This is a local version of IsInsideMM, to avoid including math_func everywhere. */
226  return (uint)(pt.x - this->left) < (uint)(this->right - this->left) && (uint)(pt.y - this->top) < (uint)(this->bottom - this->top);
227  }
228 };
229 
235  int x;
236  int y;
237  int width;
238  int height;
239 };
240 
241 #endif /* GEOMETRY_TYPE_HPP */
Rect::Expand
Rect Expand(const RectPadding &other) const
Copy and expand Rect by a RectPadding.
Definition: geometry_type.hpp:163
Rect::Height
int Height() const
Get height of Rect.
Definition: geometry_type.hpp:91
Dimension
Dimensions (a width and height) of a rectangle in 2D.
Definition: geometry_type.hpp:30
Rect::Shrink
Rect Shrink(int s) const
Copy and shrink Rect by s pixels.
Definition: geometry_type.hpp:98
RectPadding::Vertical
constexpr uint Vertical() const
Get total vertical padding of RectPadding.
Definition: geometry_type.hpp:69
Rect::Expand
Rect Expand(int s) const
Copy and expand Rect by s pixels.
Definition: geometry_type.hpp:153
Rect::WithHeight
Rect WithHeight(int height, bool end=false) const
Copy Rect and set its height.
Definition: geometry_type.hpp:211
Rect::Shrink
Rect Shrink(int left, int top, int right, int bottom) const
Copy and shrink Rect by pixels.
Definition: geometry_type.hpp:122
RectPadding::Horizontal
constexpr uint Horizontal() const
Get total horizontal padding of RectPadding.
Definition: geometry_type.hpp:63
RectPadding
Padding dimensions to apply to each side of a Rect.
Definition: geometry_type.hpp:51
Rect::Translate
Rect Translate(int x, int y) const
Copy and translate Rect by x,y pixels.
Definition: geometry_type.hpp:174
Rect::Indent
Rect Indent(int indent, bool end) const
Copy Rect and indent it from its position.
Definition: geometry_type.hpp:198
Rect::WithWidth
Rect WithWidth(int width, bool end) const
Copy Rect and set its width.
Definition: geometry_type.hpp:185
Point
Coordinates of a point in 2D.
Definition: geometry_type.hpp:21
Rect::Shrink
Rect Shrink(int h, int v) const
Copy and shrink Rect by h horizontal and v vertical pixels.
Definition: geometry_type.hpp:109
Rect::Contains
bool Contains(const Point &pt) const
Test if a point falls inside this Rect.
Definition: geometry_type.hpp:223
PointDimension
Specification of a rectangle with an absolute top-left coordinate and a (relative) width/height.
Definition: geometry_type.hpp:234
Rect::Shrink
Rect Shrink(const RectPadding &horz, const RectPadding &vert) const
Copy and shrink Rect by a different horizontal and vertical RectPadding.
Definition: geometry_type.hpp:143
Rect::Width
int Width() const
Get width of Rect.
Definition: geometry_type.hpp:85
Rect::Shrink
Rect Shrink(const RectPadding &other) const
Copy and shrink Rect by a RectPadding.
Definition: geometry_type.hpp:132
Rect
Specification of a rectangle with absolute coordinates of all edges.
Definition: geometry_type.hpp:75