sig
  module type ENCODE =
    sig
      type t
      val bytes_per_pixel : int
      val get : string -> int -> Image_intf.ENCODE.t
      val set : string -> int -> Image_intf.ENCODE.t -> unit
      val make : Image_intf.ENCODE.t -> string
    end
  module type RAWIMAGE =
    sig
      module Encode : ENCODE
      type elt
      and bitmap
      and t = {
        width : int;
        height : int;
        bitmap : Image_intf.RAWIMAGE.bitmap;
      }
      val width : Image_intf.RAWIMAGE.t -> int
      val height : Image_intf.RAWIMAGE.t -> int
      val dump : Image_intf.RAWIMAGE.t -> string
      val create_with : int -> int -> string -> Image_intf.RAWIMAGE.t
      val create_with_scanlines :
        int -> int -> string array -> Image_intf.RAWIMAGE.t
      val create : int -> int -> Image_intf.RAWIMAGE.t
      val make :
        int -> int -> Image_intf.RAWIMAGE.elt -> Image_intf.RAWIMAGE.t
      val unsafe_access : Image_intf.RAWIMAGE.t -> int -> int -> string * int
      val get_strip : Image_intf.RAWIMAGE.t -> int -> int -> int -> string
      val set_strip :
        Image_intf.RAWIMAGE.t -> int -> int -> int -> string -> unit
      val get_scanline : Image_intf.RAWIMAGE.t -> int -> string
      val get_scanline_ptr :
        Image_intf.RAWIMAGE.t -> (int -> (string * int) * int) option
      val set_scanline : Image_intf.RAWIMAGE.t -> int -> string -> unit
      val unsafe_get :
        Image_intf.RAWIMAGE.t -> int -> int -> Image_intf.RAWIMAGE.elt
      val unsafe_set :
        Image_intf.RAWIMAGE.t ->
        int -> int -> Image_intf.RAWIMAGE.elt -> unit
      val get :
        Image_intf.RAWIMAGE.t -> int -> int -> Image_intf.RAWIMAGE.elt
      val set :
        Image_intf.RAWIMAGE.t ->
        int -> int -> Image_intf.RAWIMAGE.elt -> unit
      val destroy : Image_intf.RAWIMAGE.t -> unit
      val copy : Image_intf.RAWIMAGE.t -> Image_intf.RAWIMAGE.t
      val sub :
        Image_intf.RAWIMAGE.t ->
        int -> int -> int -> int -> Image_intf.RAWIMAGE.t
      val blit :
        Image_intf.RAWIMAGE.t ->
        int ->
        int -> Image_intf.RAWIMAGE.t -> int -> int -> int -> int -> unit
      val map :
        (Image_intf.RAWIMAGE.elt ->
         Image_intf.RAWIMAGE.elt -> Image_intf.RAWIMAGE.elt) ->
        Image_intf.RAWIMAGE.t ->
        int ->
        int -> Image_intf.RAWIMAGE.t -> int -> int -> int -> int -> unit
      val blocks : Image_intf.RAWIMAGE.t -> int * int
      val dump_block : Image_intf.RAWIMAGE.t -> int -> int -> Bitmap.Block.t
    end
  module type CONTAINER =
    sig
      type container
      type rawimage
      val rawimage :
        Image_intf.CONTAINER.container -> Image_intf.CONTAINER.rawimage
      val create_default :
        int ->
        int ->
        Image_intf.CONTAINER.rawimage -> Image_intf.CONTAINER.container
      val create_duplicate :
        Image_intf.CONTAINER.container ->
        int ->
        int ->
        Image_intf.CONTAINER.rawimage -> Image_intf.CONTAINER.container
    end
  module type IMAGE =
    sig
      type t
      type elt
      val create : int -> int -> Image_intf.IMAGE.t
      val make : int -> int -> Image_intf.IMAGE.elt -> Image_intf.IMAGE.t
      val destroy : Image_intf.IMAGE.t -> unit
      val get : Image_intf.IMAGE.t -> int -> int -> Image_intf.IMAGE.elt
      val set :
        Image_intf.IMAGE.t -> int -> int -> Image_intf.IMAGE.elt -> unit
      val unsafe_get :
        Image_intf.IMAGE.t -> int -> int -> Image_intf.IMAGE.elt
      val unsafe_set :
        Image_intf.IMAGE.t -> int -> int -> Image_intf.IMAGE.elt -> unit
      val copy : Image_intf.IMAGE.t -> Image_intf.IMAGE.t
      val sub :
        Image_intf.IMAGE.t -> int -> int -> int -> int -> Image_intf.IMAGE.t
      val blit :
        Image_intf.IMAGE.t ->
        int -> int -> Image_intf.IMAGE.t -> int -> int -> int -> int -> unit
      val map :
        (Image_intf.IMAGE.elt -> Image_intf.IMAGE.elt -> Image_intf.IMAGE.elt) ->
        Image_intf.IMAGE.t ->
        int -> int -> Image_intf.IMAGE.t -> int -> int -> int -> int -> unit
      val dump : Image_intf.IMAGE.t -> string
      val unsafe_access : Image_intf.IMAGE.t -> int -> int -> string * int
      val get_strip : Image_intf.IMAGE.t -> int -> int -> int -> string
      val set_strip :
        Image_intf.IMAGE.t -> int -> int -> int -> string -> unit
      val get_scanline : Image_intf.IMAGE.t -> int -> string
      val get_scanline_ptr :
        Image_intf.IMAGE.t -> (int -> (string * int) * int) option
      val set_scanline : Image_intf.IMAGE.t -> int -> string -> unit
      val blocks : Image_intf.IMAGE.t -> int * int
      val dump_block : Image_intf.IMAGE.t -> int -> int -> Bitmap.Block.t
    end
  module type CONTAINER_INDEXED =
    sig
      type container
      type rawimage
      type mapelt
      val rawimage :
        Image_intf.CONTAINER_INDEXED.container ->
        Image_intf.CONTAINER_INDEXED.rawimage
      val create_default :
        int ->
        int ->
        Image_intf.CONTAINER_INDEXED.rawimage ->
        Image_intf.CONTAINER_INDEXED.container
      val create_duplicate :
        Image_intf.CONTAINER_INDEXED.container ->
        int ->
        int ->
        Image_intf.CONTAINER_INDEXED.rawimage ->
        Image_intf.CONTAINER_INDEXED.container
      val colormap :
        Image_intf.CONTAINER_INDEXED.container ->
        Image_intf.CONTAINER_INDEXED.mapelt Color.map
    end
  module type IMAGEINDEXED =
    sig
      type t
      type elt
      val create : int -> int -> t
      val make : int -> int -> elt -> t
      val destroy : t -> unit
      val get : t -> int -> int -> elt
      val set : t -> int -> int -> elt -> unit
      val unsafe_get : t -> int -> int -> elt
      val unsafe_set : t -> int -> int -> elt -> unit
      val copy : t -> t
      val sub : t -> int -> int -> int -> int -> t
      val blit : t -> int -> int -> t -> int -> int -> int -> int -> unit
      val map :
        (elt -> elt -> elt) ->
        t -> int -> int -> t -> int -> int -> int -> int -> unit
      val dump : t -> string
      val unsafe_access : t -> int -> int -> string * int
      val get_strip : t -> int -> int -> int -> string
      val set_strip : t -> int -> int -> int -> string -> unit
      val get_scanline : t -> int -> string
      val get_scanline_ptr : t -> (int -> (string * int) * int) option
      val set_scanline : t -> int -> string -> unit
      val blocks : t -> int * int
      val dump_block : t -> int -> int -> Bitmap.Block.t
      type mapelt
      val get_color : t -> int -> int -> Image_intf.IMAGEINDEXED.mapelt
      val unsafe_get_color :
        t -> int -> int -> Image_intf.IMAGEINDEXED.mapelt
    end
end