1 | /* |
2 | Simple DirectMedia Layer |
3 | Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org> |
4 | |
5 | This software is provided 'as-is', without any express or implied |
6 | warranty. In no event will the authors be held liable for any damages |
7 | arising from the use of this software. |
8 | |
9 | Permission is granted to anyone to use this software for any purpose, |
10 | including commercial applications, and to alter it and redistribute it |
11 | freely, subject to the following restrictions: |
12 | |
13 | 1. The origin of this software must not be misrepresented; you must not |
14 | claim that you wrote the original software. If you use this software |
15 | in a product, an acknowledgment in the product documentation would be |
16 | appreciated but is not required. |
17 | 2. Altered source versions must be plainly marked as such, and must not be |
18 | misrepresented as being the original software. |
19 | 3. This notice may not be removed or altered from any source distribution. |
20 | */ |
21 | #ifndef SDL_internal_h_ |
22 | #define SDL_internal_h_ |
23 | |
24 | // Many of SDL's features require _GNU_SOURCE on various platforms |
25 | #ifndef _GNU_SOURCE |
26 | #define _GNU_SOURCE |
27 | #endif |
28 | |
29 | // Need this so Linux systems define fseek64o, ftell64o and off64_t |
30 | #ifndef _LARGEFILE64_SOURCE |
31 | #define _LARGEFILE64_SOURCE 1 |
32 | #endif |
33 | |
34 | /* This is for a variable-length array at the end of a struct: |
35 | struct x { int y; char z[SDL_VARIABLE_LENGTH_ARRAY]; }; |
36 | Use this because GCC 2 needs different magic than other compilers. */ |
37 | #if (defined(__GNUC__) && (__GNUC__ <= 2)) || defined(__CC_ARM) || defined(__cplusplus) |
38 | #define SDL_VARIABLE_LENGTH_ARRAY 1 |
39 | #else |
40 | #define SDL_VARIABLE_LENGTH_ARRAY |
41 | #endif |
42 | |
43 | #if (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6))) || defined(__clang__) |
44 | #define HAVE_GCC_DIAGNOSTIC_PRAGMA 1 |
45 | #endif |
46 | |
47 | #ifdef _MSC_VER // We use constant comparison for generated code |
48 | #pragma warning(disable : 6326) |
49 | #endif |
50 | |
51 | #ifdef _MSC_VER // SDL_MAX_SMALL_ALLOC_STACKSIZE is smaller than _ALLOCA_S_THRESHOLD and should be generally safe |
52 | #pragma warning(disable : 6255) |
53 | #endif |
54 | #define SDL_MAX_SMALL_ALLOC_STACKSIZE 128 |
55 | #define SDL_small_alloc(type, count, pisstack) ((*(pisstack) = ((sizeof(type) * (count)) < SDL_MAX_SMALL_ALLOC_STACKSIZE)), (*(pisstack) ? SDL_stack_alloc(type, count) : (type *)SDL_malloc(sizeof(type) * (count)))) |
56 | #define SDL_small_free(ptr, isstack) \ |
57 | if ((isstack)) { \ |
58 | SDL_stack_free(ptr); \ |
59 | } else { \ |
60 | SDL_free(ptr); \ |
61 | } |
62 | |
63 | #include "SDL_build_config.h" |
64 | |
65 | #include "dynapi/SDL_dynapi.h" |
66 | |
67 | #if SDL_DYNAMIC_API |
68 | #include "dynapi/SDL_dynapi_overrides.h" |
69 | /* force SDL_DECLSPEC off...it's all internal symbols now. |
70 | These will have actual #defines during SDL_dynapi.c only */ |
71 | #ifdef SDL_DECLSPEC |
72 | #undef SDL_DECLSPEC |
73 | #endif |
74 | #define SDL_DECLSPEC |
75 | #endif |
76 | |
77 | #ifdef SDL_PLATFORM_APPLE |
78 | #ifndef _DARWIN_C_SOURCE |
79 | #define _DARWIN_C_SOURCE 1 // for memset_pattern4() |
80 | #endif |
81 | #include <Availability.h> |
82 | |
83 | #ifndef __IPHONE_OS_VERSION_MAX_ALLOWED |
84 | #define __IPHONE_OS_VERSION_MAX_ALLOWED 0 |
85 | #endif |
86 | #ifndef __APPLETV_OS_VERSION_MAX_ALLOWED |
87 | #define __APPLETV_OS_VERSION_MAX_ALLOWED 0 |
88 | #endif |
89 | #ifndef __MAC_OS_X_VERSION_MAX_ALLOWED |
90 | #define __MAC_OS_X_VERSION_MAX_ALLOWED 0 |
91 | #endif |
92 | #endif // SDL_PLATFORM_APPLE |
93 | |
94 | #ifdef HAVE_SYS_TYPES_H |
95 | #include <sys/types.h> |
96 | #endif |
97 | #ifdef HAVE_STDIO_H |
98 | #include <stdio.h> |
99 | #endif |
100 | #ifdef HAVE_STDLIB_H |
101 | #include <stdlib.h> |
102 | #elif defined(HAVE_MALLOC_H) |
103 | #include <malloc.h> |
104 | #endif |
105 | #ifdef HAVE_STDDEF_H |
106 | #include <stddef.h> |
107 | #endif |
108 | #ifdef HAVE_STDARG_H |
109 | #include <stdarg.h> |
110 | #endif |
111 | #ifdef HAVE_STRING_H |
112 | #ifdef HAVE_MEMORY_H |
113 | #include <memory.h> |
114 | #endif |
115 | #include <string.h> |
116 | #endif |
117 | #ifdef HAVE_STRINGS_H |
118 | #include <strings.h> |
119 | #endif |
120 | #ifdef HAVE_WCHAR_H |
121 | #include <wchar.h> |
122 | #endif |
123 | #ifdef HAVE_INTTYPES_H |
124 | #include <inttypes.h> |
125 | #elif defined(HAVE_STDINT_H) |
126 | #include <stdint.h> |
127 | #endif |
128 | #ifdef HAVE_MATH_H |
129 | #include <math.h> |
130 | #endif |
131 | #ifdef HAVE_FLOAT_H |
132 | #include <float.h> |
133 | #endif |
134 | |
135 | // If you run into a warning that O_CLOEXEC is redefined, update the SDL configuration header for your platform to add HAVE_O_CLOEXEC |
136 | #ifndef HAVE_O_CLOEXEC |
137 | #define O_CLOEXEC 0 |
138 | #endif |
139 | |
140 | /* A few #defines to reduce SDL footprint. |
141 | Only effective when library is statically linked. */ |
142 | |
143 | /* Optimized functions from 'SDL_blit_0.c' |
144 | - blit with source bits_per_pixel < 8, palette */ |
145 | #if !defined(SDL_HAVE_BLIT_0) && !defined(SDL_LEAN_AND_MEAN) |
146 | #define SDL_HAVE_BLIT_0 1 |
147 | #endif |
148 | |
149 | /* Optimized functions from 'SDL_blit_1.c' |
150 | - blit with source bytes_per_pixel == 1, palette */ |
151 | #if !defined(SDL_HAVE_BLIT_1) && !defined(SDL_LEAN_AND_MEAN) |
152 | #define SDL_HAVE_BLIT_1 1 |
153 | #endif |
154 | |
155 | /* Optimized functions from 'SDL_blit_A.c' |
156 | - blit with 'SDL_BLENDMODE_BLEND' blending mode */ |
157 | #if !defined(SDL_HAVE_BLIT_A) && !defined(SDL_LEAN_AND_MEAN) |
158 | #define SDL_HAVE_BLIT_A 1 |
159 | #endif |
160 | |
161 | /* Optimized functions from 'SDL_blit_N.c' |
162 | - blit with COLORKEY mode, or nothing */ |
163 | #if !defined(SDL_HAVE_BLIT_N) && !defined(SDL_LEAN_AND_MEAN) |
164 | #define SDL_HAVE_BLIT_N 1 |
165 | #endif |
166 | |
167 | /* Optimized functions from 'SDL_blit_N.c' |
168 | - RGB565 conversion with Lookup tables */ |
169 | #if !defined(SDL_HAVE_BLIT_N_RGB565) && !defined(SDL_LEAN_AND_MEAN) |
170 | #define SDL_HAVE_BLIT_N_RGB565 1 |
171 | #endif |
172 | |
173 | /* Optimized functions from 'SDL_blit_AUTO.c' |
174 | - blit with modulate color, modulate alpha, any blending mode |
175 | - scaling or not */ |
176 | #if !defined(SDL_HAVE_BLIT_AUTO) && !defined(SDL_LEAN_AND_MEAN) |
177 | #define SDL_HAVE_BLIT_AUTO 1 |
178 | #endif |
179 | |
180 | /* Run-Length-Encoding |
181 | - SDL_SetSurfaceColorKey() called with SDL_RLEACCEL flag */ |
182 | #if !defined(SDL_HAVE_RLE) && !defined(SDL_LEAN_AND_MEAN) |
183 | #define SDL_HAVE_RLE 1 |
184 | #endif |
185 | |
186 | /* Software SDL_Renderer |
187 | - creation of software renderer |
188 | - *not* general blitting functions |
189 | - {blend,draw}{fillrect,line,point} internal functions */ |
190 | #if !defined(SDL_VIDEO_RENDER_SW) && !defined(SDL_LEAN_AND_MEAN) |
191 | #define SDL_VIDEO_RENDER_SW 1 |
192 | #endif |
193 | |
194 | /* STB image conversion */ |
195 | #if !defined(SDL_HAVE_STB) && !defined(SDL_LEAN_AND_MEAN) |
196 | #define SDL_HAVE_STB 1 |
197 | #endif |
198 | |
199 | /* YUV formats |
200 | - handling of YUV surfaces |
201 | - blitting and conversion functions */ |
202 | #if !defined(SDL_HAVE_YUV) && !defined(SDL_LEAN_AND_MEAN) |
203 | #define SDL_HAVE_YUV 1 |
204 | #endif |
205 | |
206 | #ifdef SDL_CAMERA_DISABLED |
207 | #undef SDL_CAMERA_DRIVER_ANDROID |
208 | #undef SDL_CAMERA_DRIVER_COREMEDIA |
209 | #undef SDL_CAMERA_DRIVER_DUMMY |
210 | #undef SDL_CAMERA_DRIVER_EMSCRIPTEN |
211 | #undef SDL_CAMERA_DRIVER_MEDIAFOUNDATION |
212 | #undef SDL_CAMERA_DRIVER_PIPEWIRE |
213 | #undef SDL_CAMERA_DRIVER_V4L2 |
214 | #undef SDL_CAMERA_DRIVER_VITA |
215 | #endif |
216 | |
217 | #ifdef SDL_RENDER_DISABLED |
218 | #undef SDL_VIDEO_RENDER_SW |
219 | #undef SDL_VIDEO_RENDER_D3D |
220 | #undef SDL_VIDEO_RENDER_D3D11 |
221 | #undef SDL_VIDEO_RENDER_D3D12 |
222 | #undef SDL_VIDEO_RENDER_GPU |
223 | #undef SDL_VIDEO_RENDER_METAL |
224 | #undef SDL_VIDEO_RENDER_OGL |
225 | #undef SDL_VIDEO_RENDER_OGL_ES2 |
226 | #undef SDL_VIDEO_RENDER_PS2 |
227 | #undef SDL_VIDEO_RENDER_PSP |
228 | #undef SDL_VIDEO_RENDER_VITA_GXM |
229 | #undef SDL_VIDEO_RENDER_VULKAN |
230 | #endif // SDL_RENDER_DISABLED |
231 | |
232 | #ifdef SDL_GPU_DISABLED |
233 | #undef SDL_GPU_D3D12 |
234 | #undef SDL_GPU_METAL |
235 | #undef SDL_GPU_VULKAN |
236 | #undef SDL_VIDEO_RENDER_GPU |
237 | #endif // SDL_GPU_DISABLED |
238 | |
239 | #if !defined(HAVE_LIBC) |
240 | // If not using _any_ C runtime, these have to be defined before SDL_thread.h |
241 | // gets included, so internal SDL_CreateThread calls will not try to reference |
242 | // the (unavailable and unneeded) _beginthreadex/_endthreadex functions. |
243 | #define SDL_BeginThreadFunction NULL |
244 | #define SDL_EndThreadFunction NULL |
245 | #endif |
246 | |
247 | #ifdef SDL_NOLONGLONG |
248 | #error We cannot build a valid SDL3 library without long long support |
249 | #endif |
250 | |
251 | /* Enable internal definitions in SDL API headers */ |
252 | #define SDL_INTERNAL |
253 | |
254 | #include <SDL3/SDL.h> |
255 | #include <SDL3/SDL_intrin.h> |
256 | |
257 | #define SDL_MAIN_NOIMPL // don't drag in header-only implementation of SDL_main |
258 | #include <SDL3/SDL_main.h> |
259 | |
260 | // Set up for C function definitions, even when using C++ |
261 | #ifdef __cplusplus |
262 | extern "C" { |
263 | #endif |
264 | |
265 | #include "SDL_utils_c.h" |
266 | #include "SDL_hashtable.h" |
267 | |
268 | // Do any initialization that needs to happen before threads are started |
269 | extern void SDL_InitMainThread(void); |
270 | |
271 | /* The internal implementations of these functions have up to nanosecond precision. |
272 | We can expose these functions as part of the API if we want to later. |
273 | */ |
274 | extern bool SDLCALL SDL_WaitSemaphoreTimeoutNS(SDL_Semaphore *sem, Sint64 timeoutNS); |
275 | extern bool SDLCALL SDL_WaitConditionTimeoutNS(SDL_Condition *cond, SDL_Mutex *mutex, Sint64 timeoutNS); |
276 | extern bool SDLCALL SDL_WaitEventTimeoutNS(SDL_Event *event, Sint64 timeoutNS); |
277 | |
278 | // Ends C function definitions when using C++ |
279 | #ifdef __cplusplus |
280 | } |
281 | #endif |
282 | |
283 | #endif // SDL_internal_h_ |
284 | |