annotate SDL3/SDL_rect.h @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 /*
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2 Simple DirectMedia Layer
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 This software is provided 'as-is', without any express or implied
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 warranty. In no event will the authors be held liable for any damages
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 arising from the use of this software.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 Permission is granted to anyone to use this software for any purpose,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 including commercial applications, and to alter it and redistribute it
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 freely, subject to the following restrictions:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 1. The origin of this software must not be misrepresented; you must not
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 claim that you wrote the original software. If you use this software
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 in a product, an acknowledgment in the product documentation would be
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 appreciated but is not required.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 2. Altered source versions must be plainly marked as such, and must not be
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 misrepresented as being the original software.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 3. This notice may not be removed or altered from any source distribution.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 * # CategoryRect
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 * Some helper functions for managing rectangles and 2D points, in both
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 * integer and floating point versions.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 #ifndef SDL_rect_h_
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 #define SDL_rect_h_
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 #include <SDL3/SDL_stdinc.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 #include <SDL3/SDL_error.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 #include <SDL3/SDL_begin_code.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 /* Set up for C function definitions, even when using C++ */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 #ifdef __cplusplus
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 extern "C" {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 * The structure that defines a point (using integers).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 * \since This struct is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 * \sa SDL_GetRectEnclosingPoints
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 * \sa SDL_PointInRect
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 typedef struct SDL_Point
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 int x;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 int y;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 } SDL_Point;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 * The structure that defines a point (using floating point values).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 * \since This struct is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 * \sa SDL_GetRectEnclosingPointsFloat
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 * \sa SDL_PointInRectFloat
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 typedef struct SDL_FPoint
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 float x;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 float y;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 } SDL_FPoint;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 * A rectangle, with the origin at the upper left (using integers).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 * \since This struct is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 * \sa SDL_RectEmpty
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 * \sa SDL_RectsEqual
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 * \sa SDL_HasRectIntersection
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 * \sa SDL_GetRectIntersection
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 * \sa SDL_GetRectAndLineIntersection
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 * \sa SDL_GetRectUnion
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 * \sa SDL_GetRectEnclosingPoints
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 typedef struct SDL_Rect
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 int x, y;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 int w, h;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 } SDL_Rect;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 * A rectangle stored using floating point values.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 * The origin of the coordinate space is in the top-left, with increasing
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 * values moving down and right. The properties `x` and `y` represent the
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 * coordinates of the top-left corner of the rectangle.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 * \since This struct is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 * \sa SDL_RectEmptyFloat
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 * \sa SDL_RectsEqualFloat
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 * \sa SDL_RectsEqualEpsilon
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 * \sa SDL_HasRectIntersectionFloat
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 * \sa SDL_GetRectIntersectionFloat
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 * \sa SDL_GetRectAndLineIntersectionFloat
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 * \sa SDL_GetRectUnionFloat
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 * \sa SDL_GetRectEnclosingPointsFloat
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 * \sa SDL_PointInRectFloat
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 typedef struct SDL_FRect
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 float x;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 float y;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 float w;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 float h;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 } SDL_FRect;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 * Convert an SDL_Rect to SDL_FRect
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 * \param rect a pointer to an SDL_Rect.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 * \param frect a pointer filled in with the floating point representation of
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 * `rect`.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 * \threadsafety It is safe to call this function from any thread.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127 * \since This function is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 SDL_FORCE_INLINE void SDL_RectToFRect(const SDL_Rect *rect, SDL_FRect *frect)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 frect->x = SDL_static_cast(float, rect->x);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 frect->y = SDL_static_cast(float, rect->y);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 frect->w = SDL_static_cast(float, rect->w);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 frect->h = SDL_static_cast(float, rect->h);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 * Determine whether a point resides inside a rectangle.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 * A point is considered part of a rectangle if both `p` and `r` are not NULL,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141 * and `p`'s x and y coordinates are >= to the rectangle's top left corner,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142 * and < the rectangle's x+w and y+h. So a 1x1 rectangle considers point (0,0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 * as "inside" and (0,1) as not.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145 * Note that this is a forced-inline function in a header, and not a public
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146 * API function available in the SDL library (which is to say, the code is
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147 * embedded in the calling program and the linker and dynamic loader will not
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148 * be able to find this function inside SDL itself).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150 * \param p the point to test.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151 * \param r the rectangle to test.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152 * \returns true if `p` is contained by `r`, false otherwise.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154 * \threadsafety It is safe to call this function from any thread.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156 * \since This function is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
158 SDL_FORCE_INLINE bool SDL_PointInRect(const SDL_Point *p, const SDL_Rect *r)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160 return ( p && r && (p->x >= r->x) && (p->x < (r->x + r->w)) &&
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161 (p->y >= r->y) && (p->y < (r->y + r->h)) ) ? true : false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
163
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
164 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
165 * Determine whether a rectangle has no area.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
166 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167 * A rectangle is considered "empty" for this function if `r` is NULL, or if
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
168 * `r`'s width and/or height are <= 0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
169 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
170 * Note that this is a forced-inline function in a header, and not a public
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171 * API function available in the SDL library (which is to say, the code is
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
172 * embedded in the calling program and the linker and dynamic loader will not
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173 * be able to find this function inside SDL itself).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
174 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
175 * \param r the rectangle to test.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
176 * \returns true if the rectangle is "empty", false otherwise.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
177 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
178 * \threadsafety It is safe to call this function from any thread.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
179 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
180 * \since This function is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
181 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
182 SDL_FORCE_INLINE bool SDL_RectEmpty(const SDL_Rect *r)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
183 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
184 return ((!r) || (r->w <= 0) || (r->h <= 0)) ? true : false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
185 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
186
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
187 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
188 * Determine whether two rectangles are equal.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
189 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
190 * Rectangles are considered equal if both are not NULL and each of their x,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
191 * y, width and height match.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
192 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
193 * Note that this is a forced-inline function in a header, and not a public
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
194 * API function available in the SDL library (which is to say, the code is
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
195 * embedded in the calling program and the linker and dynamic loader will not
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
196 * be able to find this function inside SDL itself).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
197 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
198 * \param a the first rectangle to test.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
199 * \param b the second rectangle to test.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
200 * \returns true if the rectangles are equal, false otherwise.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
201 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
202 * \threadsafety It is safe to call this function from any thread.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
203 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
204 * \since This function is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
205 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
206 SDL_FORCE_INLINE bool SDL_RectsEqual(const SDL_Rect *a, const SDL_Rect *b)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
207 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
208 return (a && b && (a->x == b->x) && (a->y == b->y) &&
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
209 (a->w == b->w) && (a->h == b->h)) ? true : false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
210 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
211
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
212 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
213 * Determine whether two rectangles intersect.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
214 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
215 * If either pointer is NULL the function will return false.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
216 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
217 * \param A an SDL_Rect structure representing the first rectangle.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
218 * \param B an SDL_Rect structure representing the second rectangle.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
219 * \returns true if there is an intersection, false otherwise.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
220 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
221 * \threadsafety It is safe to call this function from any thread.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
222 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
223 * \since This function is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
224 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
225 * \sa SDL_GetRectIntersection
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
226 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
227 extern SDL_DECLSPEC bool SDLCALL SDL_HasRectIntersection(const SDL_Rect *A, const SDL_Rect *B);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
228
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
229 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
230 * Calculate the intersection of two rectangles.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
231 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
232 * If `result` is NULL then this function will return false.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
233 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
234 * \param A an SDL_Rect structure representing the first rectangle.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
235 * \param B an SDL_Rect structure representing the second rectangle.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
236 * \param result an SDL_Rect structure filled in with the intersection of
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
237 * rectangles `A` and `B`.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
238 * \returns true if there is an intersection, false otherwise.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
239 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
240 * \since This function is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
241 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
242 * \sa SDL_HasRectIntersection
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
243 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
244 extern SDL_DECLSPEC bool SDLCALL SDL_GetRectIntersection(const SDL_Rect *A, const SDL_Rect *B, SDL_Rect *result);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
245
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
246 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
247 * Calculate the union of two rectangles.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
248 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
249 * \param A an SDL_Rect structure representing the first rectangle.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
250 * \param B an SDL_Rect structure representing the second rectangle.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
251 * \param result an SDL_Rect structure filled in with the union of rectangles
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
252 * `A` and `B`.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
253 * \returns true on success or false on failure; call SDL_GetError() for more
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
254 * information.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
255 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
256 * \since This function is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
257 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
258 extern SDL_DECLSPEC bool SDLCALL SDL_GetRectUnion(const SDL_Rect *A, const SDL_Rect *B, SDL_Rect *result);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
259
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
260 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
261 * Calculate a minimal rectangle enclosing a set of points.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
262 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
263 * If `clip` is not NULL then only points inside of the clipping rectangle are
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
264 * considered.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
265 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
266 * \param points an array of SDL_Point structures representing points to be
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
267 * enclosed.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
268 * \param count the number of structures in the `points` array.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
269 * \param clip an SDL_Rect used for clipping or NULL to enclose all points.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
270 * \param result an SDL_Rect structure filled in with the minimal enclosing
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
271 * rectangle.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
272 * \returns true if any points were enclosed or false if all the points were
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
273 * outside of the clipping rectangle.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
274 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
275 * \since This function is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
276 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
277 extern SDL_DECLSPEC bool SDLCALL SDL_GetRectEnclosingPoints(const SDL_Point *points, int count, const SDL_Rect *clip, SDL_Rect *result);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
278
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
279 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
280 * Calculate the intersection of a rectangle and line segment.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
281 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
282 * This function is used to clip a line segment to a rectangle. A line segment
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
283 * contained entirely within the rectangle or that does not intersect will
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
284 * remain unchanged. A line segment that crosses the rectangle at either or
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
285 * both ends will be clipped to the boundary of the rectangle and the new
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
286 * coordinates saved in `X1`, `Y1`, `X2`, and/or `Y2` as necessary.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
287 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
288 * \param rect an SDL_Rect structure representing the rectangle to intersect.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
289 * \param X1 a pointer to the starting X-coordinate of the line.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
290 * \param Y1 a pointer to the starting Y-coordinate of the line.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
291 * \param X2 a pointer to the ending X-coordinate of the line.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
292 * \param Y2 a pointer to the ending Y-coordinate of the line.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
293 * \returns true if there is an intersection, false otherwise.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
294 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
295 * \since This function is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
296 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
297 extern SDL_DECLSPEC bool SDLCALL SDL_GetRectAndLineIntersection(const SDL_Rect *rect, int *X1, int *Y1, int *X2, int *Y2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
298
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
299
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
300 /* SDL_FRect versions... */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
301
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
302 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
303 * Determine whether a point resides inside a floating point rectangle.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
304 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
305 * A point is considered part of a rectangle if both `p` and `r` are not NULL,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
306 * and `p`'s x and y coordinates are >= to the rectangle's top left corner,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
307 * and <= the rectangle's x+w and y+h. So a 1x1 rectangle considers point
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
308 * (0,0) and (0,1) as "inside" and (0,2) as not.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
309 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
310 * Note that this is a forced-inline function in a header, and not a public
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
311 * API function available in the SDL library (which is to say, the code is
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
312 * embedded in the calling program and the linker and dynamic loader will not
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
313 * be able to find this function inside SDL itself).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
314 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
315 * \param p the point to test.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
316 * \param r the rectangle to test.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
317 * \returns true if `p` is contained by `r`, false otherwise.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
318 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
319 * \threadsafety It is safe to call this function from any thread.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
320 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
321 * \since This function is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
322 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
323 SDL_FORCE_INLINE bool SDL_PointInRectFloat(const SDL_FPoint *p, const SDL_FRect *r)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
324 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
325 return ( p && r && (p->x >= r->x) && (p->x <= (r->x + r->w)) &&
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
326 (p->y >= r->y) && (p->y <= (r->y + r->h)) ) ? true : false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
327 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
328
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
329 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
330 * Determine whether a floating point rectangle takes no space.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
331 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
332 * A rectangle is considered "empty" for this function if `r` is NULL, or if
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
333 * `r`'s width and/or height are < 0.0f.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
334 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
335 * Note that this is a forced-inline function in a header, and not a public
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
336 * API function available in the SDL library (which is to say, the code is
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
337 * embedded in the calling program and the linker and dynamic loader will not
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
338 * be able to find this function inside SDL itself).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
339 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
340 * \param r the rectangle to test.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
341 * \returns true if the rectangle is "empty", false otherwise.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
342 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
343 * \threadsafety It is safe to call this function from any thread.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
344 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
345 * \since This function is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
346 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
347 SDL_FORCE_INLINE bool SDL_RectEmptyFloat(const SDL_FRect *r)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
348 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
349 return ((!r) || (r->w < 0.0f) || (r->h < 0.0f)) ? true : false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
350 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
351
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
352 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
353 * Determine whether two floating point rectangles are equal, within some
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
354 * given epsilon.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
355 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
356 * Rectangles are considered equal if both are not NULL and each of their x,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
357 * y, width and height are within `epsilon` of each other. If you don't know
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
358 * what value to use for `epsilon`, you should call the SDL_RectsEqualFloat
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
359 * function instead.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
360 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
361 * Note that this is a forced-inline function in a header, and not a public
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
362 * API function available in the SDL library (which is to say, the code is
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
363 * embedded in the calling program and the linker and dynamic loader will not
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
364 * be able to find this function inside SDL itself).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
365 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
366 * \param a the first rectangle to test.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
367 * \param b the second rectangle to test.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
368 * \param epsilon the epsilon value for comparison.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
369 * \returns true if the rectangles are equal, false otherwise.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
370 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
371 * \threadsafety It is safe to call this function from any thread.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
372 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
373 * \since This function is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
374 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
375 * \sa SDL_RectsEqualFloat
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
376 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
377 SDL_FORCE_INLINE bool SDL_RectsEqualEpsilon(const SDL_FRect *a, const SDL_FRect *b, float epsilon)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
378 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
379 return (a && b && ((a == b) ||
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
380 ((SDL_fabsf(a->x - b->x) <= epsilon) &&
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
381 (SDL_fabsf(a->y - b->y) <= epsilon) &&
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
382 (SDL_fabsf(a->w - b->w) <= epsilon) &&
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
383 (SDL_fabsf(a->h - b->h) <= epsilon))))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
384 ? true : false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
385 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
386
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
387 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
388 * Determine whether two floating point rectangles are equal, within a default
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
389 * epsilon.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
390 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
391 * Rectangles are considered equal if both are not NULL and each of their x,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
392 * y, width and height are within SDL_FLT_EPSILON of each other. This is often
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
393 * a reasonable way to compare two floating point rectangles and deal with the
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
394 * slight precision variations in floating point calculations that tend to pop
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
395 * up.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
396 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
397 * Note that this is a forced-inline function in a header, and not a public
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
398 * API function available in the SDL library (which is to say, the code is
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
399 * embedded in the calling program and the linker and dynamic loader will not
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
400 * be able to find this function inside SDL itself).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
401 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
402 * \param a the first rectangle to test.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
403 * \param b the second rectangle to test.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
404 * \returns true if the rectangles are equal, false otherwise.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
405 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
406 * \threadsafety It is safe to call this function from any thread.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
407 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
408 * \since This function is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
409 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
410 * \sa SDL_RectsEqualEpsilon
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
411 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
412 SDL_FORCE_INLINE bool SDL_RectsEqualFloat(const SDL_FRect *a, const SDL_FRect *b)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
413 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
414 return SDL_RectsEqualEpsilon(a, b, SDL_FLT_EPSILON);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
415 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
416
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
417 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
418 * Determine whether two rectangles intersect with float precision.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
419 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
420 * If either pointer is NULL the function will return false.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
421 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
422 * \param A an SDL_FRect structure representing the first rectangle.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
423 * \param B an SDL_FRect structure representing the second rectangle.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
424 * \returns true if there is an intersection, false otherwise.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
425 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
426 * \since This function is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
427 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
428 * \sa SDL_GetRectIntersection
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
429 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
430 extern SDL_DECLSPEC bool SDLCALL SDL_HasRectIntersectionFloat(const SDL_FRect *A, const SDL_FRect *B);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
431
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
432 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
433 * Calculate the intersection of two rectangles with float precision.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
434 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
435 * If `result` is NULL then this function will return false.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
436 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
437 * \param A an SDL_FRect structure representing the first rectangle.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
438 * \param B an SDL_FRect structure representing the second rectangle.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
439 * \param result an SDL_FRect structure filled in with the intersection of
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
440 * rectangles `A` and `B`.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
441 * \returns true if there is an intersection, false otherwise.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
442 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
443 * \since This function is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
444 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
445 * \sa SDL_HasRectIntersectionFloat
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
446 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
447 extern SDL_DECLSPEC bool SDLCALL SDL_GetRectIntersectionFloat(const SDL_FRect *A, const SDL_FRect *B, SDL_FRect *result);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
448
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
449 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
450 * Calculate the union of two rectangles with float precision.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
451 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
452 * \param A an SDL_FRect structure representing the first rectangle.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
453 * \param B an SDL_FRect structure representing the second rectangle.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
454 * \param result an SDL_FRect structure filled in with the union of rectangles
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
455 * `A` and `B`.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
456 * \returns true on success or false on failure; call SDL_GetError() for more
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
457 * information.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
458 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
459 * \since This function is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
460 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
461 extern SDL_DECLSPEC bool SDLCALL SDL_GetRectUnionFloat(const SDL_FRect *A, const SDL_FRect *B, SDL_FRect *result);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
462
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
463 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
464 * Calculate a minimal rectangle enclosing a set of points with float
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
465 * precision.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
466 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
467 * If `clip` is not NULL then only points inside of the clipping rectangle are
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
468 * considered.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
469 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
470 * \param points an array of SDL_FPoint structures representing points to be
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
471 * enclosed.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
472 * \param count the number of structures in the `points` array.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
473 * \param clip an SDL_FRect used for clipping or NULL to enclose all points.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
474 * \param result an SDL_FRect structure filled in with the minimal enclosing
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
475 * rectangle.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
476 * \returns true if any points were enclosed or false if all the points were
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
477 * outside of the clipping rectangle.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
478 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
479 * \since This function is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
480 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
481 extern SDL_DECLSPEC bool SDLCALL SDL_GetRectEnclosingPointsFloat(const SDL_FPoint *points, int count, const SDL_FRect *clip, SDL_FRect *result);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
482
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
483 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
484 * Calculate the intersection of a rectangle and line segment with float
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
485 * precision.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
486 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
487 * This function is used to clip a line segment to a rectangle. A line segment
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
488 * contained entirely within the rectangle or that does not intersect will
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
489 * remain unchanged. A line segment that crosses the rectangle at either or
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
490 * both ends will be clipped to the boundary of the rectangle and the new
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
491 * coordinates saved in `X1`, `Y1`, `X2`, and/or `Y2` as necessary.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
492 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
493 * \param rect an SDL_FRect structure representing the rectangle to intersect.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
494 * \param X1 a pointer to the starting X-coordinate of the line.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
495 * \param Y1 a pointer to the starting Y-coordinate of the line.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
496 * \param X2 a pointer to the ending X-coordinate of the line.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
497 * \param Y2 a pointer to the ending Y-coordinate of the line.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
498 * \returns true if there is an intersection, false otherwise.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
499 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
500 * \since This function is available since SDL 3.2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
501 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
502 extern SDL_DECLSPEC bool SDLCALL SDL_GetRectAndLineIntersectionFloat(const SDL_FRect *rect, float *X1, float *Y1, float *X2, float *Y2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
503
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
504 /* Ends C function definitions when using C++ */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
505 #ifdef __cplusplus
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
506 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
507 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
508 #include <SDL3/SDL_close_code.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
509
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
510 #endif /* SDL_rect_h_ */