1 /*
2 
3 Boost Software License - Version 1.0 - August 17th, 2003
4 
5 Permission is hereby granted, free of charge, to any person or organization
6 obtaining a copy of the software and accompanying documentation covered by
7 this license (the "Software") to use, reproduce, display, distribute,
8 execute, and transmit the Software, and to prepare derivative works of the
9 Software, and to permit third-parties to whom the Software is furnished to
10 do so, all subject to the following:
11 
12 The copyright notices in the Software and this entire statement, including
13 the above license grant, this restriction and the following disclaimer,
14 must be included in all copies of the Software, in whole or in part, and
15 all derivative works of the Software, unless such copies or derivative
16 works are solely in the form of machine-executable object code generated by
17 a source language processor.
18 
19 THE SOFTWARE IS PROVIDED = "aS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
22 SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
23 FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
24 ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
25 DEALINGS IN THE SOFTWARE.
26 
27 */
28 module derelict.allegro5.types;
29 
30 private {
31     import core.stdc.stdint;
32     import core.stdc.time;
33 }
34 
35 public {
36     version(Windows) {
37         alias off_t = long;
38     } else {
39         import core.sys.posix.sys.types : off_t;
40     }
41 }
42 
43 
44 // altime.h
45 struct ALLEGRO_TIMEOUT {
46     ulong __pad1__;
47     ulong __pad2__;
48 }
49 
50 // base.h
51 enum ALLEGRO_VERSION = 5;
52 enum ALLEGRO_SUB_VERSION = 2;
53 enum ALLEGRO_WIP_VERSION = 0;
54 enum ALLEGRO_RELEASE_NUMBER = 1;
55 enum ALLEGRO_VERSION_STR = "5.2.0";
56 enum ALLEGRO_DATA_STR = "2016";
57 enum ALLEGRO_DATE = 20130616;
58 enum uint ALLEGRO_VERSION_INT = ((ALLEGRO_VERSION << 24) | (ALLEGRO_SUB_VERSION << 16) |
59                                  (ALLEGRO_WIP_VERSION << 8) | ALLEGRO_RELEASE_NUMBER);
60 
61 enum ALLEGRO_PI = 3.14159265358979323846;
62 
63 uint AL_ID(int a, int b, int c, int d) {
64     return ((a << 24) | (b << 16) | (c << 8) | d);
65 }
66 
67 // bitmap.h
68 struct ALLEGRO_BITMAP;
69 
70 enum {
71     ALLEGRO_MEMORY_BITMAP            = 0x0001,
72     _ALLEGRO_KEEP_BITMAP_FORMAT       = 0x0002,
73     ALLEGRO_FORCE_LOCKING            = 0x0004,
74     ALLEGRO_NO_PRESERVE_TEXTURE      = 0x0008,
75     _ALLEGRO_ALPHA_TEST               = 0x0010,
76     _ALLEGRO_INTERNAL_OPENGL         = 0x0020,
77     ALLEGRO_MIN_LINEAR               = 0x0040,
78     ALLEGRO_MAG_LINEAR               = 0x0080,
79     ALLEGRO_MIPMAP                   = 0x0100,
80     _ALLEGRO_NO_PREMULTIPLIED_ALPHA   = 0x0200,
81     ALLEGRO_VIDEO_BITMAP             = 0x0400,
82     ALLEGRO_CONVERT_BITMAP           = 0x1000,
83 }
84 
85 // bitmap_draw.h
86 enum {
87     ALLEGRO_FLIP_HORIZONTAL = 0x00001,
88     ALLEGRO_FLIP_VERTICAL   = 0x00002,
89 }
90 
91 // bitmap_io.h
92 enum {
93    ALLEGRO_KEEP_BITMAP_FORMAT       = 0x0002,
94    ALLEGRO_NO_PREMULTIPLIED_ALPHA   = 0x0200,
95    ALLEGRO_KEEP_INDEX               = 0x0800
96 }
97 
98 extern(C) nothrow {
99     alias ALLEGRO_IIO_LOADER_FUNCTION = ALLEGRO_BITMAP* function(const(char)*);
100     alias ALLEGRO_IIO_FS_LOADER_FUNCTION = ALLEGRO_BITMAP* function(ALLEGRO_FILE*);
101     alias ALLEGRO_IIO_SAVER_FUNCTION = bool function(const(char)*, ALLEGRO_BITMAP*);
102     alias ALLEGRO_IIO_FS_SAVER_FUNCTION = bool function(ALLEGRO_FILE*, ALLEGRO_BITMAP*);
103     alias ALLEGRO_IIO_IDENTIFIER_FUNCTION = bool function(ALLEGRO_FILE*);
104 }
105 
106 // bitmap_lock.h
107 enum {
108    ALLEGRO_LOCK_READWRITE  = 0,
109    ALLEGRO_LOCK_READONLY   = 1,
110    ALLEGRO_LOCK_WRITEONLY  = 2,
111 }
112 
113 struct ALLEGRO_LOCKED_REGION {
114     void* data;
115     int format;
116     int pitch;
117     int pixel_size;
118 }
119 
120 // blender.h
121 alias ALLEGRO_BLEND_MODE = int;
122 enum {
123    ALLEGRO_ZERO                 = 0,
124    ALLEGRO_ONE                  = 1,
125    ALLEGRO_ALPHA                = 2,
126    ALLEGRO_INVERSE_ALPHA        = 3,
127    ALLEGRO_SRC_COLOR            = 4,
128    ALLEGRO_DEST_COLOR           = 5,
129    ALLEGRO_INVERSE_SRC_COLOR    = 6,
130    ALLEGRO_INVERSE_DEST_COLOR   = 7,
131    ALLEGRO_CONST_COLOR          = 8,
132    ALLEGRO_INVERSE_CONST_COLOR  = 9,
133    ALLEGRO_NUM_BLEND_MODES,
134 }
135 
136 alias ALLEGRO_BLEND_OPERATIONS = int;
137 enum {
138    ALLEGRO_ADD                = 0,
139    ALLEGRO_SRC_MINUS_DEST     = 1,
140    ALLEGRO_DEST_MINUS_SRC     = 2,
141    ALLEGRO_NUM_BLEND_OPERATIONS,
142 }
143 
144 // color.h
145 struct ALLEGRO_COLOR {
146     float r, g, b, a;
147 }
148 
149 alias ALLEGRO_PIXEL_FORMAT = int;
150 enum {
151     ALLEGRO_PIXEL_FORMAT_ANY = 0,
152     ALLEGRO_PIXEL_FORMAT_ANY_NO_ALPHA,
153     ALLEGRO_PIXEL_FORMAT_ANY_WITH_ALPHA,
154     ALLEGRO_PIXEL_FORMAT_ANY_15_NO_ALPHA,
155     ALLEGRO_PIXEL_FORMAT_ANY_16_NO_ALPHA,
156     ALLEGRO_PIXEL_FORMAT_ANY_16_WITH_ALPHA,
157     ALLEGRO_PIXEL_FORMAT_ANY_24_NO_ALPHA,
158     ALLEGRO_PIXEL_FORMAT_ANY_32_NO_ALPHA,
159     ALLEGRO_PIXEL_FORMAT_ANY_32_WITH_ALPHA,
160     ALLEGRO_PIXEL_FORMAT_ARGB_8888,
161     ALLEGRO_PIXEL_FORMAT_RGBA_8888,
162     ALLEGRO_PIXEL_FORMAT_ARGB_4444,
163     ALLEGRO_PIXEL_FORMAT_RGB_888,
164     ALLEGRO_PIXEL_FORMAT_RGB_565,
165     ALLEGRO_PIXEL_FORMAT_RGB_555,
166     ALLEGRO_PIXEL_FORMAT_RGBA_5551,
167     ALLEGRO_PIXEL_FORMAT_ARGB_1555,
168     ALLEGRO_PIXEL_FORMAT_ABGR_8888,
169     ALLEGRO_PIXEL_FORMAT_XBGR_8888,
170     ALLEGRO_PIXEL_FORMAT_BGR_888,
171     ALLEGRO_PIXEL_FORMAT_BGR_565,
172     ALLEGRO_PIXEL_FORMAT_BGR_555,
173     ALLEGRO_PIXEL_FORMAT_RGBX_8888,
174     ALLEGRO_PIXEL_FORMAT_XRGB_8888,
175     ALLEGRO_PIXEL_FORMAT_ABGR_F32,
176     ALLEGRO_PIXEL_FORMAT_ABGR_8888_LE,
177     ALLEGRO_PIXEL_FORMAT_RGBA_4444,
178     ALLEGRO_PIXEL_FORMAT_SINGLE_CHANNEL_8 ,
179     ALLEGRO_PIXEL_FORMAT_COMPRESSED_RGBA_DXT1,
180     ALLEGRO_PIXEL_FORMAT_COMPRESSED_RGBA_DXT3,
181     ALLEGRO_PIXEL_FORMAT_COMPRESSED_RGBA_DXT5,
182     ALLEGRO_NUM_PIXEL_FORMATS
183 }
184 
185 // config.h
186 struct ALLEGRO_CONFIG;
187 struct ALLEGRO_CONFIG_SECTION;
188 struct ALLEGRO_CONFIG_ENTRY;
189 
190 // display.h
191 enum {
192     ALLEGRO_WINDOWED                    = 1 << 0,
193     ALLEGRO_FULLSCREEN                  = 1 << 1,
194     ALLEGRO_OPENGL                      = 1 << 2,
195     ALLEGRO_DIRECT3D_INTERNAL           = 1 << 3,
196     ALLEGRO_RESIZABLE                   = 1 << 4,
197     ALLEGRO_FRAMELESS                   = 1 << 5,
198     ALLEGRO_NOFRAME                     = ALLEGRO_FRAMELESS, /* older synonym */
199     ALLEGRO_GENERATE_EXPOSE_EVENTS      = 1 << 6,
200     ALLEGRO_OPENGL_3_0                  = 1 << 7,
201     ALLEGRO_OPENGL_FORWARD_COMPATIBLE   = 1 << 8,
202     ALLEGRO_FULLSCREEN_WINDOW           = 1 << 9,
203     ALLEGRO_MINIMIZED                   = 1 << 10,
204     ALLEGRO_PROGRAMMABLE_PIPELINE       = 1 << 11,
205     ALLEGRO_GTK_TOPLEVEL_INTERNAL       = 1 << 12,
206     ALLEGRO_MAXIMIZED                   = 1 << 13,
207     ALLEGRO_OPENGL_ES_PROFILE           = 1 << 14,
208 }
209 
210 alias ALLEGRO_DISPLAY_OPTIONS = int;
211 enum {
212     ALLEGRO_RED_SIZE,
213     ALLEGRO_GREEN_SIZE,
214     ALLEGRO_BLUE_SIZE,
215     ALLEGRO_ALPHA_SIZE,
216     ALLEGRO_RED_SHIFT,
217     ALLEGRO_GREEN_SHIFT,
218     ALLEGRO_BLUE_SHIFT,
219     ALLEGRO_ALPHA_SHIFT,
220     ALLEGRO_ACC_RED_SIZE,
221     ALLEGRO_ACC_GREEN_SIZE,
222     ALLEGRO_ACC_BLUE_SIZE,
223     ALLEGRO_ACC_ALPHA_SIZE,
224     ALLEGRO_STEREO,
225     ALLEGRO_AUX_BUFFERS,
226     ALLEGRO_COLOR_SIZE,
227     ALLEGRO_DEPTH_SIZE,
228     ALLEGRO_STENCIL_SIZE,
229     ALLEGRO_SAMPLE_BUFFERS,
230     ALLEGRO_SAMPLES,
231     ALLEGRO_RENDER_METHOD,
232     ALLEGRO_FLOAT_COLOR,
233     ALLEGRO_FLOAT_DEPTH,
234     ALLEGRO_SINGLE_BUFFER,
235     ALLEGRO_SWAP_METHOD,
236     ALLEGRO_COMPATIBLE_DISPLAY,
237     ALLEGRO_UPDATE_DISPLAY_REGION,
238     ALLEGRO_VSYNC,
239     ALLEGRO_MAX_BITMAP_SIZE,
240     ALLEGRO_SUPPORT_NPOT_BITMAP,
241     ALLEGRO_CAN_DRAW_INTO_BITMAP,
242     ALLEGRO_SUPPORT_SEPARATE_ALPHA,
243     ALLEGRO_DISPLAY_OPTIONS_COUNT,
244     ALLEGRO_AUTO_CONVERT_BITMAPS,
245     ALLEGRO_SUPPORTED_ORIENTATIONS,
246     ALLEGRO_OPENGL_MAJOR_VERSION,
247     ALLEGRO_OPENGL_MINOR_VERSION,
248 }
249 
250 enum {
251     ALLEGRO_DONTCARE,
252     ALLEGRO_REQUIRE,
253     ALLEGRO_SUGGEST,
254 }
255 
256 alias ALLEGRO_DISPLAY_ORIENTATION = int;
257 enum {
258    ALLEGRO_DISPLAY_ORIENTATION_UNKNOWN = 0,
259    ALLEGRO_DISPLAY_ORIENTATION_0_DEGREES = 1,
260    ALLEGRO_DISPLAY_ORIENTATION_90_DEGREES = 2,
261    ALLEGRO_DISPLAY_ORIENTATION_180_DEGREES = 4,
262    ALLEGRO_DISPLAY_ORIENTATION_270_DEGREES = 8,
263    ALLEGRO_DISPLAY_ORIENTATION_PORTRAIT = 5,
264    ALLEGRO_DISPLAY_ORIENTATION_LANDSCAPE = 10,
265    ALLEGRO_DISPLAY_ORIENTATION_ALL = 15,
266    ALLEGRO_DISPLAY_ORIENTATION_FACE_UP = 16,
267    ALLEGRO_DISPLAY_ORIENTATION_FACE_DOWN = 32
268 }
269 
270 enum _ALLEGRO_PRIM_MAX_USER_ATTR = 10;
271 
272 struct ALLEGRO_DISPLAY;
273 
274 // events.h
275 alias ALLEGRO_EVENT_TYPE = uint;
276 
277 enum {
278     ALLEGRO_EVENT_JOYSTICK_AXIS               =  1,
279     ALLEGRO_EVENT_JOYSTICK_BUTTON_DOWN        =  2,
280     ALLEGRO_EVENT_JOYSTICK_BUTTON_UP          =  3,
281     ALLEGRO_EVENT_JOYSTICK_CONFIGURATION      =  4,
282 
283     ALLEGRO_EVENT_KEY_DOWN                    = 10,
284     ALLEGRO_EVENT_KEY_CHAR                    = 11,
285     ALLEGRO_EVENT_KEY_UP                      = 12,
286 
287     ALLEGRO_EVENT_MOUSE_AXES                  = 20,
288     ALLEGRO_EVENT_MOUSE_BUTTON_DOWN           = 21,
289     ALLEGRO_EVENT_MOUSE_BUTTON_UP             = 22,
290     ALLEGRO_EVENT_MOUSE_ENTER_DISPLAY         = 23,
291     ALLEGRO_EVENT_MOUSE_LEAVE_DISPLAY         = 24,
292     ALLEGRO_EVENT_MOUSE_WARPED                = 25,
293 
294     ALLEGRO_EVENT_TIMER                       = 30,
295 
296     ALLEGRO_EVENT_DISPLAY_EXPOSE              = 40,
297     ALLEGRO_EVENT_DISPLAY_RESIZE              = 41,
298     ALLEGRO_EVENT_DISPLAY_CLOSE               = 42,
299     ALLEGRO_EVENT_DISPLAY_LOST                = 43,
300     ALLEGRO_EVENT_DISPLAY_FOUND               = 44,
301     ALLEGRO_EVENT_DISPLAY_SWITCH_IN           = 45,
302     ALLEGRO_EVENT_DISPLAY_SWITCH_OUT          = 46,
303     ALLEGRO_EVENT_DISPLAY_ORIENTATION         = 47,
304     ALLEGRO_EVENT_DISPLAY_HALT_DRAWING        = 48,
305     ALLEGRO_EVENT_DISPLAY_RESUME_DRAWING      = 49,
306 
307     ALLEGRO_EVENT_TOUCH_BEGIN                 = 50,
308     ALLEGRO_EVENT_TOUCH_END                   = 51,
309     ALLEGRO_EVENT_TOUCH_MOVE                  = 52,
310     ALLEGRO_EVENT_TOUCH_CANCEL                = 53,
311 
312     ALLEGRO_EVENT_DISPLAY_CONNECTED           = 60,
313     ALLEGRO_EVENT_DISPLAY_DISCONNECTED        = 61,
314 }
315 
316 bool ALLEGRO_EVENT_TYPE_IS_USER(uint t) {
317     return t >= 512;
318 }
319 
320 alias ALLEGRO_GET_EVENT_TYPE = AL_ID;
321 
322 struct ALLEGRO_EVENT_SOURCE {
323     int[32] __pad = void;
324 }
325 
326 template _AL_EVENT_HEADER(T) {
327     ALLEGRO_EVENT_TYPE type;
328     T* source;
329     double timestamp;
330 }
331 
332 struct ALLEGRO_ANY_EVENT {
333     mixin _AL_EVENT_HEADER!(ALLEGRO_EVENT_SOURCE);
334 }
335 
336 struct ALLEGRO_DISPLAY_EVENT {
337     mixin _AL_EVENT_HEADER!(ALLEGRO_DISPLAY);
338     int x, y;
339     int width, height;
340     int orientation;
341 }
342 
343 struct ALLEGRO_JOYSTICK_EVENT {
344     mixin _AL_EVENT_HEADER!(ALLEGRO_JOYSTICK);
345     ALLEGRO_JOYSTICK* id;
346     int stick;
347     int axis;
348     float pos;
349     int button;
350 }
351 
352 struct ALLEGRO_KEYBOARD_EVENT {
353     mixin _AL_EVENT_HEADER!(ALLEGRO_KEYBOARD);
354     ALLEGRO_DISPLAY* display;
355     int keycode;
356     int unichar;
357     uint modifiers;
358     bool repeat;
359 }
360 
361 struct ALLEGRO_MOUSE_EVENT {
362     mixin _AL_EVENT_HEADER!(ALLEGRO_MOUSE);
363     ALLEGRO_DISPLAY* display;
364     int x, y, z, w;
365     int dx, dy, dz, dw;
366     uint button;
367     float pressure;
368 }
369 
370 struct ALLEGRO_TIMER_EVENT {
371     mixin _AL_EVENT_HEADER!(ALLEGRO_TIMER);
372     long count;
373     double error;
374 }
375 
376 struct ALLEGRO_TOUCH_EVENT {
377     mixin _AL_EVENT_HEADER!(ALLEGRO_TOUCH_INPUT);
378     ALLEGRO_DISPLAY* display;
379     int id;
380     float x, y;
381     float dx, dy;
382     bool primary;
383 }
384 
385 struct ALLEGRO_USER_EVENT {
386     mixin _AL_EVENT_HEADER!(ALLEGRO_EVENT_SOURCE);
387     void* __internal__descr;
388     intptr_t data1;
389     intptr_t data2;
390     intptr_t data3;
391     intptr_t data4;
392 }
393 
394 union ALLEGRO_EVENT {
395     ALLEGRO_EVENT_TYPE type;
396     ALLEGRO_ANY_EVENT any;
397     ALLEGRO_DISPLAY_EVENT display;
398     ALLEGRO_JOYSTICK_EVENT joystick;
399     ALLEGRO_KEYBOARD_EVENT keyboard;
400     ALLEGRO_MOUSE_EVENT mouse;
401     ALLEGRO_TIMER_EVENT timer;
402     ALLEGRO_TOUCH_EVENT touch;
403     ALLEGRO_USER_EVENT user;
404 }
405 
406 struct ALLEGRO_EVENT_QUEUE;
407 
408 // file.h
409 struct ALLEGRO_FILE;
410 
411 struct ALLEGRO_FILE_INTERFACE {
412     extern(C) nothrow {
413         void* function(const(char)*, const(char)*) fi_fopen;
414         void function(ALLEGRO_FILE*) fi_fclose;
415         size_t function(ALLEGRO_FILE*, void*, size_t) fi_fread;
416         size_t function(ALLEGRO_FILE*, const(void)*, size_t) fi_fwrite;
417         bool function(ALLEGRO_FILE*) fi_fflush;
418         long function(ALLEGRO_FILE*) fi_ftell;
419         bool function(ALLEGRO_FILE*, long, int) fi_fseek;
420         bool function(ALLEGRO_FILE*) fi_feof;
421         bool function(ALLEGRO_FILE*) fi_ferror;
422         const(char)* function(ALLEGRO_FILE*) fi_ferrmsg;
423         void function(ALLEGRO_FILE*) fi_fclearerr;
424         int function(ALLEGRO_FILE*, int) fi_fungetc;
425         off_t function(ALLEGRO_FILE*) fi_fsize;
426     }
427 }
428 
429 alias ALLEGRO_SEEK = int;
430 enum {
431     ALLEGRO_SEEK_SET = 0,
432     ALLEGRO_SEEK_CUR,
433     ALLEGRO_SEEK_END,
434 }
435 
436 // fshook.h
437 struct ALLEGRO_FS_ENTRY {
438     const(ALLEGRO_FS_INTERFACE)* vtable;
439 }
440 
441 alias ALLEGRO_FILE_MODE = int;
442 enum {
443     ALLEGRO_FILEMODE_READ    = 1,
444     ALLEGRO_FILEMODE_WRITE   = 1 << 1,
445     ALLEGRO_FILEMODE_EXECUTE = 1 << 2,
446     ALLEGRO_FILEMODE_HIDDEN  = 1 << 3,
447     ALLEGRO_FILEMODE_ISFILE  = 1 << 4,
448     ALLEGRO_FILEMODE_ISDIR   = 1 << 5,
449 }
450 
451 struct ALLEGRO_FS_INTERFACE {
452     extern(C) nothrow {
453         ALLEGRO_FS_ENTRY* function(const(char)*) fs_create_entry;
454         void function(ALLEGRO_FS_ENTRY*) fs_destroy_entry;
455         const(char)* function(ALLEGRO_FS_ENTRY*) fs_entry_name;
456         bool function(ALLEGRO_FS_ENTRY*) fs_update_entry;
457         uint function(ALLEGRO_FS_ENTRY*) fs_entry_mode;
458         time_t function(ALLEGRO_FS_ENTRY*) fs_entry_atime;
459         time_t function(ALLEGRO_FS_ENTRY*) fs_entry_mtime;
460         time_t function(ALLEGRO_FS_ENTRY*) fs_entry_ctime;
461         off_t function(ALLEGRO_FS_ENTRY*) fs_entry_size;
462         bool function(ALLEGRO_FS_ENTRY*) fs_entry_exists;
463         bool function(ALLEGRO_FS_ENTRY*) fs_remove_entry;
464 
465         bool function(ALLEGRO_FS_ENTRY*) fs_open_directory;
466         ALLEGRO_FS_ENTRY* function(ALLEGRO_FS_ENTRY*) fs_read_directory;
467         bool function(ALLEGRO_FS_ENTRY*) fs_close_directory;
468 
469         bool function(const(char)*) fs_filename_exists;
470         bool function(const(char)*) fs_remove_filename;
471         char* function() fs_get_current_directory;
472         bool function(const(char)*) fs_change_directory;
473         bool function(const(char)*) fs_make_directory;
474 
475         ALLEGRO_FILE* function(ALLEGRO_FS_ENTRY*, const(char)*) fs_open_file;
476     }
477 }
478 
479 // Used in the declaration of al_for_each_fs_entry
480 extern(C) nothrow alias foreachCallback = int function(ALLEGRO_FS_ENTRY*,void*);
481 
482 // fullscreen_mode.h
483 struct ALLEGRO_DISPLAY_MODE {
484     int width;
485     int height;
486     int format;
487     int refresh_rate;
488 }
489 
490 // joystick.h
491 private {
492     enum _AL_MAX_JOYSTICK_AXES = 3;
493     enum _AL_MAX_JOYSTICK_STICKS = 8;
494     enum _AL_MAX_JOYSTICK_BUTTONS = 32;
495 }
496 
497 struct ALLEGRO_JOYSTICK;
498 
499 struct _Axes {
500     float[_AL_MAX_JOYSTICK_AXES] axis;
501 }
502 
503 struct ALLEGRO_JOYSTICK_STATE {
504     _Axes[_AL_MAX_JOYSTICK_STICKS] stick;
505     int[_AL_MAX_JOYSTICK_BUTTONS] button;
506 }
507 
508 alias ALLEGRO_JOYFLAGS = int;
509 enum {
510     ALLEGRO_JOYFLAG_DIGITAL  = 0x01,
511     ALLEGRO_JOYFLAG_ANALOGUE = 0x02,
512 }
513 
514 // keycodes.h
515 enum {
516     ALLEGRO_KEY_A     = 1,
517     ALLEGRO_KEY_B        = 2,
518     ALLEGRO_KEY_C        = 3,
519     ALLEGRO_KEY_D        = 4,
520     ALLEGRO_KEY_E        = 5,
521     ALLEGRO_KEY_F        = 6,
522     ALLEGRO_KEY_G        = 7,
523     ALLEGRO_KEY_H        = 8,
524     ALLEGRO_KEY_I        = 9,
525     ALLEGRO_KEY_J        = 10,
526     ALLEGRO_KEY_K        = 11,
527     ALLEGRO_KEY_L        = 12,
528     ALLEGRO_KEY_M        = 13,
529     ALLEGRO_KEY_N        = 14,
530     ALLEGRO_KEY_O        = 15,
531     ALLEGRO_KEY_P        = 16,
532     ALLEGRO_KEY_Q        = 17,
533     ALLEGRO_KEY_R        = 18,
534     ALLEGRO_KEY_S        = 19,
535     ALLEGRO_KEY_T        = 20,
536     ALLEGRO_KEY_U        = 21,
537     ALLEGRO_KEY_V        = 22,
538     ALLEGRO_KEY_W        = 23,
539     ALLEGRO_KEY_X        = 24,
540     ALLEGRO_KEY_Y        = 25,
541     ALLEGRO_KEY_Z        = 26,
542 
543     ALLEGRO_KEY_0        = 27,
544     ALLEGRO_KEY_1        = 28,
545     ALLEGRO_KEY_2        = 29,
546     ALLEGRO_KEY_3        = 30,
547     ALLEGRO_KEY_4        = 31,
548     ALLEGRO_KEY_5        = 32,
549     ALLEGRO_KEY_6        = 33,
550     ALLEGRO_KEY_7        = 34,
551     ALLEGRO_KEY_8        = 35,
552     ALLEGRO_KEY_9        = 36,
553 
554     ALLEGRO_KEY_PAD_0        = 37,
555     ALLEGRO_KEY_PAD_1        = 38,
556     ALLEGRO_KEY_PAD_2        = 39,
557     ALLEGRO_KEY_PAD_3        = 40,
558     ALLEGRO_KEY_PAD_4        = 41,
559     ALLEGRO_KEY_PAD_5        = 42,
560     ALLEGRO_KEY_PAD_6        = 43,
561     ALLEGRO_KEY_PAD_7        = 44,
562     ALLEGRO_KEY_PAD_8        = 45,
563     ALLEGRO_KEY_PAD_9        = 46,
564 
565     ALLEGRO_KEY_F1       = 47,
566     ALLEGRO_KEY_F2       = 48,
567     ALLEGRO_KEY_F3       = 49,
568     ALLEGRO_KEY_F4       = 50,
569     ALLEGRO_KEY_F5       = 51,
570     ALLEGRO_KEY_F6       = 52,
571     ALLEGRO_KEY_F7       = 53,
572     ALLEGRO_KEY_F8       = 54,
573     ALLEGRO_KEY_F9       = 55,
574     ALLEGRO_KEY_F10      = 56,
575     ALLEGRO_KEY_F11      = 57,
576     ALLEGRO_KEY_F12      = 58,
577 
578     ALLEGRO_KEY_ESCAPE   = 59,
579     ALLEGRO_KEY_TILDE        = 60,
580     ALLEGRO_KEY_MINUS        = 61,
581     ALLEGRO_KEY_EQUALS   = 62,
582     ALLEGRO_KEY_BACKSPACE    = 63,
583     ALLEGRO_KEY_TAB      = 64,
584     ALLEGRO_KEY_OPENBRACE    = 65,
585     ALLEGRO_KEY_CLOSEBRACE   = 66,
586     ALLEGRO_KEY_ENTER        = 67,
587     ALLEGRO_KEY_SEMICOLON    = 68,
588     ALLEGRO_KEY_QUOTE        = 69,
589     ALLEGRO_KEY_BACKSLASH    = 70,
590     ALLEGRO_KEY_BACKSLASH2   = 71,
591     ALLEGRO_KEY_COMMA        = 72,
592     ALLEGRO_KEY_FULLSTOP = 73,
593     ALLEGRO_KEY_SLASH        = 74,
594     ALLEGRO_KEY_SPACE        = 75,
595 
596     ALLEGRO_KEY_INSERT   = 76,
597     ALLEGRO_KEY_DELETE   = 77,
598     ALLEGRO_KEY_HOME     = 78,
599     ALLEGRO_KEY_END      = 79,
600     ALLEGRO_KEY_PGUP     = 80,
601     ALLEGRO_KEY_PGDN     = 81,
602     ALLEGRO_KEY_LEFT     = 82,
603     ALLEGRO_KEY_RIGHT        = 83,
604     ALLEGRO_KEY_UP       = 84,
605     ALLEGRO_KEY_DOWN     = 85,
606 
607     ALLEGRO_KEY_PAD_SLASH    = 86,
608     ALLEGRO_KEY_PAD_ASTERISK = 87,
609     ALLEGRO_KEY_PAD_MINUS    = 88,
610     ALLEGRO_KEY_PAD_PLUS = 89,
611     ALLEGRO_KEY_PAD_DELETE   = 90,
612     ALLEGRO_KEY_PAD_ENTER    = 91,
613 
614     ALLEGRO_KEY_PRINTSCREEN  = 92,
615     ALLEGRO_KEY_PAUSE        = 93,
616 
617     ALLEGRO_KEY_ABNT_C1  = 94,
618     ALLEGRO_KEY_YEN      = 95,
619     ALLEGRO_KEY_KANA     = 96,
620     ALLEGRO_KEY_CONVERT  = 97,
621     ALLEGRO_KEY_NOCONVERT    = 98,
622     ALLEGRO_KEY_AT       = 99,
623     ALLEGRO_KEY_CIRCUMFLEX   = 100,
624     ALLEGRO_KEY_COLON2   = 101,
625     ALLEGRO_KEY_KANJI        = 102,
626 
627     ALLEGRO_KEY_PAD_EQUALS   = 103,
628     ALLEGRO_KEY_BACKQUOTE    = 104,
629     ALLEGRO_KEY_SEMICOLON2   = 105,
630     ALLEGRO_KEY_COMMAND  = 106,
631 
632     ALLEGRO_KEY_BACK = 107,
633     ALLEGRO_KEY_VOLUME_UP = 108,
634     ALLEGRO_KEY_VOLUME_DOWN = 109,
635 
636     ALLEGRO_KEY_SEARCH       = 110,
637     ALLEGRO_KEY_DPAD_CENTER  = 111,
638     ALLEGRO_KEY_BUTTON_X     = 112,
639     ALLEGRO_KEY_BUTTON_Y     = 113,
640     ALLEGRO_KEY_DPAD_UP      = 114,
641     ALLEGRO_KEY_DPAD_DOWN    = 115,
642     ALLEGRO_KEY_DPAD_LEFT    = 116,
643     ALLEGRO_KEY_DPAD_RIGHT   = 117,
644     ALLEGRO_KEY_SELECT       = 118,
645     ALLEGRO_KEY_START        = 119,
646     ALLEGRO_KEY_BUTTON_L1    = 120,
647     ALLEGRO_KEY_BUTTON_R1    = 121,
648     ALLEGRO_KEY_BUTTON_L2    = 122,
649     ALLEGRO_KEY_BUTTON_R2    = 123,
650     ALLEGRO_KEY_BUTTON_A     = 124,
651     ALLEGRO_KEY_BUTTON_B     = 125,
652     ALLEGRO_KEY_THUMBL       = 126,
653     ALLEGRO_KEY_THUMBR       = 127,
654 
655     ALLEGRO_KEY_UNKNOWN      = 128,
656 
657     ALLEGRO_KEY_MODIFIERS    = 215,
658 
659     ALLEGRO_KEY_LSHIFT   = 215,
660     ALLEGRO_KEY_RSHIFT   = 216,
661     ALLEGRO_KEY_LCTRL    = 217,
662     ALLEGRO_KEY_RCTRL    = 218,
663     ALLEGRO_KEY_ALT      = 219,
664     ALLEGRO_KEY_ALTGR    = 220,
665     ALLEGRO_KEY_LWIN     = 221,
666     ALLEGRO_KEY_RWIN     = 222,
667     ALLEGRO_KEY_MENU     = 223,
668     ALLEGRO_KEY_SCROLLLOCK = 224,
669     ALLEGRO_KEY_NUMLOCK  = 225,
670     ALLEGRO_KEY_CAPSLOCK = 226,
671 
672     ALLEGRO_KEY_MAX,
673 }
674 
675 enum {
676     ALLEGRO_KEYMOD_SHIFT       = 0x00001,
677     ALLEGRO_KEYMOD_CTRL        = 0x00002,
678     ALLEGRO_KEYMOD_ALT         = 0x00004,
679     ALLEGRO_KEYMOD_LWIN        = 0x00008,
680     ALLEGRO_KEYMOD_RWIN        = 0x00010,
681     ALLEGRO_KEYMOD_MENU        = 0x00020,
682     ALLEGRO_KEYMOD_ALTGR       = 0x00040,
683     ALLEGRO_KEYMOD_COMMAND     = 0x00080,
684     ALLEGRO_KEYMOD_SCROLLLOCK  = 0x00100,
685     ALLEGRO_KEYMOD_NUMLOCK     = 0x00200,
686     ALLEGRO_KEYMOD_CAPSLOCK    = 0x00400,
687     ALLEGRO_KEYMOD_INALTSEQ   = 0x00800,
688     ALLEGRO_KEYMOD_ACCENT1     = 0x01000,
689     ALLEGRO_KEYMOD_ACCENT2     = 0x02000,
690     ALLEGRO_KEYMOD_ACCENT3     = 0x04000,
691     ALLEGRO_KEYMOD_ACCENT4     = 0x08000,
692 }
693 
694 // keyboard.h
695 struct ALLEGRO_KEYBOARD;
696 
697 struct ALLEGRO_KEYBOARD_STATE {
698     ALLEGRO_DISPLAY* display;
699     uint[(ALLEGRO_KEY_MAX + 31) / 32] __key_down__internal__;
700 }
701 
702 // memory.h
703 struct ALLEGRO_MEMORY_INTERFACE {
704     extern(C) nothrow {
705         void* function(size_t, int, const(char)*, const(char)*) mi_malloc;
706         void function(void*, int, const(char)*, const(char)*) mi_free;
707         void* function(void*, size_t, int, const(char)*, const(char)*) mi_realloc;
708         void* function(size_t, size_t, int, const(char)*, const(char)*) mi_calloc;
709     }
710 }
711 
712 // monitor.h
713 struct ALLEGRO_MONITOR_INFO {
714     int x1;
715     int y1;
716     int x2;
717     int y2;
718 }
719 
720 enum ALLEGRO_DEFAULT_DISPLAY_ADAPTER = -1;
721 
722 // mouse.h
723 enum ALLEGRO_MOUSE_MAX_EXTRA_AXES = 4;
724 
725 struct ALLEGRO_MOUSE;
726 
727 struct ALLEGRO_MOUSE_STATE {
728     int x;
729     int y;
730     int z;
731     int w;
732     int[ALLEGRO_MOUSE_MAX_EXTRA_AXES] more_axes;
733     int button;
734     float pressure;
735     ALLEGRO_DISPLAY* display;
736 }
737 
738 // mouse_cursor.h
739 struct ALLEGRO_MOUSE_CURSOR;
740 
741 alias ALLEGRO_SYSTEM_MOUSE_CURSOR = int;
742 enum {
743     ALLEGRO_SYSTEM_MOUSE_CURSOR_NONE        =  0,
744     ALLEGRO_SYSTEM_MOUSE_CURSOR_DEFAULT     =  1,
745     ALLEGRO_SYSTEM_MOUSE_CURSOR_ARROW       =  2,
746     ALLEGRO_SYSTEM_MOUSE_CURSOR_BUSY        =  3,
747     ALLEGRO_SYSTEM_MOUSE_CURSOR_QUESTION    =  4,
748     ALLEGRO_SYSTEM_MOUSE_CURSOR_EDIT        =  5,
749     ALLEGRO_SYSTEM_MOUSE_CURSOR_MOVE        =  6,
750     ALLEGRO_SYSTEM_MOUSE_CURSOR_RESIZE_N    =  7,
751     ALLEGRO_SYSTEM_MOUSE_CURSOR_RESIZE_W    =  8,
752     ALLEGRO_SYSTEM_MOUSE_CURSOR_RESIZE_S    =  9,
753     ALLEGRO_SYSTEM_MOUSE_CURSOR_RESIZE_E    = 10,
754     ALLEGRO_SYSTEM_MOUSE_CURSOR_RESIZE_NW   = 11,
755     ALLEGRO_SYSTEM_MOUSE_CURSOR_RESIZE_SW   = 12,
756     ALLEGRO_SYSTEM_MOUSE_CURSOR_RESIZE_SE   = 13,
757     ALLEGRO_SYSTEM_MOUSE_CURSOR_RESIZE_NE   = 14,
758     ALLEGRO_SYSTEM_MOUSE_CURSOR_PROGRESS    = 15,
759     ALLEGRO_SYSTEM_MOUSE_CURSOR_PRECISION   = 16,
760     ALLEGRO_SYSTEM_MOUSE_CURSOR_LINK        = 17,
761     ALLEGRO_SYSTEM_MOUSE_CURSOR_ALT_SELECT  = 18,
762     ALLEGRO_SYSTEM_MOUSE_CURSOR_UNAVAILABLE = 19,
763     ALLEGRO_NUM_SYSTEM_MOUSE_CURSORS,
764 }
765 
766 // path.h
767 version(Windows) {
768     enum ALLEGRO_NATIVE_PATH_SEP = '\\';
769     enum ALLEGRO_NATIVE_DRIVE_SEP = ':';
770 } else {
771     enum ALLEGRO_NATIVE_PATH_SEP = '/';
772     enum ALLEGRO_NATIVE_DRIVE_SEP = '\0';
773 }
774 
775 struct ALLEGRO_PATH;
776 
777 // render_state.h
778 alias ALLEGRO_RENDER_STATE = int;
779 enum {
780     ALLEGRO_ALPHA_TEST = 0x0010,
781     ALLEGRO_WRITE_MASK,
782     ALLEGRO_DEPTH_TEST,
783     ALLEGRO_DEPTH_FUNCTION,
784     ALLEGRO_ALPHA_FUNCTION,
785     ALLEGRO_ALPHA_TEST_VALUE,
786 }
787 
788 alias ALLEGRO_RENDER_FUNCTION = int;
789 enum {
790     ALLEGRO_RENDER_NEVER,
791     ALLEGRO_RENDER_ALWAYS,
792     ALLEGRO_RENDER_LESS,
793     ALLEGRO_RENDER_EQUAL,
794     ALLEGRO_RENDER_LESS_EQUAL,
795     ALLEGRO_RENDER_GREATER,
796     ALLEGRO_RENDER_NOT_EQUAL,
797     ALLEGRO_RENDER_GREATER_EQUAL,
798 }
799 
800 // shader.h
801 struct ALLEGRO_SHADER;
802 
803 alias ALLEGRO_SHADER_TYPE = int;
804 enum {
805     ALLEGRO_VERTEX_SHADER,
806     ALLEGRO_PIXEL_SHADER,
807 }
808 
809 alias ALLEGRO_SHADER_PLATFORM = int;
810 enum {
811     ALLEGRO_SHADER_AUTO,
812     ALLEGRO_SHADER_GLSL,
813     ALLEGRO_SHADER_HLSL,
814 }
815 
816 enum {
817     ALLEGRO_SHADER_VAR_COLOR             = "al_color",
818     ALLEGRO_SHADER_VAR_POS               = "al_pos",
819     ALLEGRO_SHADER_VAR_PROJVIEW_MATRIX   = "al_projview_matrix",
820     ALLEGRO_SHADER_VAR_TEX               = "al_tex",
821     ALLEGRO_SHADER_VAR_TEXCOORD          = "al_texcoord",
822     ALLEGRO_SHADER_VAR_TEX_MATRIX        = "al_tex_matrix",
823     ALLEGRO_SHADER_VAR_USER_ATTR         = "al_user_attr_",
824     ALLEGRO_SHADER_VAR_USE_TEX           = "al_use_tex",
825     ALLEGRO_SHADER_VAR_USE_TEX_MATRIX    = "al_use_tex_matrix",
826 }
827 
828 // system.h
829 struct ALLEGRO_SYSTEM;
830 
831 enum {
832     ALLEGRO_RESOURCES_PATH = 0,
833     ALLEGRO_TEMP_PATH,
834     ALLEGRO_USER_DATA_PATH,
835     ALLEGRO_USER_HOME_PATH,
836     ALLEGRO_USER_SETTINGS_PATH,
837     ALLEGRO_USER_DOCUMENTS_PATH,
838     ALLEGRO_EXENAME_PATH,
839     ALLEGRO_LAST_PATH,
840 }
841 
842 alias ALLEGRO_WRITE_MASK_FLAGS = int;
843 enum {
844     ALLEGRO_MASK_RED = 1 << 0,
845     ALLEGRO_MASK_GREEN = 1 << 1,
846     ALLEGRO_MASK_BLUE = 1 << 2,
847     ALLEGRO_MASK_ALPHA = 1 << 3,
848     ALLEGRO_MASK_DEPTH = 1 << 4,
849     ALLEGRO_MASK_RGB = (ALLEGRO_MASK_RED | ALLEGRO_MASK_GREEN | ALLEGRO_MASK_BLUE),
850     ALLEGRO_MASK_RGBA = (ALLEGRO_MASK_RGB | ALLEGRO_MASK_ALPHA),
851 }
852 
853 // threads.h
854 struct ALLEGRO_THREAD;
855 struct ALLEGRO_MUTEX;
856 struct ALLEGRO_COND;
857 
858 // Callbac for al_create_thread
859 extern(C) nothrow alias threadProc = void* function(ALLEGRO_THREAD*,void*);
860 
861 // timer.h
862 @nogc nothrow {
863     double ALLEGRO_USECS_TO_SECS(double x) { return x / 1_000_000; }
864     double ALLEGRO_MSECS_TO_SECS(double x) { return x / 1_000; }
865     double ALLEGRO_BPS_TO_SECS(double x) {
866         if(x > 0) {
867             return 1.0 / x;
868         } else {
869             return 0;
870         }
871     }
872 
873     double ALLEGRO_BPM_TO_SECS(double x) {
874         if(x > 0) {
875             return 60.0 / x;
876         } else {
877             return 0;
878         }
879     }
880 }
881 
882 struct ALLEGRO_TIMER;
883 
884 // tls.h
885 alias ALLEGRO_STATE_FLAGS = int;
886 enum {
887     ALLEGRO_STATE_NEW_DISPLAY_PARAMETERS = 0x0001,
888     ALLEGRO_STATE_NEW_BITMAP_PARAMETERS  = 0x0002,
889     ALLEGRO_STATE_DISPLAY                = 0x0004,
890     ALLEGRO_STATE_TARGET_BITMAP          = 0x0008,
891     ALLEGRO_STATE_BLENDER                = 0x0010,
892     ALLEGRO_STATE_NEW_FILE_INTERFACE     = 0x0020,
893     ALLEGRO_STATE_TRANSFORM              = 0x0040,
894 
895     ALLEGRO_STATE_BITMAP                 = ALLEGRO_STATE_TARGET_BITMAP + ALLEGRO_STATE_NEW_BITMAP_PARAMETERS,
896 
897     ALLEGRO_STATE_ALL                    = 0xffff,
898 }
899 
900 struct ALLEGRO_STATE {
901     ubyte[1024] _tls = void;
902 }
903 
904 // touch_input.h
905 struct ALLEGRO_TOUCH_INPUT;
906 
907 struct ALLEGRO_TOUCH_STATE {
908     int id;
909     float x, y;
910     float dx, dy;
911     bool primary;
912     ALLEGRO_DISPLAY* display;
913 }
914 
915 enum ALLEGRO_TOUCH_INPUT_MAX_TOUCH_COUNT = 16;
916 
917 struct ALLEGRO_TOUCH_INPUT_STATE {
918     ALLEGRO_TOUCH_STATE[ALLEGRO_TOUCH_INPUT_MAX_TOUCH_COUNT] touches = void;
919 }
920 
921 // transformations.h
922 struct ALLEGRO_TRANSFORM {
923     float[4][4] m;
924 }
925 
926 // utf8.h
927 struct ALLEGRO_USTR {
928     int mlen;
929     int slen;
930     ubyte* data;
931 }
932 
933 alias ALLEGRO_USTR_INFO = ALLEGRO_USTR;