3 * \ \ \L\ \\//\ \ \//\ \ __ __ _ __ ___
4 * \ \ __ \ \ \ \ \ \ \ /'__`\ /'_ `\/\`'__\/ __`\
5 * \ \ \/\ \ \_\ \_ \_\ \_/\ __//\ \L\ \ \ \//\ \L\ \
6 * \ \_\ \_\/\____\/\____\ \____\ \____ \ \_\\ \____/
7 * \/_/\/_/\/____/\/____/\/____/\/___L\ \/_/ \/___/
10 * By Shawn Hargreaves,
16 * Main header file for the Allegro library.
17 * This should be included by everyone and everything.
19 * See readme.txt for copyright information.
27 #error Linux version not finished. Want to help?
31 #error Allegro can only be used with djgpp
38 #define ALLEGRO_VERSION 3
39 #define ALLEGRO_SUB_VERSION 0
40 #define ALLEGRO_VERSION_STR "3.0"
41 #define ALLEGRO_DATE_STR "1997"
43 /* remove these if you only want 256 color graphics support */
44 #define ALLEGRO_COLOR16
45 #define ALLEGRO_COLOR24
46 #define ALLEGRO_COLOR32
50 /*******************************************/
51 /************ Some global stuff ************/
52 /*******************************************/
69 #define MIN(x,y) (((x) < (y)) ? (x) : (y))
70 #define MAX(x,y) (((x) > (y)) ? (x) : (y))
71 #define MID(x,y,z) MAX((x), MIN((y), (z)))
75 #define ABS(x) (((x) >= 0) ? (x) : (-(x)))
79 #define SGN(x) (((x) >= 0) ? 1 : -1)
83 #define __INLINE__ extern inline
94 extern char allegro_id[];
95 extern char allegro_error[];
97 #define OSTYPE_UNKNOWN 0
99 #define OSTYPE_WIN95 2
100 #define OSTYPE_WINNT 3
102 #define OSTYPE_WARP 5
103 #define OSTYPE_DOSEMU 6
104 #define OSTYPE_OPENDOS 7
108 extern int windows_version, windows_sub_version;
115 extern char cpu_vendor[];
116 extern int cpu_family;
117 extern int cpu_model;
120 extern int cpu_cpuid;
122 void lock_bitmap(struct BITMAP *bmp);
123 void lock_sample(struct SAMPLE *spl);
124 void lock_midi(struct MIDI *midi);
129 #define END_OF_FUNCTION(x) void x##_end() { }
130 #define LOCK_VARIABLE(x) _go32_dpmi_lock_data((void *)&x, sizeof(x))
131 #define LOCK_FUNCTION(x) _go32_dpmi_lock_code(x, (long)x##_end - (long)x)
136 #define END_OF_FUNCTION(x)
137 #define LOCK_VARIABLE(x)
138 #define LOCK_FUNCTION(x)
144 /************************************************/
145 /************ Configuration routines ************/
146 /************************************************/
148 void set_config_file(char *filename);
149 void set_config_data(char *data, int length);
150 void override_config_file(char *filename);
151 void override_config_data(char *data, int length);
153 void push_config_state();
154 void pop_config_state();
156 char *get_config_string(char *section, char *name, char *def);
157 int get_config_int(char *section, char *name, int def);
158 int get_config_hex(char *section, char *name, int def);
159 float get_config_float(char *section, char *name, float def);
160 char **get_config_argv(char *section, char *name, int *argc);
162 void set_config_string(char *section, char *name, char *val);
163 void set_config_int(char *section, char *name, int val);
164 void set_config_hex(char *section, char *name, int val);
165 void set_config_float(char *section, char *name, float val);
169 /****************************************/
170 /************ Mouse routines ************/
171 /****************************************/
173 #if !defined alleg_mouse_unused
178 extern volatile int mouse_x;
179 extern volatile int mouse_y;
180 extern volatile int mouse_b;
181 extern volatile int mouse_pos;
183 extern int freeze_mouse_flag;
185 #define MOUSE_FLAG_MOVE 1
186 #define MOUSE_FLAG_LEFT_DOWN 2
187 #define MOUSE_FLAG_LEFT_UP 4
188 #define MOUSE_FLAG_RIGHT_DOWN 8
189 #define MOUSE_FLAG_RIGHT_UP 16
190 #define MOUSE_FLAG_MIDDLE_DOWN 32
191 #define MOUSE_FLAG_MIDDLE_UP 64
193 extern void (*mouse_callback)(int flags);
195 void show_mouse(struct BITMAP *bmp);
196 void position_mouse(int x, int y);
197 void set_mouse_range(int x1, int y1, int x2, int y2);
198 void set_mouse_speed(int xspeed, int yspeed);
199 void set_mouse_sprite(struct BITMAP *sprite);
200 void set_mouse_sprite_focus(int x, int y);
201 void get_mouse_mickeys(int *mickeyx, int *mickeyy);
207 /****************************************/
208 /************ Timer routines ************/
209 /****************************************/
211 #if !defined alleg_timer_unused
213 #define TIMERS_PER_SECOND 1193181L
214 #define SECS_TO_TIMER(x) ((long)(x) * TIMERS_PER_SECOND)
215 #define MSEC_TO_TIMER(x) ((long)(x) * (TIMERS_PER_SECOND / 1000))
216 #define BPS_TO_TIMER(x) (TIMERS_PER_SECOND / (long)(x))
217 #define BPM_TO_TIMER(x) ((60 * TIMERS_PER_SECOND) / (long)(x))
222 int install_int_ex(void (*proc)(), long speed);
223 int install_int(void (*proc)(), long speed);
224 void remove_int(void (*proc)());
226 extern int i_love_bill;
228 extern volatile int retrace_count;
229 extern void (*retrace_proc)();
231 void timer_simulate_retrace(int enable);
233 void rest(long time);
234 void rest_callback(long time, void (*callback)());
240 /*******************************************/
241 /************ Keyboard routines ************/
242 /*******************************************/
244 #if !defined alleg_keyboard_unused
246 int install_keyboard();
247 void remove_keyboard();
249 extern int (*keyboard_callback)(int key);
251 void install_keyboard_hooks(int (*keypressed)(), int (*readkey)());
253 extern volatile char key[128];
254 extern volatile int key_shifts;
256 extern int three_finger_flag;
257 extern int key_led_flag;
261 void simulate_keypress(int key);
263 void set_leds(int leds);
265 extern unsigned char key_ascii_table[128];
266 extern unsigned char key_capslock_table[128];
267 extern unsigned char key_shift_table[128];
268 extern unsigned char key_control_table[128];
269 extern unsigned char key_altgr_table[128];
270 extern unsigned char key_accent1_lower_table[128];
271 extern unsigned char key_accent1_upper_table[128];
272 extern unsigned char key_accent1_shift_lower_table[128];
273 extern unsigned char key_accent1_shift_upper_table[128];
274 extern unsigned char key_accent2_lower_table[128];
275 extern unsigned char key_accent2_upper_table[128];
276 extern unsigned char key_accent2_shift_lower_table[128];
277 extern unsigned char key_accent2_shift_upper_table[128];
278 extern unsigned char key_numlock_table[128];
279 extern unsigned char key_extended_table[128];
280 extern unsigned short key_special_table[128];
282 #define SCANCODE_TO_KEY(c) (((c)<<8) + (int)key_ascii_table[c])
283 #define SCANCODE_TO_CAPS(c) (((c)<<8) + (int)key_capslock_table[c])
284 #define SCANCODE_TO_SHIFT(c) (((c)<<8) + (int)key_shift_table[c])
285 #define SCANCODE_TO_CONTROL(c) (((c)<<8) + (int)key_control_table[c])
286 #define SCANCODE_TO_ALTGR(c) (((c)<<8) + (int)key_altgr_table[c])
287 #define SCANCODE_TO_ALT(c) ((c)<<8)
289 #define KB_SHIFT_FLAG 0x0001
290 #define KB_CTRL_FLAG 0x0002
291 #define KB_ALT_FLAG 0x0004
292 #define KB_LWIN_FLAG 0x0008
293 #define KB_RWIN_FLAG 0x0010
294 #define KB_MENU_FLAG 0x0020
295 #define KB_SCROLOCK_FLAG 0x0100
296 #define KB_NUMLOCK_FLAG 0x0200
297 #define KB_CAPSLOCK_FLAG 0x0400
298 #define KB_INALTSEQ_FLAG 0x0800
299 #define KB_ACCENT1_FLAG 0x1000
300 #define KB_ACCENT1_S_FLAG 0x2000
301 #define KB_ACCENT2_FLAG 0x4000
302 #define KB_ACCENT2_S_FLAG 0x8000
305 #define KB_EXTENDED 2
307 #define KEY_ESC 1 /* keyboard scan codes */
319 #define KEY_EQUALS 13
320 #define KEY_BACKSPACE 14
332 #define KEY_OPENBRACE 26
333 #define KEY_CLOSEBRACE 27
335 #define KEY_CONTROL 29
336 #define KEY_LCONTROL 29
349 #define KEY_LSHIFT 42
350 #define KEY_BACKSLASH 43
361 #define KEY_RSHIFT 54
362 #define KEY_ASTERISK 55
365 #define KEY_CAPSLOCK 58
376 #define KEY_NUMLOCK 69
377 #define KEY_SCRLOCK 70
381 #define KEY_MINUS_PAD 74
385 #define KEY_PLUS_PAD 78
389 #define KEY_INSERT 82
391 #define KEY_PRTSCR 84
398 #define KEY_RCONTROL 120
399 #define KEY_ALTGR 121
400 #define KEY_SLASH2 122
401 #define KEY_PAUSE 123
407 /*******************************************/
408 /************ Joystick routines ************/
409 /*******************************************/
411 #if !defined alleg_joystick_unused
415 /* values for joy_type */
416 #define JOY_TYPE_STANDARD 0
417 #define JOY_TYPE_FSPRO 1
418 #define JOY_TYPE_4BUTTON 2
419 #define JOY_TYPE_6BUTTON 3
420 #define JOY_TYPE_2PADS 4
421 #define JOY_TYPE_WINGEX 5
423 /* values for joy_hat */
424 #define JOY_HAT_CENTRE 0
425 #define JOY_HAT_LEFT 1
426 #define JOY_HAT_DOWN 2
427 #define JOY_HAT_RIGHT 3
430 /* aliases for FSPro buttons */
431 #define joy_FSPRO_trigger joy_b1
432 #define joy_FSPRO_butleft joy_b2
433 #define joy_FSPRO_butright joy_b3
434 #define joy_FSPRO_butmiddle joy_b4
436 /* aliases for Wingman Extreme buttons */
437 #define joy_WINGEX_trigger joy_b1
438 #define joy_WINGEX_buttop joy_b2
439 #define joy_WINGEX_butthumb joy_b3
440 #define joy_WINGEX_butmiddle joy_b4
442 /* some Yankified aliases ;) */
443 #define JOY_HAT_CENTER JOY_HAT_CENTRE
445 /* joystick status variables */
446 extern int joy_x, joy_y;
447 extern int joy_left, joy_right, joy_up, joy_down;
448 extern int joy_b1, joy_b2, joy_b3, joy_b4, joy_b5, joy_b6;
450 extern int joy_throttle;
451 extern int joy2_x, joy2_y;
452 extern int joy2_left, joy2_right, joy2_up, joy2_down;
453 extern int joy2_b1, joy2_b2;
455 int initialise_joystick();
456 int calibrate_joystick_tl();
457 int calibrate_joystick_br();
458 int calibrate_joystick_throttle_min();
459 int calibrate_joystick_throttle_max();
460 int calibrate_joystick_hat(int direction);
462 void poll_joystick();
464 int save_joystick_data(char *filename);
465 int load_joystick_data(char *filename);
471 /************************************************/
472 /************ Screen/bitmap routines ************/
473 /************************************************/
475 #if !defined alleg_gfx_driver_unused || \
476 !defined alleg_graphics_unused || \
477 !defined alleg_vidmem_unused || \
478 !defined alleg_palette_unused
481 #define GFX_AUTODETECT 0
492 #define GFX_XTENDED 7
495 #define GFX_CIRRUS64 10
496 #define GFX_CIRRUS54 11
497 #define GFX_PARADISE 12
499 #define GFX_TRIDENT 14
500 #define GFX_ET3000 15
501 #define GFX_ET4000 16
502 #define GFX_VIDEO7 17
507 #define GFX_SVGALIB 3
512 typedef struct GFX_DRIVER /* creates and manages the screen bitmap */
514 char *name; /* driver name */
515 char *desc; /* description (VESA version, etc) */
516 struct BITMAP *(*init)(int w, int h, int v_w, int v_h, int color_depth);
517 void (*exit)(struct BITMAP *b);
518 int (*scroll)(int x, int y);
520 void (*set_pallete)(struct RGB *p, int from, int to, int vsync);
521 int w, h; /* physical (not virtual!) screen size */
522 int linear; /* true if video memory is linear */
523 long bank_size; /* bank size, in bytes */
524 long bank_gran; /* bank granularity, in bytes */
525 long vid_mem; /* video memory size, in bytes */
526 long vid_phys_base; /* physical address of video memory */
530 extern GFX_DRIVER gfx_vga, gfx_modex;
535 extern GFX_DRIVER gfx_vesa_1, gfx_vesa_2b, gfx_vesa_2l, gfx_vbeaf,
536 gfx_xtended, gfx_ati, gfx_mach64, gfx_cirrus64,
537 gfx_cirrus54, gfx_realtek, gfx_s3, gfx_trident,
538 gfx_et3000, gfx_et4000, gfx_paradise, gfx_video7;
543 extern GFX_DRIVER gfx_svgalib;
548 typedef struct _GFX_DRIVER_INFO /* info about a graphics driver */
550 int driver_id; /* integer ID */
551 GFX_DRIVER *driver; /* the driver structure */
552 int autodetect; /* set to allow autodetection */
556 /* driver table for autodetection */
557 extern _GFX_DRIVER_INFO _gfx_driver_list[];
560 /* macros for constructing the driver list */
561 #define DECLARE_GFX_DRIVER_LIST(list...) \
562 _GFX_DRIVER_INFO _gfx_driver_list[] = \
568 #define GFX_DRIVER_VGA \
569 { GFX_VGA, &gfx_vga, TRUE },
571 #define GFX_DRIVER_MODEX \
572 { GFX_MODEX, &gfx_modex, TRUE },
574 #define GFX_DRIVER_VBEAF \
575 { GFX_VBEAF, &gfx_vbeaf, FALSE },
577 #define GFX_DRIVER_VESA2L \
578 { GFX_VESA2L, &gfx_vesa_2l, TRUE },
580 #define GFX_DRIVER_VESA2B \
581 { GFX_VESA2B, &gfx_vesa_2b, TRUE },
583 #define GFX_DRIVER_XTENDED \
584 { GFX_XTENDED, &gfx_xtended, FALSE },
586 #define GFX_DRIVER_ATI \
587 { GFX_ATI, &gfx_ati, TRUE },
589 #define GFX_DRIVER_MACH64 \
590 { GFX_MACH64, &gfx_mach64, TRUE },
592 #define GFX_DRIVER_CIRRUS64 \
593 { GFX_CIRRUS64, &gfx_cirrus64, FALSE },
595 #define GFX_DRIVER_CIRRUS54 \
596 { GFX_CIRRUS54, &gfx_cirrus54, TRUE },
598 #define GFX_DRIVER_PARADISE \
599 { GFX_PARADISE, &gfx_paradise, TRUE },
601 #define GFX_DRIVER_S3 \
602 { GFX_S3, &gfx_s3, TRUE },
604 #define GFX_DRIVER_TRIDENT \
605 { GFX_TRIDENT, &gfx_trident, TRUE },
607 #define GFX_DRIVER_ET3000 \
608 { GFX_ET3000, &gfx_et3000, FALSE },
610 #define GFX_DRIVER_ET4000 \
611 { GFX_ET4000, &gfx_et4000, TRUE },
613 #define GFX_DRIVER_VIDEO7 \
614 { GFX_VIDEO7, &gfx_video7, TRUE },
616 #define GFX_DRIVER_VESA1 \
617 { GFX_VESA1, &gfx_vesa_1, TRUE },
620 extern GFX_DRIVER *gfx_driver; /* the driver currently in use */
623 #define BMP_TYPE_LINEAR 1 /* memory bitmaps, mode 13h, SVGA */
624 #define BMP_TYPE_PLANAR 2 /* mode-X bitmaps */
627 typedef struct GFX_VTABLE /* functions for drawing onto bitmaps */
633 int (*getpixel)(struct BITMAP *bmp, int x, int y);
634 void (*putpixel)(struct BITMAP *bmp, int x, int y, int color);
635 void (*vline)(struct BITMAP *bmp, int x, int y1, int y2, int color);
636 void (*hline)(struct BITMAP *bmp, int x1, int y, int x2, int color);
637 void (*line)(struct BITMAP *bmp, int x1, int y1, int x2, int y2, int color);
638 void (*rectfill)(struct BITMAP *bmp, int x1, int y1, int x2, int y2, int color);
639 void (*draw_sprite)(struct BITMAP *bmp, struct BITMAP *sprite, int x, int y);
640 void (*draw_256_sprite)(struct BITMAP *bmp, struct BITMAP *sprite, int x, int y);
641 void (*draw_sprite_v_flip)(struct BITMAP *bmp, struct BITMAP *sprite, int x, int y);
642 void (*draw_sprite_h_flip)(struct BITMAP *bmp, struct BITMAP *sprite, int x, int y);
643 void (*draw_sprite_vh_flip)(struct BITMAP *bmp, struct BITMAP *sprite, int x, int y);
644 void (*draw_trans_sprite)(struct BITMAP *bmp, struct BITMAP *sprite, int x, int y);
645 void (*draw_lit_sprite)(struct BITMAP *bmp, struct BITMAP *sprite, int x, int y, int color);
646 void (*draw_rle_sprite)(struct BITMAP *bmp, struct RLE_SPRITE *sprite, int x, int y);
647 void (*draw_trans_rle_sprite)(struct BITMAP *bmp, struct RLE_SPRITE *sprite, int x, int y);
648 void (*draw_lit_rle_sprite)(struct BITMAP *bmp, struct RLE_SPRITE *sprite, int x, int y, int color);
649 void (*draw_character)(struct BITMAP *bmp, struct BITMAP *sprite, int x, int y, int color);
650 void (*textout_fixed)(struct BITMAP *bmp, void *f, int h, unsigned char *str, int x, int y, int color);
651 void (*blit_from_memory)(struct BITMAP *source, struct BITMAP *dest, int source_x, int source_y, int dest_x, int dest_y, int width, int height);
652 void (*blit_to_memory)(struct BITMAP *source, struct BITMAP *dest, int source_x, int source_y, int dest_x, int dest_y, int width, int height);
653 void (*blit_to_self)(struct BITMAP *source, struct BITMAP *dest, int source_x, int source_y, int dest_x, int dest_y, int width, int height);
654 void (*blit_to_self_forward)(struct BITMAP *source, struct BITMAP *dest, int source_x, int source_y, int dest_x, int dest_y, int width, int height);
655 void (*blit_to_self_backward)(struct BITMAP *source, struct BITMAP *dest, int source_x, int source_y, int dest_x, int dest_y, int width, int height);
656 void (*masked_blit)(struct BITMAP *source, struct BITMAP *dest, int source_x, int source_y, int dest_x, int dest_y, int width, int height);
657 void (*clear_to_color)(struct BITMAP *bitmap, int color);
658 void (*draw_sprite_end)(void);
659 void (*blit_end)(void);
663 extern GFX_VTABLE __linear_vtable8, __linear_vtable15, __linear_vtable16,
664 __linear_vtable24, __linear_vtable32, __modex_vtable;
667 typedef struct _VTABLE_INFO
673 extern _VTABLE_INFO _vtable_list[];
676 /* macros for constructing the vtable list */
677 #define DECLARE_COLOR_DEPTH_LIST(list...) \
678 _VTABLE_INFO _vtable_list[] = \
684 #define COLOR_DEPTH_8 \
685 { 8, &__linear_vtable8 },
687 #define COLOR_DEPTH_15 \
688 { 15, &__linear_vtable15 },
690 #define COLOR_DEPTH_16 \
691 { 16, &__linear_vtable16 },
693 #define COLOR_DEPTH_24 \
694 { 24, &__linear_vtable24 },
696 #define COLOR_DEPTH_32 \
697 { 32, &__linear_vtable32 },
701 typedef struct BITMAP /* a bitmap structure */
703 int w, h; /* width and height in pixels */
704 int clip; /* flag if clipping is turned on */
705 int cl, cr, ct, cb; /* clip left, right, top and bottom values */
706 GFX_VTABLE *vtable; /* drawing functions */
707 void (*write_bank)(); /* write bank selector, see bank.s */
708 void (*read_bank)(); /* read bank selector, see bank.s */
709 void *dat; /* the memory we allocated for the bitmap */
710 int bitmap_id; /* for identifying sub-bitmaps */
711 void *extra; /* points to a structure with more info */
712 int line_ofs; /* line offset (for screen sub-bitmaps) */
713 int seg; /* bitmap segment */
714 unsigned char *line[0]; /* pointers to the start of each line */
718 extern BITMAP *screen;
720 #define SCREEN_W (gfx_driver ? gfx_driver->w : 0)
721 #define SCREEN_H (gfx_driver ? gfx_driver->h : 0)
723 #define VIRTUAL_W (screen ? screen->w : 0)
724 #define VIRTUAL_H (screen ? screen->h : 0)
726 #define COLORCONV_EXPAND_256 1 /* 8 -> 15/16/24/32 */
727 #define COLORCONV_REDUCE_TO_256 2 /* 15/16/24/32 -> 8 */
728 #define COLORCONV_EXPAND_15_TO_16 4 /* 15 -> 16 */
729 #define COLORCONV_REDUCE_16_TO_15 8 /* 16 -> 15 */
730 #define COLORCONV_EXPAND_HI_TO_TRUE 16 /* 15/16 -> 24/32 */
731 #define COLORCONV_REDUCE_TRUE_TO_HI 32 /* 24/32 -> 15/16 */
732 #define COLORCONV_24_EQUALS_32 64 /* 24/32 -> 24/32 */
734 #define COLORCONV_NONE 0
735 #define COLORCONV_TOTAL 0xFFFF
737 #define COLORCONV_PARTIAL (COLORCONV_EXPAND_15_TO_16 | \
738 COLORCONV_REDUCE_16_TO_15 | \
739 COLORCONV_24_EQUALS_32)
741 #define COLORCONV_MOST (COLORCONV_EXPAND_15_TO_16 | \
742 COLORCONV_REDUCE_16_TO_15 | \
743 COLORCONV_EXPAND_HI_TO_TRUE | \
744 COLORCONV_REDUCE_TRUE_TO_HI | \
745 COLORCONV_24_EQUALS_32)
747 void set_color_depth(int depth);
748 void set_color_conversion(int mode);
749 int set_gfx_mode(int card, int w, int h, int v_w, int v_h);
750 int scroll_screen(int x, int y);
751 void request_modex_scroll(int x, int y);
752 int poll_modex_scroll();
753 void split_modex_screen(int line);
755 BITMAP *create_bitmap(int width, int height);
756 BITMAP *create_bitmap_ex(int color_depth, int width, int height);
757 BITMAP *create_sub_bitmap(BITMAP *parent, int x, int y, int width, int height);
758 void destroy_bitmap(BITMAP *bitmap);
761 __INLINE__ int bitmap_color_depth(BITMAP *bmp)
763 return bmp->vtable->color_depth;
767 __INLINE__ int bitmap_mask_color(BITMAP *bmp)
769 return bmp->vtable->mask_color;
773 __INLINE__ int is_same_bitmap(BITMAP *bmp1, BITMAP *bmp2)
775 return ((bmp1 == bmp2) ||
776 ((bmp1->bitmap_id != 0) && (bmp1->bitmap_id == bmp2->bitmap_id)));
780 __INLINE__ int is_linear_bitmap(BITMAP *bmp)
782 return (bmp->vtable->bitmap_type == BMP_TYPE_LINEAR);
786 __INLINE__ int is_planar_bitmap(BITMAP *bmp)
788 return (bmp->vtable->bitmap_type == BMP_TYPE_PLANAR);
792 __INLINE__ int is_memory_bitmap(BITMAP *bmp)
794 return (bmp->dat != NULL);
798 __INLINE__ int is_screen_bitmap(BITMAP *bmp)
800 return is_same_bitmap(bmp, screen);
804 __INLINE__ int is_sub_bitmap(BITMAP *bmp)
806 return ((bmp->dat == NULL) && (bmp != screen));
813 /************************************************/
814 /************ Color/Pallete routines ************/
815 /************************************************/
817 #if !defined alleg_palette_unused || !defined alleg_flic_unused
821 unsigned char r, g, b;
822 unsigned char filler;
827 typedef RGB PALLETE[PAL_SIZE];
829 extern RGB black_rgb;
830 extern PALLETE black_pallete, desktop_pallete, _current_pallete;
833 unsigned char data[32][32][32];
837 unsigned char data[PAL_SIZE][PAL_SIZE];
840 extern RGB_MAP *rgb_map;
841 extern COLOR_MAP *color_map;
843 typedef unsigned long (*BLENDER_FUNC)(unsigned long x, unsigned long y);
846 BLENDER_FUNC blend[256];
849 extern int _color_depth;
851 extern int _rgb_r_shift_15, _rgb_g_shift_15, _rgb_b_shift_15,
852 _rgb_r_shift_16, _rgb_g_shift_16, _rgb_b_shift_16,
853 _rgb_r_shift_24, _rgb_g_shift_24, _rgb_b_shift_24,
854 _rgb_r_shift_32, _rgb_g_shift_32, _rgb_b_shift_32;
856 extern int _rgb_scale_5[32], _rgb_scale_6[64];
858 #define MASK_COLOR_8 0
859 #define MASK_COLOR_15 0x7C1F
860 #define MASK_COLOR_16 0xF81F
861 #define MASK_COLOR_24 0xFF00FF
862 #define MASK_COLOR_32 0xFF00FF
864 extern int pallete_color[256];
866 void set_color(int index, RGB *p);
867 void set_pallete(PALLETE p);
868 void set_pallete_range(PALLETE p, int from, int to, int vsync);
870 void get_color(int index, RGB *p);
871 void get_pallete(PALLETE p);
872 void get_pallete_range(PALLETE p, int from, int to);
874 void fade_interpolate(PALLETE source, PALLETE dest, PALLETE output, int pos, int from, int to);
875 void fade_from_range(PALLETE source, PALLETE dest, int speed, int from, int to);
876 void fade_in_range(PALLETE p, int speed, int from, int to);
877 void fade_out_range(int speed, int from, int to);
878 void fade_from(PALLETE source, PALLETE dest, int speed);
879 void fade_in(PALLETE p, int speed);
880 void fade_out(int speed);
882 void select_pallete(PALLETE p);
883 void unselect_pallete();
885 void generate_332_palette(PALLETE pal);
886 int generate_optimized_palette(BITMAP *image, PALLETE pal, char rsvdcols[256]);
888 void create_rgb_table(RGB_MAP *table, PALLETE pal, void (*callback)(int pos));
889 void create_light_table(COLOR_MAP *table, PALLETE pal, int r, int g, int b, void (*callback)(int pos));
890 void create_trans_table(COLOR_MAP *table, PALLETE pal, int r, int g, int b, void (*callback)(int pos));
891 void create_color_table(COLOR_MAP *table, PALLETE pal, RGB (*blend)(PALLETE pal, int x, int y), void (*callback)(int pos));
893 void set_blender_mode(BLENDER_MAP *b15, BLENDER_MAP *b16, BLENDER_MAP *b24, int r, int g, int b, int a);
894 void set_trans_blender(int r, int g, int b, int a);
896 void hsv_to_rgb(float h, float s, float v, int *r, int *g, int *b);
897 void rgb_to_hsv(int r, int g, int b, float *h, float *s, float *v);
899 int bestfit_color(PALLETE pal, int r, int g, int b);
901 int makecol(int r, int g, int b);
902 int makecol8(int r, int g, int b);
903 int makecol_depth(int color_depth, int r, int g, int b);
909 int getr_depth(int color_depth, int c);
910 int getg_depth(int color_depth, int c);
911 int getb_depth(int color_depth, int c);
914 __INLINE__ void vsync()
920 __INLINE__ void _set_color(int index, RGB *p)
922 outportb(0x3C8, index);
923 outportb(0x3C9, p->r);
924 outportb(0x3C9, p->g);
925 outportb(0x3C9, p->b);
927 _current_pallete[index] = *p;
931 __INLINE__ int makecol15(int r, int g, int b)
933 return (((r >> 3) << _rgb_r_shift_15) |
934 ((g >> 3) << _rgb_g_shift_15) |
935 ((b >> 3) << _rgb_b_shift_15));
939 __INLINE__ int makecol16(int r, int g, int b)
941 return (((r >> 3) << _rgb_r_shift_16) |
942 ((g >> 2) << _rgb_g_shift_16) |
943 ((b >> 3) << _rgb_b_shift_16));
947 __INLINE__ int makecol24(int r, int g, int b)
949 return ((r << _rgb_r_shift_24) |
950 (g << _rgb_g_shift_24) |
951 (b << _rgb_b_shift_24));
955 __INLINE__ int makecol32(int r, int g, int b)
957 return ((r << _rgb_r_shift_32) |
958 (g << _rgb_g_shift_32) |
959 (b << _rgb_b_shift_32));
963 __INLINE__ int getr8(int c)
965 return _rgb_scale_6[(int)_current_pallete[c].r];
969 __INLINE__ int getg8(int c)
971 return _rgb_scale_6[(int)_current_pallete[c].g];
975 __INLINE__ int getb8(int c)
977 return _rgb_scale_6[(int)_current_pallete[c].b];
981 __INLINE__ int getr15(int c)
983 return _rgb_scale_5[(c >> _rgb_r_shift_15) & 0x1F];
987 __INLINE__ int getg15(int c)
989 return _rgb_scale_5[(c >> _rgb_g_shift_15) & 0x1F];
993 __INLINE__ int getb15(int c)
995 return _rgb_scale_5[(c >> _rgb_b_shift_15) & 0x1F];
999 __INLINE__ int getr16(int c)
1001 return _rgb_scale_5[(c >> _rgb_r_shift_16) & 0x1F];
1005 __INLINE__ int getg16(int c)
1007 return _rgb_scale_6[(c >> _rgb_g_shift_16) & 0x3F];
1011 __INLINE__ int getb16(int c)
1013 return _rgb_scale_5[(c >> _rgb_b_shift_16) & 0x1F];
1017 __INLINE__ int getr24(int c)
1019 return ((c >> _rgb_r_shift_24) & 0xFF);
1023 __INLINE__ int getg24(int c)
1025 return ((c >> _rgb_g_shift_24) & 0xFF);
1029 __INLINE__ int getb24(int c)
1031 return ((c >> _rgb_b_shift_24) & 0xFF);
1035 __INLINE__ int getr32(int c)
1037 return ((c >> _rgb_r_shift_32) & 0xFF);
1041 __INLINE__ int getg32(int c)
1043 return ((c >> _rgb_g_shift_32) & 0xFF);
1047 __INLINE__ int getb32(int c)
1049 return ((c >> _rgb_b_shift_32) & 0xFF);
1053 /* in case you want to spell 'pallete' as 'palette' */
1054 #define PALETTE PALLETE
1055 #define black_palette black_pallete
1056 #define desktop_palette desktop_pallete
1057 #define set_palette set_pallete
1058 #define get_palette get_pallete
1059 #define set_palette_range set_pallete_range
1060 #define get_palette_range get_pallete_range
1061 #define fli_palette fli_pallete
1062 #define palette_color pallete_color
1063 #define DAT_PALETTE DAT_PALLETE
1064 #define select_palette select_pallete
1065 #define unselect_palette unselect_pallete
1066 #define generate_332_pallete generate_332_palette
1067 #define generate_optimised_pallete generate_optimised_palette
1073 /******************************************************/
1074 /************ Graphics and sprite routines ************/
1075 /******************************************************/
1077 #if !defined alleg_graphics_unused
1079 void set_clip(BITMAP *bitmap, int x1, int y1, int x2, int y2);
1081 #define DRAW_MODE_SOLID 0 /* flags for drawing_mode() */
1082 #define DRAW_MODE_XOR 1
1083 #define DRAW_MODE_COPY_PATTERN 2
1084 #define DRAW_MODE_SOLID_PATTERN 3
1085 #define DRAW_MODE_MASKED_PATTERN 4
1086 #define DRAW_MODE_TRANS 5
1088 void drawing_mode(int mode, BITMAP *pattern, int x_anchor, int y_anchor);
1089 void xor_mode(int xor);
1093 __INLINE__ int getpixel(BITMAP *bmp, int x, int y)
1095 return bmp->vtable->getpixel(bmp, x, y);
1099 __INLINE__ void putpixel(BITMAP *bmp, int x, int y, int color)
1101 bmp->vtable->putpixel(bmp, x, y, color);
1105 __INLINE__ void vline(BITMAP *bmp, int x, int y1, int y2, int color)
1107 bmp->vtable->vline(bmp, x, y1, y2, color);
1111 __INLINE__ void hline(BITMAP *bmp, int x1, int y, int x2, int color)
1113 bmp->vtable->hline(bmp, x1, y, x2, color);
1117 __INLINE__ void line(BITMAP *bmp, int x1, int y1, int x2, int y2, int color)
1119 bmp->vtable->line(bmp, x1, y1, x2, y2, color);
1123 __INLINE__ void rectfill(BITMAP *bmp, int x1, int y1, int x2, int y2, int color)
1125 bmp->vtable->rectfill(bmp, x1, y1, x2, y2, color);
1129 __INLINE__ void draw_sprite(BITMAP *bmp, BITMAP *sprite, int x, int y)
1131 if (sprite->vtable->color_depth == 8)
1132 bmp->vtable->draw_256_sprite(bmp, sprite, x, y);
1134 bmp->vtable->draw_sprite(bmp, sprite, x, y);
1138 __INLINE__ void draw_sprite_v_flip(BITMAP *bmp, BITMAP *sprite, int x, int y)
1140 bmp->vtable->draw_sprite_v_flip(bmp, sprite, x, y);
1144 __INLINE__ void draw_sprite_h_flip(BITMAP *bmp, BITMAP *sprite, int x, int y)
1146 bmp->vtable->draw_sprite_h_flip(bmp, sprite, x, y);
1150 __INLINE__ void draw_sprite_vh_flip(BITMAP *bmp, BITMAP *sprite, int x, int y)
1152 bmp->vtable->draw_sprite_vh_flip(bmp, sprite, x, y);
1156 __INLINE__ void draw_trans_sprite(BITMAP *bmp, BITMAP *sprite, int x, int y)
1158 bmp->vtable->draw_trans_sprite(bmp, sprite, x, y);
1162 __INLINE__ void draw_lit_sprite(BITMAP *bmp, BITMAP *sprite, int x, int y, int color)
1164 bmp->vtable->draw_lit_sprite(bmp, sprite, x, y, color);
1168 __INLINE__ void draw_character(BITMAP *bmp, BITMAP *sprite, int x, int y, int color)
1170 bmp->vtable->draw_character(bmp, sprite, x, y, color);
1174 __INLINE__ void draw_rle_sprite(BITMAP *bmp, struct RLE_SPRITE *sprite, int x, int y)
1176 bmp->vtable->draw_rle_sprite(bmp, sprite, x, y);
1180 __INLINE__ void draw_trans_rle_sprite(BITMAP *bmp, struct RLE_SPRITE *sprite, int x, int y)
1182 bmp->vtable->draw_trans_rle_sprite(bmp, sprite, x, y);
1186 __INLINE__ void draw_lit_rle_sprite(BITMAP *bmp, struct RLE_SPRITE *sprite, int x, int y, int color)
1188 bmp->vtable->draw_lit_rle_sprite(bmp, sprite, x, y, color);
1192 __INLINE__ void clear_to_color(BITMAP *bitmap, int color)
1194 bitmap->vtable->clear_to_color(bitmap, color);
1198 void do_line(BITMAP *bmp, int x1, int y1, int x2, int y2, int d, void (*proc)(BITMAP *, int, int, int));
1199 void triangle(BITMAP *bmp, int x1, int y1, int x2, int y2, int x3, int y3, int color);
1200 void polygon(BITMAP *bmp, int vertices, int *points, int color);
1201 void rect(BITMAP *bmp, int x1, int y1, int x2, int y2, int color);
1202 void do_circle(BITMAP *bmp, int x, int y, int radius, int d, void (*proc)(BITMAP *, int, int, int));
1203 void circle(BITMAP *bmp, int x, int y, int radius, int color);
1204 void circlefill(BITMAP *bmp, int x, int y, int radius, int color);
1205 void do_ellipse(BITMAP *bmp, int x, int y, int rx, int ry, int d, void (*proc)(BITMAP *, int, int, int));
1206 void ellipse(BITMAP *bmp, int x, int y, int rx, int ry, int color);
1207 void ellipsefill(BITMAP *bmp, int cx, int cy, int rx, int ry, int color);
1208 void calc_spline(int points[8], int npts, int *x, int *y);
1209 void spline(BITMAP *bmp, int points[8], int color);
1210 void floodfill(BITMAP *bmp, int x, int y, int color);
1211 void blit(BITMAP *source, BITMAP *dest, int source_x, int source_y, int dest_x, int dest_y, int width, int height);
1212 void masked_blit(BITMAP *source, BITMAP *dest, int source_x, int source_y, int dest_x, int dest_y, int width, int height);
1213 void stretch_blit(BITMAP *s, BITMAP *d, int s_x, int s_y, int s_w, int s_h, int d_x, int d_y, int d_w, int d_h);
1214 void stretch_sprite(BITMAP *bmp, BITMAP *sprite, int x, int y, int w, int h);
1215 void rotate_sprite(BITMAP *bmp, BITMAP *sprite, int x, int y, fixed angle);
1216 void rotate_scaled_sprite(BITMAP *bmp, BITMAP *sprite, int x, int y, fixed angle, fixed scale);
1217 void clear(BITMAP *bitmap);
1220 typedef struct RLE_SPRITE /* a RLE compressed sprite */
1222 int w, h; /* width and height in pixels */
1223 int color_depth; /* color depth of the image */
1224 int size; /* size of sprite data in bytes */
1225 signed char dat[0]; /* RLE bitmap data */
1229 RLE_SPRITE *get_rle_sprite(BITMAP *bitmap);
1230 void destroy_rle_sprite(RLE_SPRITE *sprite);
1233 typedef struct COMPILED_SPRITE /* a compiled sprite */
1235 short planar; /* set if it's a planar (mode-X) sprite */
1236 short color_depth; /* color depth of the image */
1237 short w, h; /* size of the sprite */
1239 void *draw; /* routines to draw the image */
1240 int len; /* length of the drawing functions */
1245 COMPILED_SPRITE *get_compiled_sprite(BITMAP *bitmap, int planar);
1246 void destroy_compiled_sprite(COMPILED_SPRITE *sprite);
1247 void draw_compiled_sprite(BITMAP *bmp, COMPILED_SPRITE *sprite, int x, int y);
1250 #define FONT_SIZE 224 /* number of characters in a font */
1253 typedef struct FONT_8x8 /* a simple 8x8 font */
1255 unsigned char dat[FONT_SIZE][8];
1259 typedef struct FONT_8x16 /* a simple 8x16 font */
1261 unsigned char dat[FONT_SIZE][16];
1265 typedef struct FONT_PROP /* a proportional font */
1267 BITMAP *dat[FONT_SIZE];
1271 typedef struct FONT /* can be either */
1276 FONT_8x16 *dat_8x16;
1277 FONT_PROP *dat_prop;
1284 void text_mode(int mode);
1285 void textout(BITMAP *bmp, FONT *f, unsigned char *str, int x, int y, int color);
1286 void textout_centre(BITMAP *bmp, FONT *f, unsigned char *str, int x, int y, int color);
1287 void textout_justify(BITMAP *bmp, FONT *f, unsigned char *str, int x1, int x2, int y, int diff, int color);
1288 void textprintf(BITMAP *bmp, FONT *f, int x, int y, int color, char *format, ...) __attribute__ ((format (printf, 6, 7)));
1289 void textprintf_centre(BITMAP *bmp, FONT *f, int x, int y, int color, char *format, ...) __attribute__ ((format (printf, 6, 7)));
1291 int text_length(FONT *f, unsigned char *str);
1292 int text_height(FONT *f);
1293 void destroy_font(FONT *f);
1298 } /* end of extern "C" */
1301 __INLINE__ void textout(BITMAP *bmp, FONT *f, char *str, int x, int y, int color)
1303 textout(bmp, f, (unsigned char *)str, x, y, color);
1307 __INLINE__ void textout_centre(BITMAP *bmp, FONT *f, char *str, int x, int y, int color)
1309 textout_centre(bmp, f, (unsigned char *)str, x, y, color);
1313 __INLINE__ void textout_justify(BITMAP *bmp, FONT *f, char *str, int x1, int x2, int y, int diff, int color)
1315 textout_justify(bmp, f, (unsigned char *)str, x1, x2, diff, y, color);
1319 __INLINE__ int text_length(FONT *f, char *str)
1321 return text_length(f, (unsigned char *)str);
1327 #endif /* ifdef __cplusplus */
1330 typedef struct V3D /* a 3d point (fixed point version) */
1332 fixed x, y, z; /* position */
1333 fixed u, v; /* texture map coordinates */
1338 typedef struct V3D_f /* a 3d point (floating point version) */
1340 float x, y, z; /* position */
1341 float u, v; /* texture map coordinates */
1346 #define POLYTYPE_FLAT 0
1347 #define POLYTYPE_GCOL 1
1348 #define POLYTYPE_GRGB 2
1349 #define POLYTYPE_ATEX 3
1350 #define POLYTYPE_PTEX 4
1351 #define POLYTYPE_ATEX_MASK 5
1352 #define POLYTYPE_PTEX_MASK 6
1353 #define POLYTYPE_ATEX_LIT 7
1354 #define POLYTYPE_PTEX_LIT 8
1357 void polygon3d(BITMAP *bmp, int type, BITMAP *texture, int vc, V3D *vtx[]);
1358 void polygon3d_f(BITMAP *bmp, int type, BITMAP *texture, int vc, V3D_f *vtx[]);
1359 void triangle3d(BITMAP *bmp, int type, BITMAP *texture, V3D *v1, V3D *v2, V3D *v3);
1360 void triangle3d_f(BITMAP *bmp, int type, BITMAP *texture, V3D_f *v1, V3D_f *v2, V3D_f *v3);
1361 void quad3d(BITMAP *bmp, int type, BITMAP *texture, V3D *v1, V3D *v2, V3D *v3, V3D *v4);
1362 void quad3d_f(BITMAP *bmp, int type, BITMAP *texture, V3D_f *v1, V3D_f *v2, V3D_f *v3, V3D_f *v4);
1368 /*********************************************/
1369 /************ Video memory access ************/
1370 /*********************************************/
1372 #if !defined alleg_vidmem_unused
1374 __INLINE__ unsigned long bmp_write_line(BITMAP *bmp, int line)
1376 unsigned long result;
1381 : "=a" (result) /* result in eax */
1383 : "d" (bmp), /* bitmap in edx */
1384 "0" (line), /* line number in eax */
1385 "r" (bmp->write_bank) /* the bank switch routine */
1392 __INLINE__ unsigned long bmp_read_line(BITMAP *bmp, int line)
1394 unsigned long result;
1399 : "=a" (result) /* result in eax */
1401 : "d" (bmp), /* bitmap in edx */
1402 "0" (line), /* line number in eax */
1403 "r" (bmp->read_bank) /* the bank switch routine */
1410 __INLINE__ void _putpixel(BITMAP *bmp, int x, int y, unsigned char color)
1413 " movw %w0, %%fs ; "
1415 " movb %b3, (%1, %2) "
1418 : "rm" (bmp->seg), /* segment selector in reg or mem */
1419 "r" (bmp_write_line(bmp, y)), /* line pointer in reg */
1420 "r" (x), /* line offset in reg */
1421 "qi" (color) /* the pixel in reg or immediate */
1426 __INLINE__ unsigned char _getpixel(BITMAP *bmp, int x, int y)
1428 unsigned char result;
1431 " movw %w1, %%fs ; "
1433 " movb (%2, %3), %b0"
1435 : "=&q" (result) /* result in al, bl, cl, or dl */
1437 : "rm" (bmp->seg), /* segment selector in reg or mem */
1438 "r" (bmp_read_line(bmp, y)), /* line pointer in reg */
1439 "r" (x) /* line offset in reg */
1449 /******************************************/
1450 /************ FLI/FLC routines ************/
1451 /******************************************/
1453 #if !defined alleg_flic_unused
1455 #define FLI_OK 0 /* FLI player return values */
1457 #define FLI_ERROR -2
1458 #define FLI_NOT_OPEN -3
1460 int play_fli(char *filename, BITMAP *bmp, int loop, int (*callback)());
1461 int play_memory_fli(void *fli_data, BITMAP *bmp, int loop, int (*callback)());
1463 int open_fli(char *filename);
1464 int open_memory_fli(void *fli_data);
1466 int next_fli_frame(int loop);
1467 void reset_fli_variables();
1469 extern BITMAP *fli_bitmap; /* current frame of the FLI */
1470 extern PALLETE fli_pallete; /* current FLI pallete */
1472 extern int fli_bmp_dirty_from; /* what part of fli_bitmap is dirty */
1473 extern int fli_bmp_dirty_to;
1474 extern int fli_pal_dirty_from; /* what part of fli_pallete is dirty */
1475 extern int fli_pal_dirty_to;
1477 extern int fli_frame; /* current frame number */
1479 extern volatile int fli_timer; /* for timing FLI playback */
1485 /****************************************/
1486 /************ Sound routines ************/
1487 /****************************************/
1489 #if !defined alleg_sound_unused
1491 #define DIGI_VOICES 32 /* Theoretical maximums: */
1492 #define MIDI_VOICES 32 /* actual drivers may not be */
1493 #define MIDI_TRACKS 32 /* able to handle this many */
1496 typedef struct SAMPLE /* a sample */
1498 int bits; /* 8 or 16 */
1499 int freq; /* sample frequency */
1500 int priority; /* 0-255 */
1501 unsigned long len; /* length (in samples) */
1502 unsigned long loop_start; /* loop start position */
1503 unsigned long loop_end; /* loop finish position */
1504 unsigned long param; /* for internal use by the driver */
1505 void *data; /* sample data */
1509 typedef struct MIDI /* a midi file */
1511 int divisions; /* number of ticks per quarter note */
1513 unsigned char *data; /* MIDI message stream */
1514 int len; /* length of the track data */
1515 } track[MIDI_TRACKS];
1519 typedef struct AUDIOSTREAM
1521 int voice; /* the voice we are playing on */
1522 SAMPLE *samp; /* the sample we are using */
1523 void *b1, *b2; /* two audio buffers */
1524 int bufnum; /* which buffer is currently playing */
1525 int len; /* buffer length */
1529 #define DIGI_AUTODETECT -1 /* for passing to install_sound() */
1539 #define DIGI_SBPRO 5
1546 #define DIGI_LINUX_SOUND_NOT_IMPLEMENTED_YET
1550 #define MIDI_AUTODETECT -1
1556 #define MIDI_ADLIB 1
1558 #define MIDI_2XOPL2 3
1560 #define MIDI_SB_OUT 5
1563 #define MIDI_DIGMID 8
1564 #define MIDI_AWE32 9
1569 #define MIDI_LINUX_SOUND_NOT_IMPLEMENTED_YET
1574 typedef struct DIGI_DRIVER /* driver for playing digital sfx */
1576 char *name; /* driver name */
1577 char *desc; /* description string */
1578 int voices; /* available voices */
1579 int basevoice; /* voice number offset */
1580 int max_voices; /* maximum voices we can support */
1581 int def_voices; /* default number of voices to use */
1583 /* setup routines */
1585 int (*init)(int voices);
1587 int (*mixer_volume)(int volume);
1589 /* voice control functions */
1590 void (*init_voice)(int voice, SAMPLE *sample);
1591 void (*release_voice)(int voice);
1592 void (*start_voice)(int voice);
1593 void (*stop_voice)(int voice);
1594 void (*loop_voice)(int voice, int playmode);
1596 /* position control functions */
1597 int (*get_position)(int voice);
1598 void (*set_position)(int voice, int position);
1600 /* volume control functions */
1601 int (*get_volume)(int voice);
1602 void (*set_volume)(int voice, int volume);
1603 void (*ramp_volume)(int voice, int time, int endvol);
1604 void (*stop_volume_ramp)(int voice);
1606 /* pitch control functions */
1607 int (*get_frequency)(int voice);
1608 void (*set_frequency)(int voice, int frequency);
1609 void (*sweep_frequency)(int voice, int time, int endfreq);
1610 void (*stop_frequency_sweep)(int voice);
1612 /* pan control functions */
1613 int (*get_pan)(int voice);
1614 void (*set_pan)(int voice, int pan);
1615 void (*sweep_pan)(int voice, int time, int endpan);
1616 void (*stop_pan_sweep)(int voice);
1618 /* effect control functions */
1619 void (*set_echo)(int voice, int strength, int delay);
1620 void (*set_tremolo)(int voice, int rate, int depth);
1621 void (*set_vibrato)(int voice, int rate, int depth);
1625 typedef struct MIDI_DRIVER /* driver for playing midi music */
1627 char *name; /* driver name */
1628 char *desc; /* description string */
1629 int voices; /* available voices */
1630 int basevoice; /* voice number offset */
1631 int max_voices; /* maximum voices we can support */
1632 int def_voices; /* default number of voices to use */
1633 int xmin, xmax; /* reserved voice range */
1635 /* setup routines */
1637 int (*init)(int voices);
1639 int (*mixer_volume)(int volume);
1641 /* raw MIDI output to MPU-401, etc. */
1642 void (*raw_midi)(unsigned char data);
1644 /* dynamic patch loading routines */
1645 int (*load_patches)(char *patches, char *drums);
1646 void (*adjust_patches)(char *patches, char *drums);
1648 /* note control functions */
1649 void (*key_on)(int inst, int note, int bend, int vol, int pan);
1650 void (*key_off)(int voice);
1651 void (*set_volume)(int voice, int vol);
1652 void (*set_pitch)(int voice, int note, int bend);
1653 void (*set_pan)(int voice, int pan);
1654 void (*set_vibrato)(int voice, int amount);
1658 extern DIGI_DRIVER digi_none;
1662 extern DIGI_DRIVER digi_sb, digi_gus;
1665 extern DIGI_DRIVER digi_linux_sound_not_implemented_yet;
1668 extern MIDI_DRIVER midi_none;
1672 extern MIDI_DRIVER midi_adlib, midi_sb_out, midi_mpu401, midi_gus, midi_digmid, midi_awe32;
1675 extern MIDI_DRIVER midi_linux_sound_not_implemented_yet;
1679 typedef struct _DIGI_DRIVER_INFO /* info about a digital driver */
1681 int driver_id; /* integer ID */
1682 DIGI_DRIVER *driver; /* the driver structure */
1683 int autodetect; /* set to allow autodetection */
1684 } _DIGI_DRIVER_INFO;
1687 typedef struct _MIDI_DRIVER_INFO /* info about a MIDI driver */
1689 int driver_id; /* integer ID */
1690 MIDI_DRIVER *driver; /* the driver structure */
1691 int autodetect; /* set to allow autodetection */
1692 } _MIDI_DRIVER_INFO;
1695 /* driver tables for autodetection */
1696 extern _DIGI_DRIVER_INFO _digi_driver_list[];
1697 extern _MIDI_DRIVER_INFO _midi_driver_list[];
1700 /* macros for constructing the driver lists */
1701 #define DECLARE_DIGI_DRIVER_LIST(list...) \
1702 _DIGI_DRIVER_INFO _digi_driver_list[] = \
1705 { DIGI_NONE, &digi_none, TRUE }, \
1709 #define DECLARE_MIDI_DRIVER_LIST(list...) \
1710 _MIDI_DRIVER_INFO _midi_driver_list[] = \
1713 { MIDI_NONE, &midi_none, TRUE }, \
1717 #define DIGI_DRIVER_GUS \
1718 { DIGI_GUS, &digi_gus, TRUE },
1720 #define DIGI_DRIVER_SB \
1721 { DIGI_SB, &digi_sb, TRUE }, \
1722 { DIGI_SB10, &digi_sb, FALSE }, \
1723 { DIGI_SB15, &digi_sb, FALSE }, \
1724 { DIGI_SB20, &digi_sb, FALSE }, \
1725 { DIGI_SBPRO, &digi_sb, FALSE }, \
1726 { DIGI_SB16, &digi_sb, FALSE },
1728 #define MIDI_DRIVER_AWE32 \
1729 { MIDI_AWE32, &midi_awe32, TRUE },
1731 #define MIDI_DRIVER_DIGMID \
1732 { MIDI_DIGMID, &midi_digmid, TRUE },
1734 #define MIDI_DRIVER_ADLIB \
1735 { MIDI_ADLIB, &midi_adlib, TRUE }, \
1736 { MIDI_OPL2, &midi_adlib, FALSE }, \
1737 { MIDI_2XOPL2, &midi_adlib, FALSE }, \
1738 { MIDI_OPL3, &midi_adlib, FALSE },
1740 #define MIDI_DRIVER_SB_OUT \
1741 { MIDI_SB_OUT, &midi_sb_out, FALSE },
1743 #define MIDI_DRIVER_MPU \
1744 { MIDI_MPU, &midi_mpu401, FALSE },
1747 extern DIGI_DRIVER *digi_driver; /* the drivers currently in use */
1748 extern MIDI_DRIVER *midi_driver;
1750 extern int digi_card, midi_card;
1752 extern volatile long midi_pos; /* current position in the midi file */
1754 extern long midi_loop_start; /* where to loop back to at EOF */
1755 extern long midi_loop_end; /* loop when we hit this position */
1757 int detect_digi_driver(int driver_id);
1758 int detect_midi_driver(int driver_id);
1760 void reserve_voices(int digi_voices, int midi_voices);
1761 int install_sound(int digi_card, int midi_card, char *cfg_path);
1762 void remove_sound();
1763 void set_volume(int digi_volume, int midi_volume);
1765 int load_ibk(char *filename, int drums);
1767 SAMPLE *load_sample(char *filename);
1768 SAMPLE *load_wav(char *filename);
1769 SAMPLE *load_voc(char *filename);
1770 void destroy_sample(SAMPLE *spl);
1772 int play_sample(SAMPLE *spl, int vol, int pan, int freq, int loop);
1773 void stop_sample(SAMPLE *spl);
1774 void adjust_sample(SAMPLE *spl, int vol, int pan, int freq, int loop);
1776 int allocate_voice(SAMPLE *spl);
1777 void deallocate_voice(int voice);
1778 void reallocate_voice(int voice, SAMPLE *spl);
1779 void release_voice(int voice);
1780 void voice_start(int voice);
1781 void voice_stop(int voice);
1782 void voice_set_priority(int voice, int priority);
1783 SAMPLE *voice_check(int voice);
1785 #define PLAYMODE_PLAY 0
1786 #define PLAYMODE_LOOP 1
1787 #define PLAYMODE_FORWARD 0
1788 #define PLAYMODE_BACKWARD 2
1789 #define PLAYMODE_BIDIR 4
1791 void voice_set_playmode(int voice, int playmode);
1793 int voice_get_position(int voice);
1794 void voice_set_position(int voice, int position);
1796 int voice_get_volume(int voice);
1797 void voice_set_volume(int voice, int volume);
1798 void voice_ramp_volume(int voice, int time, int endvol);
1799 void voice_stop_volumeramp(int voice);
1801 int voice_get_frequency(int voice);
1802 void voice_set_frequency(int voice, int frequency);
1803 void voice_sweep_frequency(int voice, int time, int endfreq);
1804 void voice_stop_frequency_sweep(int voice);
1806 int voice_get_pan(int voice);
1807 void voice_set_pan(int voice, int pan);
1808 void voice_sweep_pan(int voice, int time, int endpan);
1809 void voice_stop_pan_sweep(int voice);
1811 void voice_set_echo(int voice, int strength, int delay);
1812 void voice_set_tremolo(int voice, int rate, int depth);
1813 void voice_set_vibrato(int voice, int rate, int depth);
1815 MIDI *load_midi(char *filename);
1816 void destroy_midi(MIDI *midi);
1817 int play_midi(MIDI *midi, int loop);
1818 int play_looped_midi(MIDI *midi, int loop_start, int loop_end);
1822 int midi_seek(int target);
1823 void midi_out(unsigned char *data, int length);
1824 int load_midi_patches();
1826 extern void (*midi_msg_callback)(int msg, int byte1, int byte2);
1827 extern void (*midi_meta_callback)(int type, unsigned char *data, int length);
1828 extern void (*midi_sysex_callback)(unsigned char *data, int length);
1830 AUDIOSTREAM *play_audio_stream(int len, int bits, int freq, int vol, int pan);
1831 void stop_audio_stream(AUDIOSTREAM *stream);
1832 void *get_audio_stream_buffer(AUDIOSTREAM *stream);
1833 void free_audio_stream_buffer(AUDIOSTREAM *stream);
1839 /***********************************************************/
1840 /************ File I/O and compression routines ************/
1841 /***********************************************************/
1844 #if !defined alleg_file_unused
1846 char *get_filename(char *path);
1847 char *get_extension(char *filename);
1848 void put_backslash(char *filename);
1849 int file_exists(char *filename, int attrib, int *aret);
1850 int exists(char *filename);
1851 long file_size(char *filename);
1852 long file_time(char *filename);
1853 int delete_file(char *filename);
1854 int for_each_file(char *name, int attrib, void (*callback)(), int param);
1860 #define F_READ "r" /* for use with pack_fopen() */
1862 #define F_READ_PACKED "rp"
1863 #define F_WRITE_PACKED "wp"
1864 #define F_WRITE_NOPACK "w!"
1866 #define F_BUF_SIZE 4096 /* 4K buffer for caching data */
1867 #define F_PACK_MAGIC 0x736C6821L /* magic number for packed files */
1868 #define F_NOPACK_MAGIC 0x736C682EL /* magic number for autodetect */
1869 #define F_EXE_MAGIC 0x736C682BL /* magic number for appended data */
1871 #define PACKFILE_FLAG_WRITE 1 /* the file is being written */
1872 #define PACKFILE_FLAG_PACK 2 /* data is compressed */
1873 #define PACKFILE_FLAG_CHUNK 4 /* file is a sub-chunk */
1874 #define PACKFILE_FLAG_EOF 8 /* reached the end-of-file */
1875 #define PACKFILE_FLAG_ERROR 16 /* an error has occurred */
1878 typedef struct PACKFILE /* our very own FILE structure... */
1880 int hndl; /* DOS file handle */
1881 int flags; /* PACKFILE_FLAG_* constants */
1882 unsigned char *buf_pos; /* position in buffer */
1883 int buf_size; /* number of bytes in the buffer */
1884 long todo; /* number of bytes still on the disk */
1885 struct PACKFILE *parent; /* nested, parent file */
1886 void *pack_data; /* for LZSS compression */
1887 char *filename; /* name of the file */
1888 char *password; /* current encryption position */
1889 unsigned char buf[F_BUF_SIZE]; /* the actual data buffer */
1893 void packfile_password(char *password);
1894 PACKFILE *pack_fopen(char *filename, char *mode);
1895 int pack_fclose(PACKFILE *f);
1896 int pack_fseek(PACKFILE *f, int offset);
1897 PACKFILE *pack_fopen_chunk(PACKFILE *f, int pack);
1898 PACKFILE *pack_fclose_chunk(PACKFILE *f);
1899 int pack_igetw(PACKFILE *f);
1900 long pack_igetl(PACKFILE *f);
1901 int pack_iputw(int w, PACKFILE *f);
1902 long pack_iputl(long l, PACKFILE *f);
1903 int pack_mgetw(PACKFILE *f);
1904 long pack_mgetl(PACKFILE *f);
1905 int pack_mputw(int w, PACKFILE *f);
1906 long pack_mputl(long l, PACKFILE *f);
1907 long pack_fread(void *p, long n, PACKFILE *f);
1908 long pack_fwrite(void *p, long n, PACKFILE *f);
1909 char *pack_fgets(char *p, int max, PACKFILE *f);
1910 int pack_fputs(char *p, PACKFILE *f);
1912 int _sort_out_getc(PACKFILE *f);
1913 int _sort_out_putc(int c, PACKFILE *f);
1915 #define pack_feof(f) ((f)->flags & PACKFILE_FLAG_EOF)
1916 #define pack_ferror(f) ((f)->flags & PACKFILE_FLAG_ERROR)
1919 __INLINE__ int pack_getc(PACKFILE *f)
1922 if (f->buf_size > 0)
1923 return *(f->buf_pos++);
1925 return _sort_out_getc(f);
1929 __INLINE__ int pack_putc(int c, PACKFILE *f)
1932 if (f->buf_size >= F_BUF_SIZE)
1933 return _sort_out_putc(c, f);
1935 return (*(f->buf_pos++) = c);
1941 /*******************************************/
1942 /************ Datafile routines ************/
1943 /*******************************************/
1945 #if !defined alleg_datafile_unused
1947 #define DAT_ID(a,b,c,d) ((a<<24) | (b<<16) | (c<<8) | d)
1949 #define DAT_MAGIC DAT_ID('A','L','L','.')
1950 #define DAT_FILE DAT_ID('F','I','L','E')
1951 #define DAT_DATA DAT_ID('D','A','T','A')
1952 #define DAT_FONT DAT_ID('F','O','N','T')
1953 #define DAT_SAMPLE DAT_ID('S','A','M','P')
1954 #define DAT_MIDI DAT_ID('M','I','D','I')
1955 #define DAT_PATCH DAT_ID('P','A','T',' ')
1956 #define DAT_FLI DAT_ID('F','L','I','C')
1957 #define DAT_BITMAP DAT_ID('B','M','P',' ')
1958 #define DAT_RLE_SPRITE DAT_ID('R','L','E',' ')
1959 #define DAT_C_SPRITE DAT_ID('C','M','P',' ')
1960 #define DAT_XC_SPRITE DAT_ID('X','C','M','P')
1961 #define DAT_PALLETE DAT_ID('P','A','L',' ')
1962 #define DAT_PROPERTY DAT_ID('p','r','o','p')
1963 #define DAT_NAME DAT_ID('N','A','M','E')
1967 typedef struct DATAFILE_PROPERTY
1969 char *dat; /* pointer to the data */
1970 int type; /* property type */
1971 } DATAFILE_PROPERTY;
1974 typedef struct DATAFILE
1976 void *dat; /* pointer to the data */
1977 int type; /* object type */
1978 long size; /* size of the object */
1979 DATAFILE_PROPERTY *prop; /* object properties */
1983 DATAFILE *load_datafile(char *filename);
1984 void unload_datafile(DATAFILE *dat);
1986 DATAFILE *load_datafile_object(char *filename, char *objectname);
1987 void unload_datafile_object(DATAFILE *dat);
1989 char *get_datafile_property(DATAFILE *dat, int type);
1990 void register_datafile_object(int id, void *(*load)(PACKFILE *f, long size), void (*destroy)(void *data));
1992 void fixup_datafile(DATAFILE *data);
1994 BITMAP *load_bitmap(char *filename, RGB *pal);
1995 BITMAP *load_bmp(char *filename, RGB *pal);
1996 BITMAP *load_lbm(char *filename, RGB *pal);
1997 BITMAP *load_pcx(char *filename, RGB *pal);
1998 BITMAP *load_tga(char *filename, RGB *pal);
2000 int save_bitmap(char *filename, BITMAP *bmp, RGB *pal);
2001 int save_bmp(char *filename, BITMAP *bmp, RGB *pal);
2002 int save_pcx(char *filename, BITMAP *bmp, RGB *pal);
2003 int save_tga(char *filename, BITMAP *bmp, RGB *pal);
2005 void register_bitmap_file_type(char *ext, BITMAP *(*load)(char *filename, RGB *pal), int (*save)(char *filename, BITMAP *bmp, RGB *pal));
2012 /***************************************/
2013 /************ Math routines ************/
2014 /***************************************/
2016 #if !defined alleg_math_unused
2018 __INLINE__ fixed itofix(int x)
2024 __INLINE__ int fixtoi(fixed x)
2026 return (x >> 16) + ((x & 0x8000) >> 15);
2030 __INLINE__ fixed ftofix(double x)
2042 return (long)(x * 65536.0 + (x < 0 ? -0.5 : 0.5));
2046 __INLINE__ double fixtof(fixed x)
2048 return (double)x / 65536.0;
2052 fixed fsqrt(fixed x);
2053 fixed fatan(fixed x);
2054 fixed fatan2(fixed y, fixed x);
2056 extern fixed _cos_tbl[];
2057 extern fixed _tan_tbl[];
2058 extern fixed _acos_tbl[];
2061 __INLINE__ fixed fcos(fixed x)
2063 return _cos_tbl[((x & 0x4000) ? (x >> 15) + 1 : (x >> 15)) & 0x1ff];
2067 __INLINE__ fixed fsin(fixed x)
2069 return _cos_tbl[(((x & 0x4000) ? (x >> 15) + 1 : (x >> 15)) -128) & 0x1ff];
2073 __INLINE__ fixed ftan(fixed x)
2075 return _tan_tbl[((x & 0x4000) ? (x >> 15) + 1 : (x >> 15)) & 0xff];
2079 __INLINE__ fixed facos(fixed x)
2081 if ((x < -65536L) || (x > 65536L)) {
2086 return _acos_tbl[(x+65536L)>>8];
2090 __INLINE__ fixed fasin(fixed x)
2092 if ((x < -65536L) || (x > 65536L)) {
2097 return 0x00400000L - _acos_tbl[(x+65536L)>>8];
2101 __INLINE__ fixed fadd(fixed x, fixed y)
2106 " addl %2, %0 ; " /* do the addition */
2107 " jno 0f ; " /* check for overflow */
2109 " movl $2, _errno ; " /* on overflow, set errno */
2110 " movl $0x7fffffff, %0 ; " /* and return MAXINT */
2115 " 0: " /* finished */
2117 : "=r" (result) /* result in a register */
2119 : "0" (x), /* x in the output register */
2120 "g" (y) /* y can go anywhere */
2122 : "%cc" /* clobbers flags */
2129 __INLINE__ fixed fsub(fixed x, fixed y)
2134 " subl %2, %0 ; " /* do the subtraction */
2135 " jno 0f ; " /* check for overflow */
2137 " movl $2, _errno ; " /* on overflow, set errno */
2138 " movl $0x7fffffff, %0 ; " /* and return MAXINT */
2143 " 0: " /* finished */
2145 : "=r" (result) /* result in a register */
2147 : "0" (x), /* x in the output register */
2148 "g" (y) /* y can go anywhere */
2150 : "%cc" /* clobbers flags */
2157 __INLINE__ fixed fmul(fixed x, fixed y)
2163 " imull %2 ; " /* do the multiply */
2164 " shrdl $16, %%edx, %0 ; "
2166 " shrl $16, %%edx ; " /* check for overflow */
2168 " cmpw $0xFFFF, %%dx ; "
2171 " movl $2, _errno ; " /* on overflow, set errno */
2172 " movl $0x7fffffff, %0 ; " /* and return MAXINT */
2181 " 0: " /* finished */
2183 : "=&a" (result) /* the result has to go in eax */
2185 : "mr" (x), /* x and y can be regs or mem */
2188 : "%edx", "%cc" /* clobbers edx and flags */
2195 __INLINE__ fixed fdiv(fixed x, fixed y)
2200 " movl %2, %%ecx ; "
2201 " xorl %%ebx, %%ebx ; "
2203 " orl %0, %0 ; " /* test sign of x */
2210 " orl %%ecx, %%ecx ; " /* test sign of y */
2217 " movl %0, %%edx ; " /* check the range is ok */
2218 " shrl $16, %%edx ; "
2220 " cmpl %%ecx, %%edx ; "
2223 " divl %%ecx ; " /* do the divide */
2228 " movl $2, _errno ; " /* on overflow, set errno */
2229 " movl $0x7fffffff, %0 ; " /* and return MAXINT */
2232 " testl $1, %%ebx ; " /* fix up the sign of the result */
2237 " 4: " /* finished */
2239 : "=a" (result) /* the result has to go in eax */
2241 : "0" (x), /* x in eax */
2242 "g" (y) /* y can be anywhere */
2244 : "%ebx", "%ecx", "%edx", "%cc" /* clobbers ebx, ecx, edx + flags */
2253 } /* end of extern "C" */
2256 class fix /* C++ wrapper for the fixed point routines */
2262 fix(const fix &x) { v = x.v; }
2263 fix(const int x) { v = itofix(x); }
2264 fix(const long x) { v = itofix(x); }
2265 fix(const unsigned int x) { v = itofix(x); }
2266 fix(const unsigned long x) { v = itofix(x); }
2267 fix(const float x) { v = ftofix(x); }
2268 fix(const double x) { v = ftofix(x); }
2270 operator int() const { return fixtoi(v); }
2271 operator long() const { return fixtoi(v); }
2272 operator unsigned int() const { return fixtoi(v); }
2273 operator unsigned long() const { return fixtoi(v); }
2274 operator float() const { return fixtof(v); }
2275 operator double() const { return fixtof(v); }
2277 fix& operator = (const fix &x) { v = x.v; return *this; }
2278 fix& operator = (const int x) { v = itofix(x); return *this; }
2279 fix& operator = (const long x) { v = itofix(x); return *this; }
2280 fix& operator = (const unsigned int x) { v = itofix(x); return *this; }
2281 fix& operator = (const unsigned long x) { v = itofix(x); return *this; }
2282 fix& operator = (const float x) { v = ftofix(x); return *this; }
2283 fix& operator = (const double x) { v = ftofix(x); return *this; }
2285 fix& operator += (const fix x) { v += x.v; return *this; }
2286 fix& operator -= (const fix x) { v -= x.v; return *this; }
2287 fix& operator *= (const fix x) { v = fmul(v, x.v); return *this; }
2288 fix& operator *= (const int x) { v *= x; return *this; }
2289 fix& operator /= (const fix x) { v = fdiv(v, x.v); return *this; }
2290 fix& operator /= (const int x) { v /= x; return *this; }
2291 fix& operator <<= (const int x) { v <<= x; return *this; }
2292 fix& operator >>= (const int x) { v >>= x; return *this; }
2294 fix& operator ++ () { v += itofix(1); return *this; }
2295 fix& operator -- () { v -= itofix(1); return *this; }
2297 fix operator - () { fix t; t.v = -v; return t; }
2299 inline friend fix operator + (const fix x, const fix y) { fix t; t.v = x.v + y.v; return t; }
2300 inline friend fix operator - (const fix x, const fix y) { fix t; t.v = x.v - y.v; return t; }
2301 inline friend fix operator * (const fix x, const fix y) { fix t; t.v = fmul(x.v, y.v); return t; }
2302 inline friend fix operator * (const fix x, const int y) { fix t; t.v = x.v * y; return t; }
2303 inline friend fix operator * (const int x, const fix y) { fix t; t.v = y.v * x; return t; }
2304 inline friend fix operator / (const fix x, const fix y) { fix t; t.v = fdiv(x.v, y.v); return t; }
2305 inline friend fix operator / (const fix x, const int y) { fix t; t.v = x.v / y; return t; }
2306 inline friend fix operator << (const fix x, const int y) { fix t; t.v = x.v << y; return t; }
2307 inline friend fix operator >> (const fix x, const int y) { fix t; t.v = x.v >> y; return t; }
2309 inline friend int operator == (const fix x, const fix y) { return (x.v == y.v); }
2310 inline friend int operator != (const fix x, const fix y) { return (x.v != y.v); }
2311 inline friend int operator < (const fix x, const fix y) { return (x.v < y.v); }
2312 inline friend int operator > (const fix x, const fix y) { return (x.v > y.v); }
2313 inline friend int operator <= (const fix x, const fix y) { return (x.v <= y.v); }
2314 inline friend int operator >= (const fix x, const fix y) { return (x.v >= y.v); }
2316 inline friend fix sqrt(fix x) { fix t; t.v = fsqrt(x.v); return t; }
2317 inline friend fix cos(fix x) { fix t; t.v = fcos(x.v); return t; }
2318 inline friend fix sin(fix x) { fix t; t.v = fsin(x.v); return t; }
2319 inline friend fix tan(fix x) { fix t; t.v = ftan(x.v); return t; }
2320 inline friend fix acos(fix x) { fix t; t.v = facos(x.v); return t; }
2321 inline friend fix asin(fix x) { fix t; t.v = fasin(x.v); return t; }
2322 inline friend fix atan(fix x) { fix t; t.v = fatan(x.v); return t; }
2323 inline friend fix atan2(fix x, fix y) { fix t; t.v = fatan2(x.v, y.v); return t; }
2329 #endif /* ifdef __cplusplus */
2332 typedef struct MATRIX /* transformation matrix (fixed point) */
2334 fixed v[3][3]; /* scaling and rotation */
2335 fixed t[3]; /* translation */
2339 typedef struct MATRIX_f /* transformation matrix (floating point) */
2341 float v[3][3]; /* scaling and rotation */
2342 float t[3]; /* translation */
2346 extern MATRIX identity_matrix;
2347 extern MATRIX_f identity_matrix_f;
2350 void get_translation_matrix(MATRIX *m, fixed x, fixed y, fixed z);
2351 void get_translation_matrix_f(MATRIX_f *m, float x, float y, float z);
2353 void get_scaling_matrix(MATRIX *m, fixed x, fixed y, fixed z);
2354 void get_scaling_matrix_f(MATRIX_f *m, float x, float y, float z);
2356 void get_x_rotate_matrix(MATRIX *m, fixed r);
2357 void get_x_rotate_matrix_f(MATRIX_f *m, float r);
2359 void get_y_rotate_matrix(MATRIX *m, fixed r);
2360 void get_y_rotate_matrix_f(MATRIX_f *m, float r);
2362 void get_z_rotate_matrix(MATRIX *m, fixed r);
2363 void get_z_rotate_matrix_f(MATRIX_f *m, float r);
2365 void get_rotation_matrix(MATRIX *m, fixed x, fixed y, fixed z);
2366 void get_rotation_matrix_f(MATRIX_f *m, float x, float y, float z);
2368 void get_align_matrix(MATRIX *m, fixed xfront, fixed yfront, fixed zfront, fixed xup, fixed yup, fixed zup);
2369 void get_align_matrix_f(MATRIX_f *m, float xfront, float yfront, float zfront, float xup, float yup, float zup);
2371 void get_vector_rotation_matrix(MATRIX *m, fixed x, fixed y, fixed z, fixed a);
2372 void get_vector_rotation_matrix_f(MATRIX_f *m, float x, float y, float z, float a);
2374 void get_transformation_matrix(MATRIX *m, fixed scale, fixed xrot, fixed yrot, fixed zrot, fixed x, fixed y, fixed z);
2375 void get_transformation_matrix_f(MATRIX_f *m, float scale, float xrot, float yrot, float zrot, float x, float y, float z);
2377 void get_camera_matrix(MATRIX *m, fixed x, fixed y, fixed z, fixed xfront, fixed yfront, fixed zfront, fixed xup, fixed yup, fixed zup, fixed fov, fixed aspect);
2378 void get_camera_matrix_f(MATRIX_f *m, float x, float y, float z, float xfront, float yfront, float zfront, float xup, float yup, float zup, float fov, float aspect);
2380 void qtranslate_matrix(MATRIX *m, fixed x, fixed y, fixed z);
2381 void qtranslate_matrix_f(MATRIX_f *m, float x, float y, float z);
2383 void qscale_matrix(MATRIX *m, fixed scale);
2384 void qscale_matrix_f(MATRIX_f *m, float scale);
2386 void matrix_mul(MATRIX *m1, MATRIX *m2, MATRIX *out);
2387 void matrix_mul_f(MATRIX_f *m1, MATRIX_f *m2, MATRIX_f *out);
2389 fixed vector_length(fixed x, fixed y, fixed z);
2390 float vector_length_f(float x, float y, float z);
2392 void normalize_vector(fixed *x, fixed *y, fixed *z);
2393 void normalize_vector_f(float *x, float *y, float *z);
2395 void cross_product(fixed x1, fixed y1, fixed z1, fixed x2, fixed y2, fixed z2, fixed *xout, fixed *yout, fixed *zout);
2396 void cross_product_f(float x1, float y1, float z1, float x2, float y2, float z2, float *xout, float *yout, float *zout);
2398 fixed polygon_z_normal(V3D *v1, V3D *v2, V3D *v3);
2399 float polygon_z_normal_f(V3D_f *v1, V3D_f *v2, V3D_f *v3);
2402 __INLINE__ fixed dot_product(fixed x1, fixed y1, fixed z1, fixed x2, fixed y2, fixed z2)
2404 return fmul(x1, x2) + fmul(y1, y2) + fmul(z1, z2);
2408 __INLINE__ float dot_product_f(float x1, float y1, float z1, float x2, float y2, float z2)
2410 return (x1 * x2) + (y1 * y2) + (z1 * z2);
2414 __INLINE__ void apply_matrix(MATRIX *m, fixed x, fixed y, fixed z, fixed *xout, fixed *yout, fixed *zout)
2416 #define CALC_ROW(n) (fmul(x, m->v[n][0]) + \
2417 fmul(y, m->v[n][1]) + \
2418 fmul(z, m->v[n][2]) + \
2421 *xout = CALC_ROW(0);
2422 *yout = CALC_ROW(1);
2423 *zout = CALC_ROW(2);
2429 void apply_matrix_f(MATRIX_f *m, float x, float y, float z, float *xout, float *yout, float *zout);
2431 extern fixed _persp_xscale, _persp_yscale, _persp_xoffset, _persp_yoffset;
2432 extern float _persp_xscale_f, _persp_yscale_f, _persp_xoffset_f, _persp_yoffset_f;
2434 void set_projection_viewport(int x, int y, int w, int h);
2437 __INLINE__ void persp_project(fixed x, fixed y, fixed z, fixed *xout, fixed *yout)
2439 *xout = fmul(fdiv(x, z), _persp_xscale) + _persp_xoffset;
2440 *yout = fmul(fdiv(y, z), _persp_yscale) + _persp_yoffset;
2444 __INLINE__ void persp_project_f(float x, float y, float z, float *xout, float *yout)
2447 *xout = ((x * z1) * _persp_xscale_f) + _persp_xoffset_f;
2448 *yout = ((y * z1) * _persp_yscale_f) + _persp_yoffset_f;
2454 } /* end of extern "C" */
2456 /* overloaded functions for use with the fix class */
2459 __INLINE__ void get_translation_matrix(MATRIX *m, fix x, fix y, fix z)
2461 get_translation_matrix(m, x.v, y.v, z.v);
2465 __INLINE__ void get_scaling_matrix(MATRIX *m, fix x, fix y, fix z)
2467 get_scaling_matrix(m, x.v, y.v, z.v);
2471 __INLINE__ void get_x_rotate_matrix(MATRIX *m, fix r)
2473 get_x_rotate_matrix(m, r.v);
2477 __INLINE__ void get_y_rotate_matrix(MATRIX *m, fix r)
2479 get_y_rotate_matrix(m, r.v);
2483 __INLINE__ void get_z_rotate_matrix(MATRIX *m, fix r)
2485 get_z_rotate_matrix(m, r.v);
2489 __INLINE__ void get_rotation_matrix(MATRIX *m, fix x, fix y, fix z)
2491 get_rotation_matrix(m, x.v, y.v, z.v);
2495 __INLINE__ void get_align_matrix(MATRIX *m, fix xfront, fix yfront, fix zfront, fix xup, fix yup, fix zup)
2497 get_align_matrix(m, xfront.v, yfront.v, zfront.v, xup.v, yup.v, zup.v);
2501 __INLINE__ void get_vector_rotation_matrix(MATRIX *m, fix x, fix y, fix z, fix a)
2503 get_vector_rotation_matrix(m, x.v, y.v, z.v, a.v);
2507 __INLINE__ void get_transformation_matrix(MATRIX *m, fix scale, fix xrot, fix yrot, fix zrot, fix x, fix y, fix z)
2509 get_transformation_matrix(m, scale.v, xrot.v, yrot.v, zrot.v, x.v, y.v, z.v);
2513 __INLINE__ void get_camera_matrix(MATRIX *m, fix x, fix y, fix z, fix xfront, fix yfront, fix zfront, fix xup, fix yup, fix zup, fix fov, fix aspect)
2515 get_camera_matrix(m, x.v, y.v, z.v, xfront.v, yfront.v, zfront.v, xup.v, yup.v, zup.v, fov.v, aspect.v);
2519 __INLINE__ void qtranslate_matrix(MATRIX *m, fix x, fix y, fix z)
2521 qtranslate_matrix(m, x.v, y.v, z.v);
2525 __INLINE__ void qscale_matrix(MATRIX *m, fix scale)
2527 qscale_matrix(m, scale.v);
2531 __INLINE__ fix vector_length(fix x, fix y, fix z)
2534 t.v = vector_length(x.v, y.v, z.v);
2539 __INLINE__ void normalize_vector(fix *x, fix *y, fix *z)
2541 normalize_vector(&x->v, &y->v, &z->v);
2545 __INLINE__ void cross_product(fix x1, fix y1, fix z1, fix x2, fix y2, fix z2, fix *xout, fix *yout, fix *zout)
2547 cross_product(x1.v, y1.v, z1.v, x2.v, y2.v, z2.v, &xout->v, &yout->v, &zout->v);
2551 __INLINE__ fix dot_product(fix x1, fix y1, fix z1, fix x2, fix y2, fix z2)
2554 t.v = dot_product(x1.v, y1.v, z1.v, x2.v, y2.v, z2.v);
2559 __INLINE__ void apply_matrix(MATRIX *m, fix x, fix y, fix z, fix *xout, fix *yout, fix *zout)
2561 apply_matrix(m, x.v, y.v, z.v, &xout->v, &yout->v, &zout->v);
2565 __INLINE__ void persp_project(fix x, fix y, fix z, fix *xout, fix *yout)
2567 persp_project(x.v, y.v, z.v, &xout->v, &yout->v);
2573 #endif /* ifdef __cplusplus */
2579 /***************************************/
2580 /************ GUI routines ************/
2581 /***************************************/
2583 #if !defined alleg_gui_unused
2586 typedef struct DIALOG
2588 int (*proc)(int, struct DIALOG *, int ); /* dialog procedure */
2589 int x, y, w, h; /* position and size of the object */
2590 int fg, bg; /* foreground and background colors */
2591 int key; /* keyboard shortcut (ASCII code) */
2592 int flags; /* flags about the object state */
2593 int d1, d2; /* any data the object might require */
2594 void *dp, *dp2, *dp3; /* pointers to more object data */
2601 char *text; /* menu item text */
2602 int (*proc)(void); /* callback function */
2603 struct MENU *child; /* to allow nested menus */
2604 int flags; /* flags about the menu state */
2605 void *dp; /* any data the menu might require */
2609 /* stored information about the state of an active GUI dialog */
2610 typedef struct DIALOG_PLAYER
2619 int mouse_ox, mouse_oy;
2621 DIALOG *previous_dialog;
2625 #define SEND_MESSAGE(d, msg, c) (d)->proc(msg, d, c)
2627 /* bits for the flags field */
2628 #define D_EXIT 1 /* object makes the dialog exit */
2629 #define D_SELECTED 2 /* object is selected */
2630 #define D_GOTFOCUS 4 /* object has the input focus */
2631 #define D_GOTMOUSE 8 /* mouse is on top of object */
2632 #define D_HIDDEN 16 /* object is not visible */
2633 #define D_DISABLED 32 /* object is visible but inactive */
2634 #define D_INTERNAL 64 /* reserved for internal use */
2635 #define D_USER 128 /* from here on is free for your own use */
2637 /* return values for the dialog procedures */
2638 #define D_O_K 0 /* normal exit status */
2639 #define D_CLOSE 1 /* request to close the dialog */
2640 #define D_REDRAW 2 /* request to redraw the dialog */
2641 #define D_WANTFOCUS 4 /* this object wants the input focus */
2642 #define D_USED_CHAR 8 /* object has used the keypress */
2644 /* messages for the dialog procedures */
2645 #define MSG_START 1 /* start the dialog, initialise */
2646 #define MSG_END 2 /* dialog is finished - cleanup */
2647 #define MSG_DRAW 3 /* draw the object */
2648 #define MSG_CLICK 4 /* mouse click on the object */
2649 #define MSG_DCLICK 5 /* double click on the object */
2650 #define MSG_KEY 6 /* keyboard shortcut */
2651 #define MSG_CHAR 7 /* other keyboard input */
2652 #define MSG_XCHAR 8 /* broadcast character to all objects */
2653 #define MSG_WANTFOCUS 9 /* does object want the input focus? */
2654 #define MSG_GOTFOCUS 10 /* got the input focus */
2655 #define MSG_LOSTFOCUS 11 /* lost the input focus */
2656 #define MSG_GOTMOUSE 12 /* mouse on top of object */
2657 #define MSG_LOSTMOUSE 13 /* mouse moved away from object */
2658 #define MSG_IDLE 14 /* update any background stuff */
2659 #define MSG_RADIO 15 /* clear radio buttons */
2660 #define MSG_USER 16 /* from here on are free... */
2662 /* some dialog procedures */
2663 int d_clear_proc(int msg, DIALOG *d, int c);
2664 int d_box_proc(int msg, DIALOG *d, int c);
2665 int d_shadow_box_proc(int msg, DIALOG *d, int c);
2666 int d_bitmap_proc(int msg, DIALOG *d, int c);
2667 int d_text_proc(int msg, DIALOG *d, int c);
2668 int d_ctext_proc(int msg, DIALOG *d, int c);
2669 int d_button_proc(int msg, DIALOG *d, int c);
2670 int d_check_proc(int msg, DIALOG *d, int c);
2671 int d_radio_proc(int msg, DIALOG *d, int c);
2672 int d_icon_proc(int msg, DIALOG *d, int c);
2673 int d_keyboard_proc(int msg, DIALOG *d, int c);
2674 int d_edit_proc(int msg, DIALOG *d, int c);
2675 int d_list_proc(int msg, DIALOG *d, int c);
2676 int d_textbox_proc(int msg, DIALOG *d, int c);
2677 int d_slider_proc(int msg, DIALOG *d, int c);
2678 int d_menu_proc(int msg, DIALOG *d, int c);
2680 extern DIALOG *active_dialog;
2681 extern MENU *active_menu;
2683 extern int gui_mouse_focus;
2684 extern int gui_fg_color, gui_mg_color, gui_bg_color;
2685 extern int gui_font_baseline;
2687 int gui_textout(BITMAP *bmp, unsigned char *s, int x, int y, int color, int centre);
2688 int gui_strlen(unsigned char *s);
2689 void centre_dialog(DIALOG *dialog);
2690 void set_dialog_color(DIALOG *dialog, int fg, int bg);
2691 int find_dialog_focus(DIALOG *dialog);
2692 int dialog_message(DIALOG *dialog, int msg, int c, int *obj);
2693 int broadcast_dialog_message(int msg, int c);
2694 int do_dialog(DIALOG *dialog, int focus_obj);
2695 int popup_dialog(DIALOG *dialog, int focus_obj);
2696 DIALOG_PLAYER *init_dialog(DIALOG *dialog, int focus_obj);
2697 int update_dialog(DIALOG_PLAYER *player);
2698 int shutdown_dialog(DIALOG_PLAYER *player);
2699 int do_menu(MENU *menu, int x, int y);
2700 int alert(char *s1, char *s2, char *s3, char *b1, char *b2, int c1, int c2);
2701 int alert3(char *s1, char *s2, char *s3, char *b1, char *b2, char *b3, int c1, int c2, int c3);
2702 int file_select(char *message, char *path, char *ext);
2703 int gfx_mode_select(int *card, int *w, int *h);
2704 int gfx_mode_select_ex(int *card, int *w, int *h, int *color_depth);
2714 #endif /* ifndef ALLEGRO_H */