DEADSOFTWARE

FreeBSD build fixes
[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 {$IFDEF UNIX}
141 uses
142 X,
143 XLib;
144 {$ENDIF}
146 {$IFDEF DARWIN}
147 uses
148 X,
149 XLib,
150 CocoaAll;
151 {$ENDIF}
153 const
155 {$IFDEF WINDOWS}
156 SDL_LibName = 'SDL2.dll';
157 {$ENDIF}
159 {$IFDEF UNIX}
160 {$IFDEF DARWIN}
161 SDL_LibName = 'libSDL2.dylib';
162 {$ELSE}
163 {$IFDEF FPC}
164 SDL_LibName = 'libSDL2.so';
165 {$ELSE}
166 SDL_LibName = 'libSDL2.so.0';
167 {$ENDIF}
168 {$ENDIF}
169 {$ENDIF}
171 {$IFDEF MACOS}
172 SDL_LibName = 'SDL2';
173 {$IFDEF FPC}
174 {$linklib libSDL2}
175 {$ENDIF}
176 {$ENDIF}
178 {$I sdltype.inc}
179 {$I sdlversion.inc}
180 {$I sdlerror.inc}
181 {$I sdlplatform.inc}
182 {$I sdlpower.inc}
183 {$I sdlthread.inc}
184 {$I sdlmutex.inc}
185 {$I sdltimer.inc}
186 {$I sdlpixels.inc}
187 {$I sdlrect.inc}
188 {$I sdlrwops.inc}
189 {$I sdlaudio.inc}
190 {$I sdlblendmode.inc}
191 {$I sdlsurface.inc}
192 {$I sdlshape.inc}
193 {$I sdlvideo.inc}
194 {$I sdlhints.inc}
195 {$I sdlloadso.inc}
196 {$I sdlmessagebox.inc}
197 {$I sdlrenderer.inc}
198 {$I sdlscancode.inc}
199 {$I sdlkeyboard.inc}
200 {$I sdlmouse.inc}
201 {$I sdljoystick.inc}
202 {$I sdlgamecontroller.inc}
203 {$I sdlhaptic.inc}
204 {$I sdltouch.inc}
205 {$I sdlgesture.inc}
206 {$I sdlsyswm.inc}
207 {$I sdlevents.inc}
208 {$I sdlclipboard.inc}
209 {$I sdlcpuinfo.inc}
210 {$I sdlfilesystem.inc}
211 {$I sdllog.inc}
212 {$I sdlsystem.inc}
213 {$I sdl.inc}
215 implementation
217 //from "sdl_version.h"
218 procedure SDL_VERSION(Out x: TSDL_Version);
219 begin
220 x.major := SDL_MAJOR_VERSION;
221 x.minor := SDL_MINOR_VERSION;
222 x.patch := SDL_PATCHLEVEL;
223 end;
225 function SDL_VERSIONNUM(X,Y,Z: UInt32): Cardinal;
226 begin
227 Result := X*1000 + Y*100 + Z;
228 end;
230 function SDL_COMPILEDVERSION: Cardinal;
231 begin
232 Result := SDL_VERSIONNUM(SDL_MAJOR_VERSION,
233 SDL_MINOR_VERSION,
234 SDL_PATCHLEVEL);
235 end;
237 function SDL_VERSION_ATLEAST(X,Y,Z: Cardinal): Boolean;
238 begin
239 Result := SDL_COMPILEDVERSION >= SDL_VERSIONNUM(X,Y,Z);
240 end;
242 //from "sdl_mouse.h"
243 function SDL_Button(button: SInt32): SInt32;
244 begin
245 Result := 1 shl (button - 1);
246 end;
248 {$IFDEF WINDOWS}
249 //from "sdl_thread.h"
251 function SDL_CreateThread(fn: TSDL_ThreadFunction; name: PAnsiChar; data: Pointer): PSDL_Thread; overload;
252 begin
253 Result := SDL_CreateThread(fn,name,data,nil,nil);
254 end;
256 {$ENDIF}
258 //from "sdl_rect.h"
259 function SDL_RectEmpty(X: TSDL_Rect): Boolean;
260 begin
261 Result := (X.w <= 0) or (X.h <= 0);
262 end;
264 function SDL_RectEquals(A: TSDL_Rect; B: TSDL_Rect): Boolean;
265 begin
266 Result := (A.x = B.x) and (A.y = B.y) and (A.w = B.w) and (A.h = B.h);
267 end;
269 //from "sdl_rwops.h"
271 function SDL_RWsize(ctx: PSDL_RWops): SInt64;
272 begin
273 Result := ctx^.size(ctx);
274 end;
276 function SDL_RWseek(ctx: PSDL_RWops; offset: SInt64; whence: SInt32): SInt64;
277 begin
278 Result := ctx^.seek(ctx,offset,whence);
279 end;
281 function SDL_RWtell(ctx: PSDL_RWops): SInt64;
282 begin
283 Result := ctx^.seek(ctx, 0, RW_SEEK_CUR);
284 end;
286 function SDL_RWread(ctx: PSDL_RWops; ptr: Pointer; size: size_t; n: size_t): size_t;
287 begin
288 Result := ctx^.read(ctx, ptr, size, n);
289 end;
291 function SDL_RWwrite(ctx: PSDL_RWops; ptr: Pointer; size: size_t; n: size_t): size_t;
292 begin
293 Result := ctx^.write(ctx, ptr, size, n);
294 end;
296 function SDL_RWclose(ctx: PSDL_RWops): SInt32;
297 begin
298 Result := ctx^.close(ctx);
299 end;
301 //from "sdl_audio.h"
303 function SDL_LoadWAV(_file: PAnsiChar; spec: PSDL_AudioSpec; audio_buf: PPUInt8; audio_len: PUInt32): PSDL_AudioSpec;
304 begin
305 Result := SDL_LoadWAV_RW(SDL_RWFromFile(_file, 'rb'), 1, spec, audio_buf, audio_len);
306 end;
308 function SDL_AUDIO_BITSIZE(x: Cardinal): Cardinal;
309 begin
310 Result := x and SDL_AUDIO_MASK_BITSIZE;
311 end;
313 function SDL_AUDIO_ISFLOAT(x: Cardinal): Cardinal;
314 begin
315 Result := x and SDL_AUDIO_MASK_DATATYPE;
316 end;
318 function SDL_AUDIO_ISBIGENDIAN(x: Cardinal): Cardinal;
319 begin
320 Result := x and SDL_AUDIO_MASK_ENDIAN;
321 end;
323 function SDL_AUDIO_ISSIGNED(x: Cardinal): Cardinal;
324 begin
325 Result := x and SDL_AUDIO_MASK_SIGNED;
326 end;
328 function SDL_AUDIO_ISINT(x: Cardinal): Cardinal;
329 begin
330 Result := not SDL_AUDIO_ISFLOAT(x);
331 end;
333 function SDL_AUDIO_ISLITTLEENDIAN(x: Cardinal): Cardinal;
334 begin
335 Result := not SDL_AUDIO_ISLITTLEENDIAN(x);
336 end;
338 function SDL_AUDIO_ISUNSIGNED(x: Cardinal): Cardinal;
339 begin
340 Result := not SDL_AUDIO_ISSIGNED(x);
341 end;
343 //from "sdl_pixels.h"
345 function SDL_PIXELFLAG(X: Cardinal): Cardinal;
346 begin
347 Result := (X shr 28) and $0F;
348 end;
350 function SDL_PIXELTYPE(X: Cardinal): Cardinal;
351 begin
352 Result := (X shr 24) and $0F;
353 end;
355 function SDL_PIXELORDER(X: Cardinal): Cardinal;
356 begin
357 Result := (X shr 20) and $0F;
358 end;
360 function SDL_PIXELLAYOUT(X: Cardinal): Cardinal;
361 begin
362 Result := (X shr 16) and $0F;
363 end;
365 function SDL_BITSPERPIXEL(X: Cardinal): Cardinal;
366 begin
367 Result := (X shr 8) and $FF;
368 end;
370 function SDL_IsPixelFormat_FOURCC(format: Variant): Boolean;
371 begin
372 {* The flag is set to 1 because 0x1? is not in the printable ASCII range *}
373 Result := format and SDL_PIXELFLAG(format) <> 1;
374 end;
376 //from "sdl_surface.h"
377 function SDL_LoadBMP(_file: PAnsiChar): PSDL_Surface;
378 begin
379 Result := SDL_LoadBMP_RW(SDL_RWFromFile(_file, 'rb'), 1);
380 end;
382 function SDL_SaveBMP(Const surface:PSDL_Surface; Const filename:AnsiString):sInt32;
383 begin
384 Result := SDL_SaveBMP_RW(surface, SDL_RWFromFile(PAnsiChar(filename), 'wb'), 1)
385 end;
387 {**
388 * Evaluates to true if the surface needs to be locked before access.
389 *}
390 function SDL_MUSTLOCK(Const S:PSDL_Surface):Boolean;
391 begin
392 Result := ((S^.flags and SDL_RLEACCEL) <> 0)
393 end;
395 //from "sdl_video.h"
396 function SDL_WindowPos_IsUndefined(X: Variant): Variant;
397 begin
398 Result := (X and $FFFF0000) = SDL_WINDOWPOS_UNDEFINED_MASK;
399 end;
401 function SDL_WindowPos_IsCentered(X: Variant): Variant;
402 begin
403 Result := (X and $FFFF0000) = SDL_WINDOWPOS_CENTERED_MASK;
404 end;
406 //from "sdl_events.h"
408 function SDL_GetEventState(type_: UInt32): UInt8;
409 begin
410 Result := SDL_EventState(type_, SDL_QUERY);
411 end;
413 // from "sdl_timer.h"
414 function SDL_TICKS_PASSED(Const A, B:UInt32):Boolean;
415 begin
416 Result := ((Int64(B) - Int64(A)) <= 0)
417 end;
419 // from "sdl_gamecontroller.h"
420 {**
421 * Load a set of mappings from a file, filtered by the current SDL_GetPlatform()
422 *}
423 function SDL_GameControllerAddMappingsFromFile(Const FilePath:PAnsiChar):SInt32;
424 begin
425 Result := SDL_GameControllerAddMappingsFromRW(SDL_RWFromFile(FilePath, 'rb'), 1)
426 end;
428 end.