DEADSOFTWARE

fix SDL2 for osx-ppc
[d2df-sdl.git] / src / lib / sdl2 / sdl2.pas
1 {$MODE DELPHI}
2 unit SDL2;
4 {
5 Simple DirectMedia Layer
6 Copyright (C) 1997-2013 Sam Lantinga <slouken@libsdl.org>
8 Pascal-Header-Conversion
9 Copyright (C) 2012-2014 Tim Blume aka End/EV1313
11 SDL.pas is based on the files:
12 "sdl.h",
13 "sdl_audio.h",
14 "sdl_blendmode.h",
15 "sdl_clipboard.h",
16 "sdl_cpuinfo.h",
17 "sdl_events.h",
18 "sdl_error.h",
19 "sdl_filesystem.h",
20 "sdl_gamecontroller.h",
21 "sdl_gesture.h",
22 "sdl_haptic.h",
23 "sdl_hints.h",
24 "sdl_joystick.h",
25 "sdl_keyboard.h",
26 "sdl_keycode.h",
27 "sdl_loadso.h",
28 "sdl_log.h",
29 "sdl_pixels.h",
30 "sdl_power.h",
31 "sdl_main.h",
32 "sdl_messagebox.h",
33 "sdl_mouse.h",
34 "sdl_mutex.h",
35 "sdl_rect.h",
36 "sdl_render.h",
37 "sdl_rwops.h",
38 "sdl_scancode.h",
39 "sdl_shape.h",
40 "sdl_stdinc.h",
41 "sdl_surface.h",
42 "sdl_system.h",
43 "sdl_syswm.h",
44 "sdl_thread.h",
45 "sdl_timer.h",
46 "sdl_touch.h",
47 "sdl_version.h",
48 "sdl_video.h",
49 "sdl_types.h"
51 I will not translate:
52 "sdl_opengl.h",
53 "sdl_opengles.h"
54 "sdl_opengles2.h"
56 cause there's a much better OpenGL-Header avaible at delphigl.com:
58 the dglopengl.pas
60 Parts of the SDL.pas are from the SDL-1.2-Headerconversion from the JEDI-Team,
61 written by Domenique Louis and others.
63 I've changed the names of the dll for 32 & 64-Bit, so theres no conflict
64 between 32 & 64 bit Libraries.
66 This software is provided 'as-is', without any express or implied
67 warranty. In no case will the authors be held liable for any damages
68 arising from the use of this software.
70 Permission is granted to anyone to use this software for any purpose,
71 including commercial applications, and to alter it and redistribute it
72 freely, subject to the following restrictions:
74 1. The origin of this software must not be misrepresented; you must not
75 claim that you wrote the original software. If you use this software
76 in a product, an acknowledgment in the product documentation would be
77 appreciated but is not required.
78 2. Altered source versions must be plainly marked as such, and must not be
79 misrepresented as being the original software.
80 3. This notice may not be removed or altered from any source distribution.
82 Special Thanks to:
84 - DelphiGL.com - Community
85 - Domenique Louis and everyone else from the JEDI-Team
86 - Sam Latinga and everyone else from the SDL-Team
87 }
89 {
90 Changelog:
91 ----------
92 ? 31.01.2016: updated sdlevents.inc to SDL2 2.0.4, adressing issue #24 (thx to imantsg)
93 ? 16.01.2016: Delphi 6+ bugfixes/compatibility. Thx to Peter Karpov for identifiying and testing.
94 v.1.80-stable; 09.10.2014: added sdl_cpuinfo.h and sdl_clipboard.h
95 v.1.74-stable; 10.11.2013: added sdl_gamecontroller.h
96 v.1.73-stable; 08.11.2013: added sdl_hints.h and some keystate helpers
97 thx to Cybermonkey!
98 v.1.72-stable; 23.09.2013: fixed bug with procedures without parameters
99 (they must have brakets)
100 v.1.70-stable; 17.09.2013: added "sdl_messagebox.h" and "sdl_haptic.h"
101 v.1.63-stable; 16.09.2013: added libs sdl2_image and sdl2_ttf and added sdl_audio.h
102 v.1.62-stable; 03.09.2013: fixed.
103 v.1.61-stable; 02.09.2013: now it should REALLY work with Mac...
104 v.1.60-stable; 01.09.2013: now it should work with Delphi XE4 for Windows and
105 MacOS and of course Lazarus. thx to kotai :D
106 v.1.55-Alpha; 24.08.2013: fixed bug with SDL_GetEventState thx to d.l.i.w.
107 v.1.54-Alpha; 24.08.2013: added sdl_loadso.h
108 v.1.53-Alpha; 24.08.2013: renamed *really* and fixed linux comp.
109 v.1.52-Alpha; 24.08.2013: renamed sdl.pas to sdl2.pas
110 v.1.51-Alpha; 24.08.2013: added sdl_platform.h
111 v.1.50-Alpha; 24.08.2013: the header is now modular. thx for the hint from d.l.i.w.
112 v.1.40-Alpha; 13.08.2013: Added MacOS compatibility (thx to stoney-fd)
113 v.1.34-Alpha; 05.08.2013: Added missing functions from sdl_thread.h
114 v.1.33-Alpha; 31.07.2013: Added missing units for Linux. thx to Cybermonkey
115 v.1.32-Alpha; 31.07.2013: Fixed three bugs, thx to grieferatwork
116 v.1.31-Alpha; 30.07.2013: Added "sdl_power.h"
117 v.1.30-Alpha; 26.07.2013: Added "sdl_thread.h" and "sdl_mutex.h"
118 v.1.25-Alpha; 29.07.2013: Added Makros for SDL_RWops
119 v.1.24-Alpha; 28.07.2013: Fixed bug with RWops and size_t
120 v.1.23-Alpha; 27.07.2013: Fixed two bugs, thx to GrieferAtWork
121 v.1.22-Alpha; 24.07.2013: Added "sdl_shape.h" and TSDL_Window
122 (and ordered the translated header list ^^)
123 v.1.21-Alpha; 23.07.2013: Added TSDL_Error
124 v.1.20-Alpha; 19.07.2013: Added "sdl_timer.h"
125 v.1.10-Alpha; 09.07.2013: Added "sdl_render.h"
126 v.1.00-Alpha; 05.07.2013: Initial Alpha-Release.
129 {$DEFINE SDL}
131 {$I jedi.inc}
133 interface
135 {$IFDEF WINDOWS}
136 uses
137 Windows;
138 {$ENDIF}
140 {$IF DEFINED(UNIX)}
141 {$IF NOT DEFINED(HAIKU) AND NOT DEFINED(ANDROID) AND NOT DEFINED(DARWIN)}
142 uses
143 X,
144 XLib;
145 {$ENDIF}
146 {$ENDIF}
148 {$IFDEF DARWIN}
149 uses
150 X,
151 XLib,
152 CocoaAll;
153 {$ENDIF}
155 const
157 {$IFDEF WINDOWS}
158 SDL_LibName = 'SDL2.dll';
159 {$ENDIF}
161 {$IF DEFINED(HAIKU)}
162 SDL_LibName = 'libSDL2.so.0';
163 {$ELSEIF DEFINED(UNIX)}
164 {$IFDEF DARWIN}
165 SDL_LibName = 'libSDL2.dylib';
166 {$ELSE}
167 {$IFDEF FPC}
168 SDL_LibName = 'libSDL2.so';
169 {$ELSE}
170 SDL_LibName = 'libSDL2.so.0';
171 {$ENDIF}
172 {$ENDIF}
173 {$ENDIF}
175 {$IFDEF MACOS}
176 SDL_LibName = 'SDL2';
177 {$IFDEF FPC}
178 {$linklib libSDL2}
179 {$ENDIF}
180 {$ENDIF}
182 {$I sdltype.inc}
183 {$I sdlversion.inc}
184 {$I sdlerror.inc}
185 {$I sdlplatform.inc}
186 {$I sdlpower.inc}
187 {$I sdlthread.inc}
188 {$I sdlmutex.inc}
189 {$I sdltimer.inc}
190 {$I sdlpixels.inc}
191 {$I sdlrect.inc}
192 {$I sdlrwops.inc}
193 {$I sdlaudio.inc}
194 {$I sdlblendmode.inc}
195 {$I sdlsurface.inc}
196 {$I sdlshape.inc}
197 {$I sdlvideo.inc}
198 {$I sdlhints.inc}
199 {$I sdlloadso.inc}
200 {$I sdlmessagebox.inc}
201 {$I sdlrenderer.inc}
202 {$I sdlscancode.inc}
203 {$I sdlkeyboard.inc}
204 {$I sdlmouse.inc}
205 {$I sdljoystick.inc}
206 {$I sdlgamecontroller.inc}
207 {$I sdlhaptic.inc}
208 {$I sdltouch.inc}
209 {$I sdlgesture.inc}
210 {$I sdlsyswm.inc}
211 {$I sdlevents.inc}
212 {$I sdlclipboard.inc}
213 {$I sdlcpuinfo.inc}
214 {$I sdlfilesystem.inc}
215 {$I sdllog.inc}
216 {$I sdlsystem.inc}
217 {$I sdl.inc}
219 implementation
221 //from "sdl_version.h"
222 procedure SDL_VERSION(Out x: TSDL_Version);
223 begin
224 x.major := SDL_MAJOR_VERSION;
225 x.minor := SDL_MINOR_VERSION;
226 x.patch := SDL_PATCHLEVEL;
227 end;
229 function SDL_VERSIONNUM(X,Y,Z: UInt32): Cardinal;
230 begin
231 Result := X*1000 + Y*100 + Z;
232 end;
234 function SDL_COMPILEDVERSION: Cardinal;
235 begin
236 Result := SDL_VERSIONNUM(SDL_MAJOR_VERSION,
237 SDL_MINOR_VERSION,
238 SDL_PATCHLEVEL);
239 end;
241 function SDL_VERSION_ATLEAST(X,Y,Z: Cardinal): Boolean;
242 begin
243 Result := SDL_COMPILEDVERSION >= SDL_VERSIONNUM(X,Y,Z);
244 end;
246 //from "sdl_mouse.h"
247 function SDL_Button(button: SInt32): SInt32;
248 begin
249 Result := 1 shl (button - 1);
250 end;
252 {$IFDEF WINDOWS}
253 //from "sdl_thread.h"
255 function SDL_CreateThread(fn: TSDL_ThreadFunction; name: PAnsiChar; data: Pointer): PSDL_Thread; overload;
256 begin
257 Result := SDL_CreateThread(fn,name,data,nil,nil);
258 end;
260 {$ENDIF}
262 //from "sdl_rect.h"
263 function SDL_RectEmpty(X: TSDL_Rect): Boolean;
264 begin
265 Result := (X.w <= 0) or (X.h <= 0);
266 end;
268 function SDL_RectEquals(A: TSDL_Rect; B: TSDL_Rect): Boolean;
269 begin
270 Result := (A.x = B.x) and (A.y = B.y) and (A.w = B.w) and (A.h = B.h);
271 end;
273 //from "sdl_rwops.h"
275 function SDL_RWsize(ctx: PSDL_RWops): SInt64;
276 begin
277 Result := ctx^.size(ctx);
278 end;
280 function SDL_RWseek(ctx: PSDL_RWops; offset: SInt64; whence: SInt32): SInt64;
281 begin
282 Result := ctx^.seek(ctx,offset,whence);
283 end;
285 function SDL_RWtell(ctx: PSDL_RWops): SInt64;
286 begin
287 Result := ctx^.seek(ctx, 0, RW_SEEK_CUR);
288 end;
290 function SDL_RWread(ctx: PSDL_RWops; ptr: Pointer; size: size_t; n: size_t): size_t;
291 begin
292 Result := ctx^.read(ctx, ptr, size, n);
293 end;
295 function SDL_RWwrite(ctx: PSDL_RWops; ptr: Pointer; size: size_t; n: size_t): size_t;
296 begin
297 Result := ctx^.write(ctx, ptr, size, n);
298 end;
300 function SDL_RWclose(ctx: PSDL_RWops): SInt32;
301 begin
302 Result := ctx^.close(ctx);
303 end;
305 //from "sdl_audio.h"
307 function SDL_LoadWAV(_file: PAnsiChar; spec: PSDL_AudioSpec; audio_buf: PPUInt8; audio_len: PUInt32): PSDL_AudioSpec;
308 begin
309 Result := SDL_LoadWAV_RW(SDL_RWFromFile(_file, 'rb'), 1, spec, audio_buf, audio_len);
310 end;
312 function SDL_AUDIO_BITSIZE(x: Cardinal): Cardinal;
313 begin
314 Result := x and SDL_AUDIO_MASK_BITSIZE;
315 end;
317 function SDL_AUDIO_ISFLOAT(x: Cardinal): Cardinal;
318 begin
319 Result := x and SDL_AUDIO_MASK_DATATYPE;
320 end;
322 function SDL_AUDIO_ISBIGENDIAN(x: Cardinal): Cardinal;
323 begin
324 Result := x and SDL_AUDIO_MASK_ENDIAN;
325 end;
327 function SDL_AUDIO_ISSIGNED(x: Cardinal): Cardinal;
328 begin
329 Result := x and SDL_AUDIO_MASK_SIGNED;
330 end;
332 function SDL_AUDIO_ISINT(x: Cardinal): Cardinal;
333 begin
334 Result := not SDL_AUDIO_ISFLOAT(x);
335 end;
337 function SDL_AUDIO_ISLITTLEENDIAN(x: Cardinal): Cardinal;
338 begin
339 Result := not SDL_AUDIO_ISLITTLEENDIAN(x);
340 end;
342 function SDL_AUDIO_ISUNSIGNED(x: Cardinal): Cardinal;
343 begin
344 Result := not SDL_AUDIO_ISSIGNED(x);
345 end;
347 //from "sdl_pixels.h"
349 function SDL_PIXELFLAG(X: Cardinal): Cardinal;
350 begin
351 Result := (X shr 28) and $0F;
352 end;
354 function SDL_PIXELTYPE(X: Cardinal): Cardinal;
355 begin
356 Result := (X shr 24) and $0F;
357 end;
359 function SDL_PIXELORDER(X: Cardinal): Cardinal;
360 begin
361 Result := (X shr 20) and $0F;
362 end;
364 function SDL_PIXELLAYOUT(X: Cardinal): Cardinal;
365 begin
366 Result := (X shr 16) and $0F;
367 end;
369 function SDL_BITSPERPIXEL(X: Cardinal): Cardinal;
370 begin
371 Result := (X shr 8) and $FF;
372 end;
374 function SDL_IsPixelFormat_FOURCC(format: Variant): Boolean;
375 begin
376 {* The flag is set to 1 because 0x1? is not in the printable ASCII range *}
377 Result := format and SDL_PIXELFLAG(format) <> 1;
378 end;
380 //from "sdl_surface.h"
381 function SDL_LoadBMP(_file: PAnsiChar): PSDL_Surface;
382 begin
383 Result := SDL_LoadBMP_RW(SDL_RWFromFile(_file, 'rb'), 1);
384 end;
386 function SDL_SaveBMP(Const surface:PSDL_Surface; Const filename:AnsiString):sInt32;
387 begin
388 Result := SDL_SaveBMP_RW(surface, SDL_RWFromFile(PAnsiChar(filename), 'wb'), 1)
389 end;
391 {**
392 * Evaluates to true if the surface needs to be locked before access.
393 *}
394 function SDL_MUSTLOCK(Const S:PSDL_Surface):Boolean;
395 begin
396 Result := ((S^.flags and SDL_RLEACCEL) <> 0)
397 end;
399 //from "sdl_video.h"
400 function SDL_WindowPos_IsUndefined(X: Variant): Variant;
401 begin
402 Result := (X and $FFFF0000) = SDL_WINDOWPOS_UNDEFINED_MASK;
403 end;
405 function SDL_WindowPos_IsCentered(X: Variant): Variant;
406 begin
407 Result := (X and $FFFF0000) = SDL_WINDOWPOS_CENTERED_MASK;
408 end;
410 //from "sdl_events.h"
412 function SDL_GetEventState(type_: UInt32): UInt8;
413 begin
414 Result := SDL_EventState(type_, SDL_QUERY);
415 end;
417 // from "sdl_timer.h"
418 function SDL_TICKS_PASSED(Const A, B:UInt32):Boolean;
419 begin
420 Result := ((Int64(B) - Int64(A)) <= 0)
421 end;
423 // from "sdl_gamecontroller.h"
424 {**
425 * Load a set of mappings from a file, filtered by the current SDL_GetPlatform()
426 *}
427 function SDL_GameControllerAddMappingsFromFile(Const FilePath:PAnsiChar):SInt32;
428 begin
429 Result := SDL_GameControllerAddMappingsFromRW(SDL_RWFromFile(FilePath, 'rb'), 1)
430 end;
432 end.