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