sig
  external allegro_init : unit -> unit = "ml_allegro_init"
  external allegro_exit : unit -> unit = "ml_allegro_exit"
  external allegro_message : string -> unit = "ml_allegro_message"
  external get_allegro_error : unit -> string = "ml_get_allegro_error"
  external allegro_id : unit -> string = "ml_get_allegro_id"
  external allegro_version :
    unit -> int * int * int * string * int * int * int = "ml_alleg_version"
  external set_window_title : name:string -> unit = "ml_set_window_title"
  external cpu_vendor : unit -> string = "ml_cpu_vendor"
  type cpu_family =
      CPU_FAMILY_UNKNOWN
    | CPU_FAMILY_I386
    | CPU_FAMILY_I486
    | CPU_FAMILY_I586
    | CPU_FAMILY_I686
    | CPU_FAMILY_ITANIUM
    | CPU_FAMILY_POWERPC
    | CPU_FAMILY_EXTENDED
    | CPU_FAMILY_NOT_FOUND
  external get_cpu_family : unit -> Allegro.cpu_family = "ml_get_cpu_family"
  external os_version : unit -> int = "ml_os_version"
  external os_revision : unit -> int = "ml_os_revision"
  external os_multitasking : unit -> bool = "ml_os_multitasking"
  external desktop_color_depth : unit -> int = "ml_desktop_color_depth"
  external get_desktop_resolution : unit -> int * int
    = "ml_get_desktop_resolution"
  external set_color_depth : depth:int -> unit = "ml_set_color_depth"
  external get_color_depth : unit -> int = "ml_get_color_depth"
  external get_screen_width : unit -> int = "ml_get_screen_w"
  external get_screen_height : unit -> int = "ml_get_screen_h"
  external get_virtual_width : unit -> int = "ml_get_virtual_w"
  external get_virtual_height : unit -> int = "ml_get_virtual_h"
  external request_refresh_rate : rate:int -> unit
    = "ml_request_refresh_rate"
  external get_refresh_rate : unit -> int = "ml_get_refresh_rate"
  type gfx_driver =
      GFX_AUTODETECT
    | GFX_AUTODETECT_FULLSCREEN
    | GFX_AUTODETECT_WINDOWED
    | GFX_SAFE
    | GFX_TEXT
  external set_gfx_mode :
    gfx_driver:Allegro.gfx_driver ->
    width:int ->
    height:int -> virtual_width:int -> virtual_height:int -> unit
    = "ml_set_gfx_mode"
  external get_gfx_driver_name : unit -> string = "get_gfx_driver_name"
  external enable_triple_buffer : unit -> bool = "ml_enable_triple_buffer"
  external vsync : unit -> unit = "ml_vsync"
  external scroll_screen : x:int -> y:int -> unit = "ml_scroll_screen"
  external request_scroll : x:int -> y:int -> unit = "ml_request_scroll"
  external poll_scroll : unit -> bool = "ml_poll_scroll"
  type gfx_capabilities =
      GFX_CAN_SCROLL
    | GFX_CAN_TRIPLE_BUFFER
    | GFX_HW_CURSOR
    | GFX_SYSTEM_CURSOR
    | GFX_HW_HLINE
    | GFX_HW_HLINE_XOR
    | GFX_HW_HLINE_SOLID_PATTERN
    | GFX_HW_HLINE_COPY_PATTERN
    | GFX_HW_FILL
    | GFX_HW_FILL_XOR
    | GFX_HW_FILL_SOLID_PATTERN
    | GFX_HW_FILL_COPY_PATTERN
    | GFX_HW_LINE
    | GFX_HW_LINE_XOR
    | GFX_HW_TRIANGLE
    | GFX_HW_TRIANGLE_XOR
    | GFX_HW_GLYPH
    | GFX_HW_VRAM_BLIT
    | GFX_HW_VRAM_BLIT_MASKED
    | GFX_HW_MEM_BLIT
    | GFX_HW_MEM_BLIT_MASKED
    | GFX_HW_SYS_TO_VRAM_BLIT
    | GFX_HW_SYS_TO_VRAM_BLIT_MASKED
    | GFX_HW_VRAM_STRETCH_BLIT
    | GFX_HW_SYS_STRETCH_BLIT
    | GFX_HW_VRAM_STRETCH_BLIT_MASKED
    | GFX_HW_SYS_STRETCH_BLIT_MASKED
  external get_gfx_capabilities : unit -> Allegro.gfx_capabilities list
    = "get_gfx_capabilities"
  type switch_mode =
      SWITCH_NONE
    | SWITCH_PAUSE
    | SWITCH_AMNESIA
    | SWITCH_BACKGROUND
    | SWITCH_BACKAMNESIA
  external set_display_switch_mode : Allegro.switch_mode -> unit
    = "ml_set_display_switch_mode"
  external get_display_switch_mode : unit -> Allegro.switch_mode
    = "ml_get_display_switch_mode"
  external is_windowed_mode : unit -> bool = "ml_is_windowed_mode"
  external allegro_vram_single_surface : unit -> bool
    = "ml_vram_single_surface"
  external allegro_dos : unit -> bool = "ml_allegro_dos"
  type color
  external makecol : r:int -> g:int -> b:int -> Allegro.color = "ml_makecol"
  external makecol_depth :
    depth:int -> r:int -> g:int -> b:int -> Allegro.color
    = "ml_makecol_depth"
  external transparent : unit -> Allegro.color = "get_transparent"
  external makeacol : r:int -> g:int -> b:int -> a:int -> Allegro.color
    = "ml_makeacol"
  external makeacol_depth :
    depth:int -> r:int -> g:int -> b:int -> a:int -> Allegro.color
    = "ml_makeacol_depth"
  external color_index : int -> Allegro.color = "%identity"
  external getr : Allegro.color -> int = "ml_getr"
  external getg : Allegro.color -> int = "ml_getg"
  external getb : Allegro.color -> int = "ml_getb"
  external geta : Allegro.color -> int = "ml_geta"
  external palette_color : int -> Allegro.color = "ml_palette_color"
  external makecol8 : r:int -> g:int -> b:int -> Allegro.color
    = "ml_makecol8"
  external makecol15 : r:int -> g:int -> b:int -> Allegro.color
    = "ml_makecol15"
  external makecol16 : r:int -> g:int -> b:int -> Allegro.color
    = "ml_makecol16"
  external makecol24 : r:int -> g:int -> b:int -> Allegro.color
    = "ml_makecol24"
  external makecol32 : r:int -> g:int -> b:int -> Allegro.color
    = "ml_makecol32"
  external makeacol32 : r:int -> g:int -> b:int -> a:int -> Allegro.color
    = "ml_makeacol32"
  external makecol15_dither :
    r:int -> g:int -> b:int -> x:int -> y:int -> Allegro.color
    = "ml_makecol15_dither"
  external makecol16_dither :
    r:int -> g:int -> b:int -> x:int -> y:int -> Allegro.color
    = "ml_makecol16_dither"
  external getr8 : Allegro.color -> int = "ml_getr8"
  external getg8 : Allegro.color -> int = "ml_getg8"
  external getb8 : Allegro.color -> int = "ml_getb8"
  external getr15 : Allegro.color -> int = "ml_getr15"
  external getg15 : Allegro.color -> int = "ml_getg15"
  external getb15 : Allegro.color -> int = "ml_getb15"
  external getr16 : Allegro.color -> int = "ml_getr16"
  external getg16 : Allegro.color -> int = "ml_getg16"
  external getb16 : Allegro.color -> int = "ml_getb16"
  external getr24 : Allegro.color -> int = "ml_getr24"
  external getg24 : Allegro.color -> int = "ml_getg24"
  external getb24 : Allegro.color -> int = "ml_getb24"
  external getr32 : Allegro.color -> int = "ml_getr32"
  external getg32 : Allegro.color -> int = "ml_getg32"
  external getb32 : Allegro.color -> int = "ml_getb32"
  external geta32 : Allegro.color -> int = "ml_geta32"
  external getr_depth : depth:int -> Allegro.color -> int = "ml_getr_depth"
  external getg_depth : depth:int -> Allegro.color -> int = "ml_getg_depth"
  external getb_depth : depth:int -> Allegro.color -> int = "ml_getb_depth"
  external geta_depth : depth:int -> Allegro.color -> int = "ml_geta_depth"
  type palette
  external new_palette : unit -> Allegro.palette = "new_palette"
  external free_palette : pal:Allegro.palette -> unit = "free_palette"
  external set_palette : pal:Allegro.palette -> unit = "ml_set_palette"
  external get_palette : pal:Allegro.palette -> unit = "ml_get_palette"
  external set_color : index:int -> r:int -> g:int -> b:int -> a:int -> unit
    = "ml_set_color"
  external get_desktop_palette : unit -> Allegro.palette
    = "ml_get_desktop_palette"
  external generate_332_palette : pal:Allegro.palette -> unit
    = "ml_generate_332_palette"
  external select_palette : pal:Allegro.palette -> unit = "ml_select_palette"
  external unselect_palette : unit -> unit = "ml_unselect_palette"
  external palette_set_rgb :
    pal:Allegro.palette -> i:int -> r:int -> g:int -> b:int -> unit
    = "ml_palette_set_rgb"
  external palette_set_rgba :
    pal:Allegro.palette -> i:int -> r:int -> g:int -> b:int -> a:int -> unit
    = "ml_palette_set_rgba_bytecode" "ml_palette_set_rgba_native"
  external palette_get_rgb : pal:Allegro.palette -> i:int -> int * int * int
    = "ml_palette_get_rgb"
  external palette_get_rgba :
    pal:Allegro.palette -> i:int -> int * int * int * int
    = "ml_palette_get_rgba"
  external palette_copy_index :
    src:Allegro.palette -> dst:Allegro.palette -> i:int -> unit
    = "ml_palette_copy_index"
  external hsv_to_rgb : h:float -> s:float -> v:float -> int * int * int
    = "ml_hsv_to_rgb"
  external rgb_to_hsv : r:int -> g:int -> b:int -> float * float * float
    = "ml_rgb_to_hsv"
  type bitmap
  external get_screen : unit -> Allegro.bitmap = "ml_get_screen"
  external create_bitmap : width:int -> height:int -> Allegro.bitmap
    = "ml_create_bitmap"
  external create_sub_bitmap :
    parent:Allegro.bitmap ->
    x:int -> y:int -> width:int -> height:int -> Allegro.bitmap
    = "ml_create_sub_bitmap"
  external create_video_bitmap : width:int -> height:int -> Allegro.bitmap
    = "ml_create_video_bitmap"
  external create_system_bitmap : width:int -> height:int -> Allegro.bitmap
    = "ml_create_system_bitmap"
  external create_bitmap_ex :
    color_depth:int -> width:int -> height:int -> Allegro.bitmap
    = "ml_create_bitmap_ex"
  external bitmap_color_depth : bmp:Allegro.bitmap -> int
    = "ml_bitmap_color_depth"
  external destroy_bitmap : bmp:Allegro.bitmap -> unit = "ml_destroy_bitmap"
  external get_bitmap_width : bmp:Allegro.bitmap -> int = "get_bitmap_width"
  external get_bitmap_height : bmp:Allegro.bitmap -> int
    = "get_bitmap_height"
  external acquire_bitmap : bmp:Allegro.bitmap -> unit = "ml_acquire_bitmap"
  external release_bitmap : bmp:Allegro.bitmap -> unit = "ml_release_bitmap"
  external acquire_screen : unit -> unit = "ml_acquire_screen"
  external release_screen : unit -> unit = "ml_release_screen"
  external bitmap_mask_color : bmp:Allegro.bitmap -> Allegro.color
    = "ml_bitmap_mask_color"
  external is_same_bitmap :
    bmp1:Allegro.bitmap -> bmp2:Allegro.bitmap -> bool = "ml_is_same_bitmap"
  external show_video_bitmap : bmp:Allegro.bitmap -> unit
    = "ml_show_video_bitmap"
  external request_video_bitmap : bmp:Allegro.bitmap -> unit
    = "ml_request_video_bitmap"
  external clear_bitmap : bmp:Allegro.bitmap -> unit = "ml_clear_bitmap"
  external clear_to_color : bmp:Allegro.bitmap -> color:Allegro.color -> unit
    = "ml_clear_to_color"
  external add_clip_rect :
    bmp:Allegro.bitmap -> x1:int -> y1:int -> x2:int -> y2:int -> unit
    = "ml_add_clip_rect"
  external set_clip_rect :
    bmp:Allegro.bitmap -> x1:int -> y1:int -> x2:int -> y2:int -> unit
    = "ml_set_clip_rect"
  external set_clip_state : bmp:Allegro.bitmap -> bool -> unit
    = "ml_set_clip_state"
  external get_clip_state : bmp:Allegro.bitmap -> bool = "ml_get_clip_state"
  external is_planar_bitmap : bmp:Allegro.bitmap -> bool
    = "ml_is_planar_bitmap"
  external is_linear_bitmap : bmp:Allegro.bitmap -> bool
    = "ml_is_linear_bitmap"
  external is_memory_bitmap : bmp:Allegro.bitmap -> bool
    = "ml_is_memory_bitmap"
  external is_screen_bitmap : bmp:Allegro.bitmap -> bool
    = "ml_is_screen_bitmap"
  external is_video_bitmap : bmp:Allegro.bitmap -> bool
    = "ml_is_video_bitmap"
  external is_system_bitmap : bmp:Allegro.bitmap -> bool
    = "ml_is_system_bitmap"
  external is_sub_bitmap : bmp:Allegro.bitmap -> bool = "ml_is_sub_bitmap"
  external load_bitmap : string -> Allegro.palette -> Allegro.bitmap
    = "ml_load_bitmap"
  external load_bmp : string -> Allegro.palette -> Allegro.bitmap
    = "ml_load_bmp"
  external load_lbm : string -> Allegro.palette -> Allegro.bitmap
    = "ml_load_lbm"
  external load_pcx : string -> Allegro.palette -> Allegro.bitmap
    = "ml_load_pcx"
  external load_tga : string -> Allegro.palette -> Allegro.bitmap
    = "ml_load_tga"
  external blit :
    src:Allegro.bitmap ->
    dest:Allegro.bitmap ->
    src_x:int ->
    src_y:int -> dest_x:int -> dest_y:int -> width:int -> height:int -> unit
    = "ml_blit_bytecode" "ml_blit_native"
  external masked_blit :
    src:Allegro.bitmap ->
    dest:Allegro.bitmap ->
    src_x:int ->
    src_y:int -> dest_x:int -> dest_y:int -> width:int -> height:int -> unit
    = "ml_masked_blit_bytecode" "ml_masked_blit_native"
  external stretch_blit :
    src:Allegro.bitmap ->
    dest:Allegro.bitmap ->
    src_x:int ->
    src_y:int ->
    src_width:int ->
    src_height:int ->
    dest_x:int -> dest_y:int -> dest_width:int -> dest_height:int -> unit
    = "ml_stretch_blit_bytecode" "ml_stretch_blit_native"
  external masked_stretch_blit :
    src:Allegro.bitmap ->
    dest:Allegro.bitmap ->
    src_x:int ->
    src_y:int ->
    src_width:int ->
    src_height:int ->
    dest_x:int -> dest_y:int -> dest_width:int -> dest_height:int -> unit
    = "ml_masked_stretch_blit_bytecode" "ml_masked_stretch_blit_native"
  type color_conversion =
      COLORCONV_NONE
    | COLORCONV_8_TO_15
    | COLORCONV_8_TO_16
    | COLORCONV_8_TO_24
    | COLORCONV_8_TO_32
    | COLORCONV_15_TO_8
    | COLORCONV_15_TO_16
    | COLORCONV_15_TO_24
    | COLORCONV_15_TO_32
    | COLORCONV_16_TO_8
    | COLORCONV_16_TO_15
    | COLORCONV_16_TO_24
    | COLORCONV_16_TO_32
    | COLORCONV_24_TO_8
    | COLORCONV_24_TO_15
    | COLORCONV_24_TO_16
    | COLORCONV_24_TO_32
    | COLORCONV_32_TO_8
    | COLORCONV_32_TO_15
    | COLORCONV_32_TO_16
    | COLORCONV_32_TO_24
    | COLORCONV_32A_TO_8
    | COLORCONV_32A_TO_15
    | COLORCONV_32A_TO_16
    | COLORCONV_32A_TO_24
    | COLORCONV_DITHER_PAL
    | COLORCONV_DITHER_HI
    | COLORCONV_KEEP_TRANS
    | COLORCONV_EXPAND_256
    | COLORCONV_REDUCE_TO_256
    | COLORCONV_EXPAND_15_TO_16
    | COLORCONV_REDUCE_16_TO_15
    | COLORCONV_EXPAND_HI_TO_TRUE
    | COLORCONV_REDUCE_TRUE_TO_HI
    | COLORCONV_24_EQUALS_32
    | COLORCONV_TOTAL
    | COLORCONV_PARTIAL
    | COLORCONV_MOST
    | COLORCONV_DITHER
  external set_color_conversion : Allegro.color_conversion -> unit
    = "ml_set_color_conversion"
  external install_keyboard : unit -> unit = "ml_install_keyboard"
  external poll_keyboard : unit -> unit = "ml_poll_keyboard"
  external keypressed : unit -> bool = "ml_keypressed"
  external readkey : unit -> char = "ml_readkey"
  external key_esc : unit -> bool = "ml_key_key_esc"
  external key_enter : unit -> bool = "ml_key_key_enter"
  external key_left : unit -> bool = "ml_key_key_left"
  external key_right : unit -> bool = "ml_key_key_right"
  external key_up : unit -> bool = "ml_key_key_up"
  external key_down : unit -> bool = "ml_key_key_down"
  type kb_flag =
      KB_SHIFT_FLAG
    | KB_CTRL_FLAG
    | KB_ALT_FLAG
    | KB_LWIN_FLAG
    | KB_RWIN_FLAG
    | KB_MENU_FLAG
    | KB_COMMAND_FLAG
    | KB_SCROLOCK_FLAG
    | KB_NUMLOCK_FLAG
    | KB_CAPSLOCK_FLAG
    | KB_INALTSEQ_FLAG
    | KB_ACCENT1_FLAG
    | KB_ACCENT2_FLAG
    | KB_ACCENT3_FLAG
    | KB_ACCENT4_FLAG
  external get_kb_flag : Allegro.kb_flag -> bool = "get_kb_flag"
  type scancode =
      KEY_A
    | KEY_B
    | KEY_C
    | KEY_D
    | KEY_E
    | KEY_F
    | KEY_G
    | KEY_H
    | KEY_I
    | KEY_J
    | KEY_K
    | KEY_L
    | KEY_M
    | KEY_N
    | KEY_O
    | KEY_P
    | KEY_Q
    | KEY_R
    | KEY_S
    | KEY_T
    | KEY_U
    | KEY_V
    | KEY_W
    | KEY_X
    | KEY_Y
    | KEY_Z
    | KEY_0
    | KEY_1
    | KEY_2
    | KEY_3
    | KEY_4
    | KEY_5
    | KEY_6
    | KEY_7
    | KEY_8
    | KEY_9
    | KEY_0_PAD
    | KEY_1_PAD
    | KEY_2_PAD
    | KEY_3_PAD
    | KEY_4_PAD
    | KEY_5_PAD
    | KEY_6_PAD
    | KEY_7_PAD
    | KEY_8_PAD
    | KEY_9_PAD
    | KEY_F1
    | KEY_F2
    | KEY_F3
    | KEY_F4
    | KEY_F5
    | KEY_F6
    | KEY_F7
    | KEY_F8
    | KEY_F9
    | KEY_F10
    | KEY_F11
    | KEY_F12
    | KEY_ESC
    | KEY_TILDE
    | KEY_MINUS
    | KEY_EQUALS
    | KEY_BACKSPACE
    | KEY_TAB
    | KEY_OPENBRACE
    | KEY_CLOSEBRACE
    | KEY_ENTER
    | KEY_COLON
    | KEY_QUOTE
    | KEY_BACKSLASH
    | KEY_BACKSLASH2
    | KEY_COMMA
    | KEY_STOP
    | KEY_SLASH
    | KEY_SPACE
    | KEY_INSERT
    | KEY_DEL
    | KEY_HOME
    | KEY_END
    | KEY_PGUP
    | KEY_PGDN
    | KEY_LEFT
    | KEY_RIGHT
    | KEY_UP
    | KEY_DOWN
    | KEY_SLASH_PAD
    | KEY_ASTERISK
    | KEY_MINUS_PAD
    | KEY_PLUS_PAD
    | KEY_DEL_PAD
    | KEY_ENTER_PAD
    | KEY_PRTSCR
    | KEY_PAUSE
    | KEY_ABNT_C1
    | KEY_YEN
    | KEY_KANA
    | KEY_CONVERT
    | KEY_NOCONVERT
    | KEY_AT
    | KEY_CIRCUMFLEX
    | KEY_COLON2
    | KEY_KANJI
    | KEY_LSHIFT
    | KEY_RSHIFT
    | KEY_LCONTROL
    | KEY_RCONTROL
    | KEY_ALT
    | KEY_ALTGR
    | KEY_LWIN
    | KEY_RWIN
    | KEY_MENU
    | KEY_SCRLOCK
    | KEY_NUMLOCK
    | KEY_CAPSLOCK
    | KEY_EQUALS_PAD
    | KEY_BACKQUOTE
    | KEY_SEMICOLON
    | KEY_COMMAND
  external readkey_scancode : unit -> Allegro.scancode
    = "ml_readkey_scancode"
  external clear_keybuf : unit -> unit = "ml_clear_keybuf"
  external set_keyboard_rate : delay:int -> repeat:int -> unit
    = "ml_set_keyboard_rate"
  external remove_keyboard : unit -> unit = "ml_remove_keyboard"
  external install_timer : unit -> unit = "ml_install_timer"
  external retrace_count : unit -> int = "get_retrace_count"
  external rest : time:int -> unit = "ml_rest"
  external install_mouse : unit -> int = "ml_install_mouse"
  external poll_mouse : unit -> unit = "ml_poll_mouse"
  external mouse_driver_name : unit -> string = "get_mouse_driver_name"
  external enable_hardware_cursor : unit -> unit
    = "ml_enable_hardware_cursor"
  external disable_hardware_cursor : unit -> unit
    = "ml_disable_hardware_cursor"
  type mouse_cursor =
      MOUSE_CURSOR_NONE
    | MOUSE_CURSOR_ALLEGRO
    | MOUSE_CURSOR_ARROW
    | MOUSE_CURSOR_BUSY
    | MOUSE_CURSOR_QUESTION
    | MOUSE_CURSOR_EDIT
  external select_mouse_cursor : Allegro.mouse_cursor -> unit
    = "ml_select_mouse_cursor"
  external set_mouse_cursor_bitmap :
    Allegro.mouse_cursor -> bmp:Allegro.bitmap -> unit
    = "ml_set_mouse_cursor_bitmap"
  external show_mouse : bmp:Allegro.bitmap -> unit = "ml_show_mouse"
  external hide_mouse : unit -> unit = "ml_hide_mouse"
  external scare_mouse : unit -> unit = "ml_scare_mouse"
  external scare_mouse_area : x:int -> y:int -> w:int -> h:int -> unit
    = "ml_scare_mouse_area"
  external unscare_mouse : unit -> unit = "ml_unscare_mouse"
  external position_mouse : x:int -> y:int -> unit = "ml_position_mouse"
  external position_mouse_z : z:int -> unit = "ml_position_mouse_z"
  external set_mouse_range : x1:int -> y1:int -> x2:int -> y2:int -> unit
    = "ml_set_mouse_range"
  external set_mouse_speed : xspeed:int -> yspeed:int -> unit
    = "ml_set_mouse_speed"
  external set_mouse_sprite : sprite:Allegro.bitmap -> unit
    = "ml_set_mouse_sprite"
  external set_mouse_sprite_focus : x:int -> y:int -> unit
    = "ml_set_mouse_sprite_focus"
  external get_mouse_mickeys : unit -> int * int = "ml_get_mouse_mickeys"
  external get_mouse_x : unit -> int = "ml_mouse_x"
  external get_mouse_y : unit -> int = "ml_mouse_y"
  external get_mouse_z : unit -> int = "ml_mouse_z"
  external get_mouse_x_focus : unit -> int = "ml_mouse_x_focus"
  external get_mouse_y_focus : unit -> int = "ml_mouse_y_focus"
  external left_button_pressed : unit -> bool = "left_button_pressed"
  external right_button_pressed : unit -> bool = "right_button_pressed"
  external middle_button_pressed : unit -> bool = "middle_button_pressed"
  external get_mouse_b : unit -> int = "get_mouse_b"
  external get_mouse_pos : unit -> int * int = "get_mouse_pos"
  type fixed
  external itofix : int -> Allegro.fixed = "ml_itofix"
  external fixtoi : Allegro.fixed -> int = "ml_fixtoi"
  external ftofix : float -> Allegro.fixed = "ml_ftofix"
  external fixtof : Allegro.fixed -> float = "ml_fixtof"
  external fixadd : Allegro.fixed -> Allegro.fixed -> Allegro.fixed
    = "ml_fixadd"
  external fixsub : Allegro.fixed -> Allegro.fixed -> Allegro.fixed
    = "ml_fixsub"
  external fixdiv : Allegro.fixed -> Allegro.fixed -> Allegro.fixed
    = "ml_fixdiv"
  external fixmul : Allegro.fixed -> Allegro.fixed -> Allegro.fixed
    = "ml_fixmul"
  external fixhypot : Allegro.fixed -> Allegro.fixed -> Allegro.fixed
    = "ml_fixhypot"
  external fixceil : Allegro.fixed -> int = "ml_fixceil"
  external fixfloor : Allegro.fixed -> int = "ml_fixfloor"
  external fixsin : Allegro.fixed -> Allegro.fixed = "ml_fixsin"
  external fixcos : Allegro.fixed -> Allegro.fixed = "ml_fixcos"
  external fixtan : Allegro.fixed -> Allegro.fixed = "ml_fixtan"
  external fixasin : Allegro.fixed -> Allegro.fixed = "ml_fixasin"
  external fixacos : Allegro.fixed -> Allegro.fixed = "ml_fixacos"
  external fixatan : Allegro.fixed -> Allegro.fixed = "ml_fixatan"
  external fixsqrt : Allegro.fixed -> Allegro.fixed = "ml_fixsqrt"
  external to_rad : Allegro.fixed -> Allegro.fixed = "ml_fixtorad"
  external of_rad : Allegro.fixed -> Allegro.fixed = "ml_fixofrad"
  external fixminus : Allegro.fixed -> Allegro.fixed = "ml_fixminus"
  external fixatan2 : y:Allegro.fixed -> x:Allegro.fixed -> Allegro.fixed
    = "ml_fixatan2"
  external putpixel :
    bmp:Allegro.bitmap -> x:int -> y:int -> color:Allegro.color -> unit
    = "ml_putpixel"
  external rect :
    bmp:Allegro.bitmap ->
    x1:int -> y1:int -> x2:int -> y2:int -> color:Allegro.color -> unit
    = "ml_rect_bytecode" "ml_rect_native"
  external rectfill :
    bmp:Allegro.bitmap ->
    x1:int -> y1:int -> x2:int -> y2:int -> color:Allegro.color -> unit
    = "ml_rectfill_bytecode" "ml_rectfill_native"
  external arc :
    bmp:Allegro.bitmap ->
    x:int ->
    y:int ->
    angle1:Allegro.fixed ->
    angle2:Allegro.fixed -> r:int -> color:Allegro.color -> unit
    = "ml_arc_bytecode" "ml_arc_native"
  external floodfill :
    bmp:Allegro.bitmap -> x:int -> y:int -> color:Allegro.color -> unit
    = "ml_floodfill"
  external spline :
    bmp:Allegro.bitmap ->
    x1:int ->
    y1:int ->
    x2:int ->
    y2:int ->
    x3:int -> y3:int -> x4:int -> y4:int -> color:Allegro.color -> unit
    = "ml_spline_bytecode" "ml_spline_native"
  external circle :
    bmp:Allegro.bitmap ->
    x:int -> y:int -> radius:int -> color:Allegro.color -> unit = "ml_circle"
  external circlefill :
    bmp:Allegro.bitmap ->
    x:int -> y:int -> radius:int -> color:Allegro.color -> unit
    = "ml_circlefill"
  external ellipse :
    bmp:Allegro.bitmap ->
    x:int -> y:int -> rx:int -> ry:int -> color:Allegro.color -> unit
    = "ml_ellipse_bytecode" "ml_ellipse_native"
  external ellipsefill :
    bmp:Allegro.bitmap ->
    x:int -> y:int -> rx:int -> ry:int -> color:Allegro.color -> unit
    = "ml_ellipsefill_bytecode" "ml_ellipsefill_native"
  external triangle :
    bmp:Allegro.bitmap ->
    x1:int ->
    y1:int ->
    x2:int -> y2:int -> x3:int -> y3:int -> color:Allegro.color -> unit
    = "ml_triangle_bytecode" "ml_triangle_native"
  external line :
    bmp:Allegro.bitmap ->
    x1:int -> y1:int -> x2:int -> y2:int -> color:Allegro.color -> unit
    = "ml_line_bytecode" "ml_line_native"
  external fastline :
    bmp:Allegro.bitmap ->
    x1:int -> y1:int -> x2:int -> y2:int -> color:Allegro.color -> unit
    = "ml_fastline_bytecode" "ml_fastline_native"
  external vline :
    bmp:Allegro.bitmap ->
    x:int -> y1:int -> y2:int -> color:Allegro.color -> unit = "ml_vline"
  external hline :
    bmp:Allegro.bitmap ->
    x1:int -> y:int -> x2:int -> color:Allegro.color -> unit = "ml_hline"
  external getpixel : bmp:Allegro.bitmap -> x:int -> y:int -> Allegro.color
    = "ml_getpixel"
  val do_circle :
    bmp:Allegro.bitmap ->
    x:int ->
    y:int ->
    radius:int ->
    d:int ->
    proc:(bmp:Allegro.bitmap -> x:int -> y:int -> d:int -> unit) -> unit
  val do_ellipse :
    bmp:Allegro.bitmap ->
    x:int ->
    y:int ->
    rx:int ->
    ry:int ->
    d:int ->
    proc:(bmp:Allegro.bitmap -> x:int -> y:int -> d:int -> unit) -> unit
  external draw_sprite :
    bmp:Allegro.bitmap -> sprite:Allegro.bitmap -> x:int -> y:int -> unit
    = "ml_draw_sprite"
  external draw_sprite_v_flip :
    bmp:Allegro.bitmap -> sprite:Allegro.bitmap -> x:int -> y:int -> unit
    = "draw_sprite_v_flip"
  external draw_sprite_h_flip :
    bmp:Allegro.bitmap -> sprite:Allegro.bitmap -> x:int -> y:int -> unit
    = "draw_sprite_h_flip"
  external draw_sprite_vh_flip :
    bmp:Allegro.bitmap -> sprite:Allegro.bitmap -> x:int -> y:int -> unit
    = "draw_sprite_vh_flip"
  external rotate_sprite :
    bmp:Allegro.bitmap ->
    sprite:Allegro.bitmap -> x:int -> y:int -> angle:Allegro.fixed -> unit
    = "ml_rotate_sprite"
  external rotate_sprite_v_flip :
    bmp:Allegro.bitmap ->
    sprite:Allegro.bitmap -> x:int -> y:int -> angle:Allegro.fixed -> unit
    = "ml_rotate_sprite_v_flip"
  external rotate_scaled_sprite :
    bmp:Allegro.bitmap ->
    sprite:Allegro.bitmap ->
    x:int -> y:int -> angle:Allegro.fixed -> scale:Allegro.fixed -> unit
    = "ml_rotate_scaled_sprite_bytecode" "ml_rotate_scaled_sprite_native"
  external rotate_scaled_sprite_v_flip :
    bmp:Allegro.bitmap ->
    sprite:Allegro.bitmap ->
    x:int -> y:int -> angle:Allegro.fixed -> scale:Allegro.fixed -> unit
    = "ml_rotate_scaled_sprite_v_flip_bytecode"
    "ml_rotate_scaled_sprite_v_flip_native"
  external pivot_sprite :
    bmp:Allegro.bitmap ->
    sprite:Allegro.bitmap ->
    x:int -> y:int -> cx:int -> cy:int -> angle:Allegro.fixed -> unit
    = "ml_pivot_sprite_bytecode" "ml_pivot_sprite_native"
  external pivot_sprite_v_flip :
    bmp:Allegro.bitmap ->
    sprite:Allegro.bitmap ->
    x:int -> y:int -> cx:int -> cy:int -> angle:Allegro.fixed -> unit
    = "ml_pivot_sprite_v_flip_bytecode" "ml_pivot_sprite_v_flip_native"
  external pivot_scaled_sprite :
    bmp:Allegro.bitmap ->
    sprite:Allegro.bitmap ->
    x:int ->
    y:int ->
    cx:int -> cy:int -> angle:Allegro.fixed -> scale:Allegro.fixed -> unit
    = "ml_pivot_scaled_sprite_bytecode" "ml_pivot_scaled_sprite_native"
  external pivot_scaled_sprite_v_flip :
    bmp:Allegro.bitmap ->
    sprite:Allegro.bitmap ->
    x:int ->
    y:int ->
    cx:int -> cy:int -> angle:Allegro.fixed -> scale:Allegro.fixed -> unit
    = "ml_pivot_scaled_sprite_v_flip_bytecode"
    "ml_pivot_scaled_sprite_v_flip_native"
  external stretch_sprite :
    bmp:Allegro.bitmap ->
    sprite:Allegro.bitmap -> x:int -> y:int -> w:int -> h:int -> unit
    = "ml_stretch_sprite_bytecode" "ml_stretch_sprite_native"
  external draw_character_ex :
    bmp:Allegro.bitmap ->
    sprite:Allegro.bitmap ->
    x:int -> y:int -> color:Allegro.color -> bg:Allegro.color -> unit
    = "ml_draw_character_ex_bytecode" "ml_draw_character_ex_native"
  external draw_lit_sprite :
    bmp:Allegro.bitmap ->
    sprite:Allegro.bitmap -> x:int -> y:int -> color:Allegro.color -> unit
    = "ml_draw_lit_sprite"
  external draw_trans_sprite :
    bmp:Allegro.bitmap -> sprite:Allegro.bitmap -> x:int -> y:int -> unit
    = "ml_draw_trans_sprite"
  external draw_gouraud_sprite :
    bmp:Allegro.bitmap ->
    sprite:Allegro.bitmap ->
    x:int ->
    y:int ->
    c1:Allegro.color ->
    c2:Allegro.color -> c3:Allegro.color -> c4:Allegro.color -> unit
    = "ml_draw_gouraud_sprite_bytecode" "ml_draw_gouraud_sprite_native"
  type rle_sprite
  external get_rle_sprite : tmp:Allegro.bitmap -> Allegro.rle_sprite
    = "ml_get_rle_sprite"
  external destroy_rle_sprite : Allegro.rle_sprite -> unit
    = "ml_destroy_rle_sprite"
  external draw_rle_sprite :
    bmp:Allegro.bitmap -> sprite:Allegro.rle_sprite -> x:int -> y:int -> unit
    = "ml_draw_rle_sprite"
  external draw_trans_rle_sprite :
    bmp:Allegro.bitmap -> sprite:Allegro.rle_sprite -> x:int -> y:int -> unit
    = "ml_draw_trans_rle_sprite"
  external draw_lit_rle_sprite :
    bmp:Allegro.bitmap ->
    sprite:Allegro.rle_sprite ->
    x:int -> y:int -> color:Allegro.color -> unit = "ml_draw_lit_rle_sprite"
  type compiled_sprite
  external get_compiled_sprite :
    bmp:Allegro.bitmap -> planar:bool -> Allegro.compiled_sprite
    = "ml_get_compiled_sprite"
  external destroy_compiled_sprite : sprite:Allegro.compiled_sprite -> unit
    = "ml_destroy_compiled_sprite"
  external draw_compiled_sprite :
    bmp:Allegro.bitmap ->
    sprite:Allegro.compiled_sprite -> x:int -> y:int -> unit
    = "ml_draw_compiled_sprite"
  type font
  external get_font : unit -> Allegro.font = "get_font"
  external allegro_404_char : char -> unit = "ml_allegro_404_char"
  external text_length : f:Allegro.font -> string -> int = "ml_text_length"
  external text_height : f:Allegro.font -> int = "ml_text_height"
  external textout_ex :
    bmp:Allegro.bitmap ->
    f:Allegro.font ->
    str:string ->
    x:int -> y:int -> color:Allegro.color -> bg:Allegro.color -> unit
    = "ml_textout_ex_bytecode" "ml_textout_ex_native"
  external textout_centre_ex :
    bmp:Allegro.bitmap ->
    f:Allegro.font ->
    str:string ->
    x:int -> y:int -> color:Allegro.color -> bg:Allegro.color -> unit
    = "ml_textout_centre_ex_bytecode" "ml_textout_centre_ex_native"
  external textout_justify_ex :
    bmp:Allegro.bitmap ->
    f:Allegro.font ->
    str:string ->
    x1:int ->
    x2:int ->
    y:int -> diff:int -> color:Allegro.color -> bg:Allegro.color -> unit
    = "ml_textout_justify_ex_bytecode" "ml_textout_justify_ex_native"
  external textout_right_ex :
    bmp:Allegro.bitmap ->
    f:Allegro.font ->
    str:string ->
    x:int -> y:int -> color:Allegro.color -> bg:Allegro.color -> unit
    = "ml_textout_right_ex_bytecode" "ml_textout_right_ex_native"
  val textprintf_ex :
    Allegro.bitmap ->
    Allegro.font ->
    int ->
    int ->
    Allegro.color -> Allegro.color -> ('a, unit, string, unit) format4 -> 'a
  val textprintf_centre_ex :
    Allegro.bitmap ->
    Allegro.font ->
    int ->
    int ->
    Allegro.color -> Allegro.color -> ('a, unit, string, unit) format4 -> 'a
  val textprintf_justify_ex :
    Allegro.bitmap ->
    Allegro.font ->
    int ->
    int ->
    int ->
    int ->
    Allegro.color -> Allegro.color -> ('a, unit, string, unit) format4 -> 'a
  val textprintf_right_ex :
    Allegro.bitmap ->
    Allegro.font ->
    int ->
    int ->
    Allegro.color -> Allegro.color -> ('a, unit, string, unit) format4 -> 'a
  external load_font : filename:string -> Allegro.font * Allegro.palette
    = "ml_load_font"
  external merge_fonts : f1:Allegro.font -> f2:Allegro.font -> Allegro.font
    = "ml_merge_fonts"
  external destroy_font : f:Allegro.font -> unit = "ml_destroy_font"
  type draw_mode =
      DRAW_MODE_SOLID
    | DRAW_MODE_XOR
    | DRAW_MODE_COPY_PATTERN of Allegro.bitmap * int * int
    | DRAW_MODE_SOLID_PATTERN of Allegro.bitmap * int * int
    | DRAW_MODE_MASKED_PATTERN of Allegro.bitmap * int * int
    | DRAW_MODE_TRANS
  val drawing_mode : draw_mode:Allegro.draw_mode -> unit
  external xor_mode : on:bool -> unit = "ml_xor_mode"
  external solid_mode : unit -> unit = "ml_solid_mode"
  external set_trans_blender : r:int -> g:int -> b:int -> a:int -> unit
    = "ml_set_trans_blender"
  external set_alpha_blender : unit -> unit = "ml_set_alpha_blender"
  external set_write_alpha_blender : unit -> unit
    = "ml_set_write_alpha_blender"
  external set_add_blender : r:int -> g:int -> b:int -> a:int -> unit
    = "ml_set_add_blender"
  external set_burn_blender : r:int -> g:int -> b:int -> a:int -> unit
    = "ml_set_burn_blender"
  external set_color_blender : r:int -> g:int -> b:int -> a:int -> unit
    = "ml_set_color_blender"
  external set_difference_blender : r:int -> g:int -> b:int -> a:int -> unit
    = "ml_set_difference_blender"
  external set_dissolve_blender : r:int -> g:int -> b:int -> a:int -> unit
    = "ml_set_dissolve_blender"
  external set_dodge_blender : r:int -> g:int -> b:int -> a:int -> unit
    = "ml_set_dodge_blender"
  external set_hue_blender : r:int -> g:int -> b:int -> a:int -> unit
    = "ml_set_hue_blender"
  external set_invert_blender : r:int -> g:int -> b:int -> a:int -> unit
    = "ml_set_invert_blender"
  external set_luminance_blender : r:int -> g:int -> b:int -> a:int -> unit
    = "ml_set_luminance_blender"
  external set_multiply_blender : r:int -> g:int -> b:int -> a:int -> unit
    = "ml_set_multiply_blender"
  external set_saturation_blender : r:int -> g:int -> b:int -> a:int -> unit
    = "ml_set_saturation_blender"
  external set_screen_blender : r:int -> g:int -> b:int -> a:int -> unit
    = "ml_set_screen_blender"
  external digi_driver_name : unit -> string = "ml_digi_driver_name"
  type digi = DIGI_AUTODETECT | DIGI_NONE
  type midi = MIDI_AUTODETECT | MIDI_NONE
  external install_sound : Allegro.digi -> Allegro.midi -> unit
    = "ml_install_sound"
  external remove_sound : unit -> unit = "ml_remove_sound"
  external reserve_voices : digi_voices:int -> midi_voices:int -> unit
    = "ml_reserve_voices"
  external set_volume_per_voice : scale:int -> unit
    = "ml_set_volume_per_voice"
  external set_volume : digi_volume:int -> midi_volume:int -> unit
    = "ml_set_volume"
  external set_hardware_volume : digi_volume:int -> midi_volume:int -> unit
    = "ml_set_hardware_volume"
  type sample
  external load_sample : filename:string -> Allegro.sample = "ml_load_sample"
  external destroy_sample : spl:Allegro.sample -> unit = "ml_destroy_sample"
  external adjust_sample :
    spl:Allegro.sample -> vol:int -> pan:int -> freq:int -> loop:bool -> unit
    = "ml_adjust_sample"
  external play_sample :
    spl:Allegro.sample -> vol:int -> pan:int -> freq:int -> loop:bool -> int
    = "ml_play_sample"
  external stop_sample : spl:Allegro.sample -> unit = "ml_stop_sample"
  external replace_filename : path:string -> filename:string -> string
    = "ml_replace_filename"
  type datafile
  external load_datafile : filename:string -> Allegro.datafile
    = "ml_load_datafile"
  external unload_datafile : dat:Allegro.datafile -> unit
    = "ml_unload_datafile"
  external fixup_datafile : dat:Allegro.datafile -> unit
    = "ml_fixup_datafile"
  external palette_dat : dat:Allegro.datafile -> idx:int -> Allegro.palette
    = "datafile_index"
  external bitmap_dat : dat:Allegro.datafile -> idx:int -> Allegro.bitmap
    = "datafile_index"
  external font_dat : dat:Allegro.datafile -> idx:int -> Allegro.font
    = "datafile_index"
  external sample_dat : dat:Allegro.datafile -> idx:int -> Allegro.sample
    = "datafile_index"
  external item_dat : dat:Allegro.datafile -> idx:int -> 'a
    = "datafile_index"
  external gfx_mode_select_ex : unit -> Allegro.gfx_driver * int * int * int
    = "ml_gfx_mode_select_ex"
  type polytype =
      POLYTYPE_ATEX
    | POLYTYPE_ATEX_LIT
    | POLYTYPE_ATEX_MASK
    | POLYTYPE_ATEX_MASK_LIT
    | POLYTYPE_ATEX_MASK_TRANS
    | POLYTYPE_ATEX_TRANS
    | POLYTYPE_FLAT
    | POLYTYPE_GCOL
    | POLYTYPE_GRGB
    | POLYTYPE_PTEX
    | POLYTYPE_PTEX_LIT
    | POLYTYPE_PTEX_MASK
    | POLYTYPE_PTEX_MASK_LIT
    | POLYTYPE_PTEX_MASK_TRANS
    | POLYTYPE_PTEX_TRANS
  type 'a _v3d = {
    x : 'a;
    y : 'a;
    z : 'a;
    u : 'a;
    v : 'a;
    c : Allegro.color;
  }
  type v3d = Allegro.fixed Allegro._v3d
  type v3d_f = float Allegro._v3d
  external triangle3d :
    bmp:Allegro.bitmap ->
    polytype:Allegro.polytype ->
    tex:Allegro.bitmap ->
    v1:Allegro.v3d -> v2:Allegro.v3d -> v3:Allegro.v3d -> unit
    = "ml_triangle3d_bytecode" "ml_triangle3d_native"
  external triangle3d_f :
    bmp:Allegro.bitmap ->
    polytype:Allegro.polytype ->
    tex:Allegro.bitmap ->
    v1:Allegro.v3d_f -> v2:Allegro.v3d_f -> v3:Allegro.v3d_f -> unit
    = "ml_triangle3d_f_bytecode" "ml_triangle3d_f_native"
  external quad3d :
    bmp:Allegro.bitmap ->
    polytype:Allegro.polytype ->
    tex:Allegro.bitmap ->
    v1:Allegro.v3d ->
    v2:Allegro.v3d -> v3:Allegro.v3d -> v4:Allegro.v3d -> unit
    = "ml_quad3d_bytecode" "ml_quad3d_native"
  external quad3d_f :
    bmp:Allegro.bitmap ->
    polytype:Allegro.polytype ->
    tex:Allegro.bitmap ->
    v1:Allegro.v3d_f ->
    v2:Allegro.v3d_f -> v3:Allegro.v3d_f -> v4:Allegro.v3d_f -> unit
    = "ml_quad3d_f_bytecode" "ml_quad3d_f_native"
  external clear_scene : bmp:Allegro.bitmap -> unit = "ml_clear_scene"
  external render_scene : unit -> unit = "ml_render_scene"
  external create_scene : nedge:int -> npoly:int -> int = "ml_create_scene"
  external destroy_scene : unit -> unit = "ml_destroy_scene"
  type zbuffer
  external create_zbuffer : bmp:Allegro.bitmap -> Allegro.zbuffer
    = "ml_create_zbuffer"
  external create_sub_zbuffer :
    parent:Allegro.zbuffer ->
    x:int -> y:int -> width:int -> height:int -> Allegro.zbuffer
    = "ml_create_sub_zbuffer"
  external set_zbuffer : zbuffer:Allegro.zbuffer -> unit = "ml_set_zbuffer"
  external clear_zbuffer : zbuffer:Allegro.zbuffer -> z:float -> unit
    = "ml_clear_zbuffer"
  external destroy_zbuffer : zbuffer:Allegro.zbuffer -> unit
    = "ml_destroy_zbuffer"
  type matrix
  type matrix_f
  external get_identity_matrix : unit -> Allegro.matrix
    = "ml_get_identity_matrix"
  external get_identity_matrix_f : unit -> Allegro.matrix_f
    = "ml_get_identity_matrix_f"
  external free_matrix : Allegro.matrix -> unit = "ml_free_matrix"
  external make_matrix :
    v:(float * float * float) * (float * float * float) *
      (float * float * float) ->
    t:float * float * float -> Allegro.matrix = "ml_make_matrix"
  external make_matrix_f :
    v:(float * float * float) * (float * float * float) *
      (float * float * float) ->
    t:float * float * float -> Allegro.matrix_f = "ml_make_matrix_f"
  external new_matrix : unit -> Allegro.matrix = "ml_new_matrix"
  external new_matrix_f : unit -> Allegro.matrix_f = "ml_new_matrix_f"
  external get_translation_matrix :
    m:Allegro.matrix ->
    x:Allegro.fixed -> y:Allegro.fixed -> z:Allegro.fixed -> unit
    = "ml_get_translation_matrix"
  external get_translation_matrix_f :
    m:Allegro.matrix -> x:float -> y:float -> z:float -> unit
    = "ml_get_translation_matrix_f"
  external get_scaling_matrix :
    m:Allegro.matrix ->
    x:Allegro.fixed -> y:Allegro.fixed -> z:Allegro.fixed -> unit
    = "ml_get_scaling_matrix"
  external get_scaling_matrix_f :
    m:Allegro.matrix -> x:float -> y:float -> z:float -> unit
    = "ml_get_scaling_matrix_f"
  external get_x_rotate_matrix : m:Allegro.matrix -> r:Allegro.fixed -> unit
    = "ml_get_x_rotate_matrix"
  external get_x_rotate_matrix_f : m:Allegro.matrix -> r:float -> unit
    = "ml_get_x_rotate_matrix_f"
  external get_y_rotate_matrix : m:Allegro.matrix -> r:Allegro.fixed -> unit
    = "ml_get_y_rotate_matrix"
  external get_y_rotate_matrix_f : m:Allegro.matrix -> r:float -> unit
    = "ml_get_y_rotate_matrix_f"
  external get_z_rotate_matrix : m:Allegro.matrix -> r:Allegro.fixed -> unit
    = "ml_get_z_rotate_matrix"
  external get_z_rotate_matrix_f : m:Allegro.matrix -> r:float -> unit
    = "ml_get_z_rotate_matrix_f"
  external get_rotation_matrix :
    m:Allegro.matrix ->
    x:Allegro.fixed -> y:Allegro.fixed -> z:Allegro.fixed -> unit
    = "ml_get_rotation_matrix"
  external get_rotation_matrix_f :
    m:Allegro.matrix -> x:float -> y:float -> z:float -> unit
    = "ml_get_rotation_matrix_f"
  external get_align_matrix :
    m:Allegro.matrix ->
    xfront:Allegro.fixed ->
    yfront:Allegro.fixed ->
    zfront:Allegro.fixed ->
    xup:Allegro.fixed -> yup:Allegro.fixed -> zup:Allegro.fixed -> unit
    = "ml_get_align_matrix_bytecode" "ml_get_align_matrix_native"
  external get_align_matrix_f :
    m:Allegro.matrix_f ->
    xfront:float ->
    yfront:float ->
    zfront:float -> xup:float -> yup:float -> zup:float -> unit
    = "ml_get_align_matrix_f_bytecode" "ml_get_align_matrix_f_native"
  external get_vector_rotation_matrix :
    m:Allegro.matrix ->
    x:Allegro.fixed ->
    y:Allegro.fixed -> z:Allegro.fixed -> a:Allegro.fixed -> unit
    = "ml_get_vector_rotation_matrix"
  external get_vector_rotation_matrix_f :
    m:Allegro.matrix_f -> x:float -> y:float -> z:float -> a:float -> unit
    = "ml_get_vector_rotation_matrix_f"
  external get_transformation_matrix :
    m:Allegro.matrix ->
    scale:Allegro.fixed ->
    xrot:Allegro.fixed ->
    yrot:Allegro.fixed ->
    zrot:Allegro.fixed ->
    x:Allegro.fixed -> y:Allegro.fixed -> z:Allegro.fixed -> unit
    = "ml_get_transformation_matrix_bytecode"
    "ml_get_transformation_matrix_native"
  external get_transformation_matrix_f :
    m:Allegro.matrix_f ->
    scale:float ->
    xrot:float ->
    yrot:float -> zrot:float -> x:float -> y:float -> z:float -> unit
    = "ml_get_transformation_matrix_f_bytecode"
    "ml_get_transformation_matrix_f_native"
  external get_camera_matrix :
    m:Allegro.matrix ->
    x:Allegro.fixed ->
    y:Allegro.fixed ->
    z:Allegro.fixed ->
    xfront:Allegro.fixed ->
    yfront:Allegro.fixed ->
    zfront:Allegro.fixed ->
    xup:Allegro.fixed ->
    yup:Allegro.fixed ->
    zup:Allegro.fixed -> fov:Allegro.fixed -> aspect:Allegro.fixed -> unit
    = "ml_get_camera_matrix_bytecode" "ml_get_camera_matrix_native"
  external get_camera_matrix_f :
    m:Allegro.matrix_f ->
    x:float ->
    y:float ->
    z:float ->
    xfront:float ->
    yfront:float ->
    zfront:float ->
    xup:float -> yup:float -> zup:float -> fov:float -> aspect:float -> unit
    = "ml_get_camera_matrix_f_bytecode" "ml_get_camera_matrix_f_native"
  external qtranslate_matrix :
    m:Allegro.matrix ->
    x:Allegro.fixed -> y:Allegro.fixed -> z:Allegro.fixed -> unit
    = "ml_qtranslate_matrix"
  external qtranslate_matrix_f :
    m:Allegro.matrix_f -> x:float -> y:float -> z:float -> unit
    = "ml_qtranslate_matrix_f"
  external qscale_matrix : m:Allegro.matrix -> scale:Allegro.fixed -> unit
    = "ml_qscale_matrix"
  external qscale_matrix_f : m:Allegro.matrix_f -> scale:float -> unit
    = "ml_qscale_matrix_f"
  external matrix_mul :
    m1:Allegro.matrix -> m2:Allegro.matrix -> out:Allegro.matrix -> unit
    = "ml_matrix_mul"
  external matrix_mul_f :
    m1:Allegro.matrix_f ->
    m2:Allegro.matrix_f -> out:Allegro.matrix_f -> unit = "ml_matrix_mul_f"
  external vector_length :
    x:Allegro.fixed -> y:Allegro.fixed -> z:Allegro.fixed -> Allegro.fixed
    = "ml_vector_length"
  external vector_length_f : x:float -> y:float -> z:float -> float
    = "ml_vector_length_f"
  external apply_matrix :
    m:Allegro.matrix ->
    x:Allegro.fixed ->
    y:Allegro.fixed ->
    z:Allegro.fixed -> Allegro.fixed * Allegro.fixed * Allegro.fixed
    = "ml_apply_matrix"
  external apply_matrix_f :
    m:Allegro.matrix_f ->
    x:float -> y:float -> z:float -> float * float * float
    = "ml_apply_matrix_f"
  external set_projection_viewport : x:int -> y:int -> w:int -> h:int -> unit
    = "ml_set_projection_viewport"
  external persp_project :
    x:Allegro.fixed ->
    y:Allegro.fixed -> z:Allegro.fixed -> Allegro.fixed * Allegro.fixed
    = "ml_persp_project"
  external persp_project_f : x:float -> y:float -> z:float -> float * float
    = "ml_persp_project_f"
  type quat
  external make_quat :
    w:float -> x:float -> y:float -> z:float -> Allegro.quat = "ml_make_quat"
  external free_quat : q:Allegro.quat -> unit = "ml_free_quat"
  external get_identity_quat : unit -> Allegro.quat = "ml_get_identity_quat"
  external get_x_rotate_quat : q:Allegro.quat -> r:float -> unit
    = "ml_get_x_rotate_quat"
  external get_y_rotate_quat : q:Allegro.quat -> r:float -> unit
    = "ml_get_y_rotate_quat"
  external get_z_rotate_quat : q:Allegro.quat -> r:float -> unit
    = "ml_get_z_rotate_quat"
  external get_rotation_quat :
    q:Allegro.quat -> x:float -> y:float -> z:float -> unit
    = "ml_get_rotation_quat"
  external get_vector_rotation_quat :
    q:Allegro.quat -> x:float -> y:float -> z:float -> a:float -> unit
    = "ml_get_vector_rotation_quat"
  external quat_to_matrix : q:Allegro.quat -> Allegro.matrix_f
    = "ml_quat_to_matrix"
  external matrix_to_quat : m:Allegro.matrix_f -> Allegro.quat
    = "ml_matrix_to_quat"
  external quat_mul : p:Allegro.quat -> q:Allegro.quat -> Allegro.quat
    = "ml_quat_mul"
  external apply_quat :
    q:Allegro.quat -> x:float -> y:float -> z:float -> float * float * float
    = "ml_apply_quat"
  external quat_interpolate :
    from:Allegro.quat -> to_:Allegro.quat -> t:float -> Allegro.quat
    = "ml_quat_interpolate"
  type how_slerp = QUAT_SHORT | QUAT_LONG | QUAT_CW | QUAT_CCW | QUAT_USER
  external quat_slerp :
    from:Allegro.quat ->
    to_:Allegro.quat -> t:float -> how:Allegro.how_slerp -> Allegro.quat
    = "ml_quat_slerp"
end