DEADSOFTWARE

more implemented functions for allegro port
[d2df-sdl.git] / src / lib / allegro4 / allegro.pas
1 {$LONGSTRINGS ON}
2 {$MACRO ON}
4 {$IF DEFINED(GO32V2)}
5 {$LINKLIB liballeg.a}
6 {$LINKLIB libc.a}
7 {$LINKLIB libgcc.a}
8 {$DEFINE LibraryLibAllegroDecl := cdecl}
9 {$DEFINE LibraryLibAllegroImp := cdecl; external}
10 {$DEFINE LibraryLibAllegroVar := cvar; external}
11 {$ELSEIF DEFINED(UNIX)}
12 {$LINKLIB liballeg.so}
13 {$DEFINE LibraryLibAllegroDecl := cdecl}
14 {$DEFINE LibraryLibAllegroImp := cdecl; external 'alleg'}
15 {$DEFINE LibraryLibAllegroVar := cvar; external 'alleg'}
16 {$ELSE}
17 {$ERROR unsupported platform!}
18 {$ENDIF}
20 unit allegro;
22 interface
24 uses ctypes;
26 const
27 {$IF DEFINED(GO32V2)}
28 ALLEGRO_VERSION = 4;
29 ALEGRO_SUB_VERSION = 2;
30 ALLEGRO_WIP_VERSION = 3;
31 ALLEGRO_VERSION_STR = '4.2.3';
32 {$ELSEIF DEFINED(UNIX)}
33 ALLEGRO_VERSION = 4;
34 ALEGRO_SUB_VERSION = 4;
35 ALLEGRO_WIP_VERSION = 2;
36 ALLEGRO_VERSION_STR = '4.4.2';
37 {$ELSE}
38 {$ERROR unsupported platform!}
39 {$ENDIF}
41 SYSTEM_AUTODETECT = 0;
42 SYSTEM_NONE = $4e4f4e45;
44 GFX_TEXT = -1;
45 GFX_AUTODETECT = 0;
46 GFX_AUTODETECT_FULLSCREEN = 1;
47 GFX_AUTODETECT_WINDOWED = 2;
48 GFX_SAFE = $53414645;
50 DRAW_MODE_SOLID = 0;
51 DRAW_MODE_XOR = 1;
52 DRAW_MODE_COPY_PATTERN = 2;
53 DRAW_MODE_SOLID_PATTERN = 3;
54 DRAW_MODE_MASKED_PATTERN = 4;
55 DRAW_MODE_TRANS = 5;
57 KEY_A = 1;
58 KEY_B = 2;
59 KEY_C = 3;
60 KEY_D = 4;
61 KEY_E = 5;
62 KEY_F = 6;
63 KEY_G = 7;
64 KEY_H = 8;
65 KEY_I = 9;
66 KEY_J = 10;
67 KEY_K = 11;
68 KEY_L = 12;
69 KEY_M = 13;
70 KEY_N = 14;
71 KEY_O = 15;
72 KEY_P = 16;
73 KEY_Q = 17;
74 KEY_R = 18;
75 KEY_S = 19;
76 KEY_T = 20;
77 KEY_U = 21;
78 KEY_V = 22;
79 KEY_W = 23;
80 KEY_X = 24;
81 KEY_Y = 25;
82 KEY_Z = 26;
83 KEY_0 = 27;
84 KEY_1 = 28;
85 KEY_2 = 29;
86 KEY_3 = 30;
87 KEY_4 = 31;
88 KEY_5 = 32;
89 KEY_6 = 33;
90 KEY_7 = 34;
91 KEY_8 = 35;
92 KEY_9 = 36;
93 KEY_0_PAD = 37;
94 KEY_1_PAD = 38;
95 KEY_2_PAD = 39;
96 KEY_3_PAD = 40;
97 KEY_4_PAD = 41;
98 KEY_5_PAD = 42;
99 KEY_6_PAD = 43;
100 KEY_7_PAD = 44;
101 KEY_8_PAD = 45;
102 KEY_9_PAD = 46;
103 KEY_F1 = 47;
104 KEY_F2 = 48;
105 KEY_F3 = 49;
106 KEY_F4 = 50;
107 KEY_F5 = 51;
108 KEY_F6 = 52;
109 KEY_F7 = 53;
110 KEY_F8 = 54;
111 KEY_F9 = 55;
112 KEY_F10 = 56;
113 KEY_F11 = 57;
114 KEY_F12 = 58;
115 KEY_ESC = 59;
116 KEY_TILDE = 60;
117 KEY_MINUS = 61;
118 KEY_EQUALS = 62;
119 KEY_BACKSPACE = 63;
120 KEY_TAB = 64;
121 KEY_OPENBRACE = 65;
122 KEY_CLOSEBRACE = 66;
123 KEY_ENTER = 67;
124 KEY_COLON = 68;
125 KEY_QUOTE = 69;
126 KEY_BACKSLASH = 70;
127 KEY_BACKSLASH2 = 71;
128 KEY_COMMA = 72;
129 KEY_STOP = 73;
130 KEY_SLASH = 74;
131 KEY_SPACE = 75;
132 KEY_INSERT = 76;
133 KEY_DEL = 77;
134 KEY_HOME = 78;
135 KEY_END = 79;
136 KEY_PGUP = 80;
137 KEY_PGDN = 81;
138 KEY_LEFT = 82;
139 KEY_RIGHT = 83;
140 KEY_UP = 84;
141 KEY_DOWN = 85;
142 KEY_SLASH_PAD = 86;
143 KEY_ASTERISK = 87;
144 KEY_MINUS_PAD = 88;
145 KEY_PLUS_PAD = 89;
146 KEY_DEL_PAD = 90;
147 KEY_ENTER_PAD = 91;
148 KEY_PRTSCR = 92;
149 KEY_PAUSE = 93;
150 KEY_ABNT_C1 = 94;
151 KEY_YEN = 95;
152 KEY_KANA = 96;
153 KEY_CONVERT = 97;
154 KEY_NOCONVERT = 98;
155 KEY_AT = 99;
156 KEY_CIRCUMFLEX = 100;
157 KEY_COLON2 = 101;
158 KEY_KANJI = 102;
159 KEY_EQUALS_PAD = 103;
160 KEY_BACKQUOTE = 104;
161 KEY_SEMICOLON = 105;
162 KEY_COMMAND = 106;
163 KEY_UNKNOWN1 = 107;
164 KEY_UNKNOWN2 = 108;
165 KEY_UNKNOWN3 = 109;
166 KEY_UNKNOWN4 = 110;
167 KEY_UNKNOWN5 = 111;
168 KEY_UNKNOWN6 = 112;
169 KEY_UNKNOWN7 = 113;
170 KEY_UNKNOWN8 = 114;
171 KEY_MODIFIERS = 115;
172 KEY_LSHIFT = 115;
173 KEY_RSHIFT = 116;
174 KEY_LCONTROL = 117;
175 KEY_RCONTROL = 118;
176 KEY_ALT = 119;
177 KEY_ALTGR = 120;
178 KEY_LWIN = 121;
179 KEY_RWIN = 122;
180 KEY_MENU = 123;
181 KEY_SCRLOCK = 124;
182 KEY_NUMLOCK = 125;
183 KEY_CAPSLOCK = 126;
184 KEY_MAX = 127;
186 KB_SHIFT_FLAG = $0001;
187 KB_CTRL_FLAG = $0002;
188 KB_ALT_FLAG = $0004;
189 KB_LWIN_FLAG = $0008;
190 KB_RWIN_FLAG = $0010;
191 KB_MENU_FLAG = $0020;
192 KB_COMMAND_FLAG = $0040;
193 KB_SCROLOCK_FLAG = $0100;
194 KB_NUMLOCK_FLAG = $0200;
195 KB_CAPSLOCK_FLAG = $0400;
196 KB_INALTSEQ_FLAG = $0800;
197 KB_ACCENT1_FLAG = $1000;
198 KB_ACCENT2_FLAG = $2000;
199 KB_ACCENT3_FLAG = $4000;
200 KB_ACCENT4_FLAG = $8000;
202 ALLEGRO_ERROR_SIZE = 256;
203 PAL_SIZE = 256;
205 type
206 PBITMAP = ^BITMAP;
207 BITMAP = record
208 w, h: cint;
209 clip: cint;
210 cl, cr, ct, cb: cint;
211 vtable: Pointer; {PGFX_VTABLE}
212 write_bank: Pointer;
213 read_bank: Pointer;
214 dat: Pointer;
215 id: culong;
216 extra: Pointer;
217 x_ofs: cint;
218 y_ofs: cint;
219 seg: cint;
220 line: Pointer;
221 end;
223 PGFX_MODE = ^GFX_MODE;
224 GFX_MODE = record
225 width, height, bpp: cint;
226 end;
228 PGFX_MODE_LIST = ^GFX_MODE_LIST;
229 GFX_MODE_LIST = record
230 num_modes: cint;
231 mode: PGFX_MODE;
232 end;
234 RGB = record
235 r, g, b, filler: cuchar;
236 end;
238 PALETTE = array [0..PAL_SIZE - 1] of RGB;
239 PPALETTE = ^PALETTE;
241 KeyboardCallback = procedure (scancode: cint); LibraryLibAllegroDecl;
242 AtExitCallback = procedure; LibraryLibAllegroDecl;
243 AtExitFunction = function (func: AtExitCallback): cint; LibraryLibAllegroDecl;
244 TimerIntCallback = procedure; LibraryLibAllegroDecl;
246 var
247 allegro_id: array [0..ALLEGRO_ERROR_SIZE] of char; LibraryLibAllegroVar;
248 allegro_error: array [0..ALLEGRO_ERROR_SIZE] of char; LibraryLibAllegroVar;
249 keyboard_lowlevel_callback: KeyboardCallback; LibraryLibAllegroVar;
250 screen: PBITMAP; LibraryLibAllegroVar;
252 black_palette: PALETTE; LibraryLibAllegroVar;
253 desktop_palette: PALETTE; LibraryLibAllegroVar;
254 default_palette: PALETTE; LibraryLibAllegroVar;
255 _current_palette: PALETTE; LibraryLibAllegroVar;
257 function get_desktop_resolution (width, height: Pcint): cint; LibraryLibAllegroImp;
258 function get_gfx_mode_list (card: cint): PGFX_MODE_LIST; LibraryLibAllegroImp;
259 procedure destroy_gfx_mode_list (gfx_mode_list: PGFX_MODE_LIST); LibraryLibAllegroImp;
260 function set_gfx_mode (card, w, h, v_w, v_h: cint): cint; LibraryLibAllegroImp;
261 procedure set_window_title (name: Pchar); LibraryLibAllegroImp;
262 function create_video_bitmap (width, height: cint): PBITMAP; LibraryLibAllegroImp;
263 procedure destroy_bitmap (bitmap: PBITMAP); LibraryLibAllegroImp;
264 function show_video_bitmap (bitmap: PBITMAP): cint; LibraryLibAllegroImp;
265 function poll_keyboard: cint; LibraryLibAllegroImp;
266 function install_keyboard: cint; LibraryLibAllegroImp;
267 procedure remove_keyboard; LibraryLibAllegroImp;
268 function _install_allegro_version_check (system_id: cint; errno_ptr: Pcint; atexit_ptr: AtExitFunction; version: cint): cint; LibraryLibAllegroImp;
270 function install_allegro (system_id: cint; errno_ptr: Pcint; atexit_ptr: AtExitFunction): cint; inline; (* macros *)
271 function allegro_init: cint; inline; (* macros *)
273 function install_timer: cint; LibraryLibAllegroImp;
274 procedure remove_timer; LibraryLibAllegroImp;
275 procedure set_keyboard_rate (delay, _repeat: cint); LibraryLibAllegroImp;
276 function makeacol (r, g, b, a: cint): cint; LibraryLibAllegroImp;
277 function makecol (r, g, b: cint): cint; LibraryLibAllegroImp;
278 procedure clear_to_color (source: PBITMAP; color: cint); LibraryLibAllegroImp;
279 procedure putpixel (bmp: PBITMAP; x, y, color: cint); LibraryLibAllegroImp;
280 function getpixel (bmp: PBITMAP; x, y: cint): cint; LibraryLibAllegroImp;
281 procedure fastline (bmp: PBITMAP; x1, y_1, x2, y2, color: cint); LibraryLibAllegroImp;
282 procedure draw_sprite (bmp, sprite: PBITMAP; x, y: cint); LibraryLibAllegroImp;
283 procedure draw_sprite_v_flip (bmp, sprite: PBITMAP; x, y: cint); LibraryLibAllegroImp;
284 procedure draw_sprite_h_flip (bmp, sprite: PBITMAP; x, y: cint); LibraryLibAllegroImp;
285 procedure draw_sprite_vh_flip (bmp, sprite: PBITMAP; x, y: cint); LibraryLibAllegroImp;
286 procedure rect (bmp: PBITMAP; x1, y_1, x2, y2, color: cint); LibraryLibAllegroImp;
287 procedure rectfill (bmp: PBITMAP; x1, y_1, x2, y2, color: cint); LibraryLibAllegroImp;
288 function create_bitmap (width, height: cint): PBITMAP; LibraryLibAllegroImp;
289 function create_system_bitmap (width, height: cint): PBITMAP; LibraryLibAllegroImp;
290 procedure allegro_exit; LibraryLibAllegroImp;
292 procedure rest (time: cuint); LibraryLibAllegroImp;
293 function install_int_ex (proc: TimerIntCallback; speed: clong): cint; LibraryLibAllegroImp;
294 procedure blit (source, dest: PBITMAP; source_x, source_y, dest_x, dest_y, width, height: cint); LibraryLibAllegroImp;
295 procedure masked_blit (source, dest: PBITMAP; source_x, source_y, dest_x, dest_y, width, height: cint); LibraryLibAllegroImp;
296 procedure set_clip_rect (bitmap: PBITMAP; x1, y1, x2, y2: cint); LibraryLibAllegroImp;
297 procedure get_clip_rect (bitmap: PBITMAP; var x1, y1, x2, y2: cint); LibraryLibAllegroImp;
299 procedure set_palette (const p: PALETTE); LibraryLibAllegroImp;
300 procedure set_color_depth (depth: cint); LibraryLibAllegroImp;
302 // function _install_allegro (system_id: cint; errno_prt: Pcint; AtExitFunction): cint; LibraryLibAllegroImp;
304 (* MACRO *)
305 function TIMERS_PER_SECOND: clong; inline;
306 function SECS_TO_TIMER (x: clong): clong; inline;
307 function MSEC_TO_TIMER (x: clong): clong; inline;
308 function BPS_TO_TIMER (x: clong): clong; inline;
309 function BPM_TO_TIMER (x: clong): clong; inline;
311 implementation
313 function install_allegro (system_id: cint; errno_ptr: Pcint; atexit_ptr: AtExitFunction): cint; inline;
314 begin
315 install_allegro := _install_allegro_version_check(system_id, errno_ptr, atexit_ptr, (ALLEGRO_VERSION shl 16) OR (ALEGRO_SUB_VERSION shl 8) OR ALLEGRO_WIP_VERSION)
316 end;
318 function allegro_init: cint; inline;
319 begin
320 (* original macros sets atexit_ptr *)
321 (* original macros sets libc errno? *)
322 allegro_init := _install_allegro_version_check(SYSTEM_AUTODETECT, nil, nil, (ALLEGRO_VERSION shl 16) OR (ALEGRO_SUB_VERSION shl 8) OR ALLEGRO_WIP_VERSION)
323 end;
327 function TIMERS_PER_SECOND: clong; inline;
328 begin
329 TIMERS_PER_SECOND := 1193181
330 end;
332 function SECS_TO_TIMER (x: clong): clong; inline;
333 begin
334 SECS_TO_TIMER := x * TIMERS_PER_SECOND
335 end;
337 function MSEC_TO_TIMER (x: clong): clong; inline;
338 begin
339 MSEC_TO_TIMER := x * TIMERS_PER_SECOND div 1000
340 end;
342 function BPS_TO_TIMER (x: clong): clong; inline;
343 begin
344 BPS_TO_TIMER := TIMERS_PER_SECOND div x
345 end;
347 function BPM_TO_TIMER (x: clong): clong; inline;
348 begin
349 BPM_TO_TIMER := 60 * TIMERS_PER_SECOND div x
350 end;
352 end.