sig
  module type ENCODE =
    sig
      type t
      val bytes_per_pixel : int
      val get : string -> int -> Genimage.ENCODE.t
      val set : string -> int -> Genimage.ENCODE.t -> unit
      val make : Genimage.ENCODE.t -> string
    end
  module type RAWIMAGE =
    sig
      module Encode : ENCODE
      type elt
      and bitmap
      and t = {
        width : int;
        height : int;
        bitmap : Genimage.RAWIMAGE.bitmap;
      }
      val width : Genimage.RAWIMAGE.t -> int
      val height : Genimage.RAWIMAGE.t -> int
      val dump : Genimage.RAWIMAGE.t -> string
      val create_with : int -> int -> string -> Genimage.RAWIMAGE.t
      val create : int -> int -> Genimage.RAWIMAGE.t
      val make : int -> int -> Genimage.RAWIMAGE.elt -> Genimage.RAWIMAGE.t
      val unsafe_access : Genimage.RAWIMAGE.t -> int -> int -> string * int
      val get_strip : Genimage.RAWIMAGE.t -> int -> int -> int -> string
      val set_strip :
        Genimage.RAWIMAGE.t -> int -> int -> int -> string -> unit
      val get_scanline : Genimage.RAWIMAGE.t -> int -> string
      val set_scanline : Genimage.RAWIMAGE.t -> int -> string -> unit
      val unsafe_get :
        Genimage.RAWIMAGE.t -> int -> int -> Genimage.RAWIMAGE.elt
      val unsafe_set :
        Genimage.RAWIMAGE.t -> int -> int -> Genimage.RAWIMAGE.elt -> unit
      val get : Genimage.RAWIMAGE.t -> int -> int -> Genimage.RAWIMAGE.elt
      val set :
        Genimage.RAWIMAGE.t -> int -> int -> Genimage.RAWIMAGE.elt -> unit
      val destroy : Genimage.RAWIMAGE.t -> unit
      val copy : Genimage.RAWIMAGE.t -> Genimage.RAWIMAGE.t
      val sub :
        Genimage.RAWIMAGE.t ->
        int -> int -> int -> int -> Genimage.RAWIMAGE.t
      val blit :
        Genimage.RAWIMAGE.t ->
        int -> int -> Genimage.RAWIMAGE.t -> int -> int -> int -> int -> unit
      val map :
        (Genimage.RAWIMAGE.elt ->
         Genimage.RAWIMAGE.elt -> Genimage.RAWIMAGE.elt) ->
        Genimage.RAWIMAGE.t ->
        int -> int -> Genimage.RAWIMAGE.t -> int -> int -> int -> int -> unit
    end
  module MakeRawImage :
    functor (E : ENCODE->
      sig
        module Encode : ENCODE
        type elt = E.t
        and bitmap
        and t = { width : int; height : int; bitmap : bitmap; }
        val width : t -> int
        val height : t -> int
        val dump : t -> string
        val create_with : int -> int -> string -> t
        val create : int -> int -> t
        val make : int -> int -> elt -> t
        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 set_scanline : t -> int -> string -> unit
        val unsafe_get : t -> int -> int -> elt
        val unsafe_set : t -> int -> int -> elt -> unit
        val get : t -> int -> int -> elt
        val set : t -> int -> int -> elt -> unit
        val destroy : t -> 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
      end
  module type CONTAINER =
    sig
      type container
      type rawimage
      val rawimage :
        Genimage.CONTAINER.container -> Genimage.CONTAINER.rawimage
      val create_default :
        int ->
        int -> Genimage.CONTAINER.rawimage -> Genimage.CONTAINER.container
      val create_duplicate :
        Genimage.CONTAINER.container ->
        int ->
        int -> Genimage.CONTAINER.rawimage -> Genimage.CONTAINER.container
    end
  module type IMAGE =
    sig
      type t
      type elt
      val create : int -> int -> Genimage.IMAGE.t
      val make : int -> int -> Genimage.IMAGE.elt -> Genimage.IMAGE.t
      val destroy : Genimage.IMAGE.t -> unit
      val get : Genimage.IMAGE.t -> int -> int -> Genimage.IMAGE.elt
      val set : Genimage.IMAGE.t -> int -> int -> Genimage.IMAGE.elt -> unit
      val unsafe_get : Genimage.IMAGE.t -> int -> int -> Genimage.IMAGE.elt
      val unsafe_set :
        Genimage.IMAGE.t -> int -> int -> Genimage.IMAGE.elt -> unit
      val copy : Genimage.IMAGE.t -> Genimage.IMAGE.t
      val sub :
        Genimage.IMAGE.t -> int -> int -> int -> int -> Genimage.IMAGE.t
      val blit :
        Genimage.IMAGE.t ->
        int -> int -> Genimage.IMAGE.t -> int -> int -> int -> int -> unit
      val map :
        (Genimage.IMAGE.elt -> Genimage.IMAGE.elt -> Genimage.IMAGE.elt) ->
        Genimage.IMAGE.t ->
        int -> int -> Genimage.IMAGE.t -> int -> int -> int -> int -> unit
      val dump : Genimage.IMAGE.t -> string
      val unsafe_access : Genimage.IMAGE.t -> int -> int -> string * int
      val get_strip : Genimage.IMAGE.t -> int -> int -> int -> string
      val set_strip : Genimage.IMAGE.t -> int -> int -> int -> string -> unit
      val get_scanline : Genimage.IMAGE.t -> int -> string
      val set_scanline : Genimage.IMAGE.t -> int -> string -> unit
    end
  module Make :
    functor (RI : RAWIMAGE->
      functor
        (CON : sig
                 type container
                 type rawimage = RI.t
                 val rawimage : container -> rawimage
                 val create_default : int -> int -> rawimage -> container
                 val create_duplicate :
                   container -> int -> int -> rawimage -> container
               end->
        sig
          type t = CON.container
          type elt = RI.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 set_scanline : t -> int -> string -> unit
        end
  module type CONTAINER_INDEXED =
    sig
      type container
      type rawimage
      type mapelt
      val rawimage :
        Genimage.CONTAINER_INDEXED.container ->
        Genimage.CONTAINER_INDEXED.rawimage
      val create_default :
        int ->
        int ->
        Genimage.CONTAINER_INDEXED.rawimage ->
        Genimage.CONTAINER_INDEXED.container
      val create_duplicate :
        Genimage.CONTAINER_INDEXED.container ->
        int ->
        int ->
        Genimage.CONTAINER_INDEXED.rawimage ->
        Genimage.CONTAINER_INDEXED.container
      val colormap :
        Genimage.CONTAINER_INDEXED.container ->
        Genimage.CONTAINER_INDEXED.mapelt Color.map
    end
  module type IMAGEINDEXED =
    sig
      type t
      type elt
      type mapelt
      val create : int -> int -> Genimage.IMAGEINDEXED.t
      val make :
        int -> int -> Genimage.IMAGEINDEXED.elt -> Genimage.IMAGEINDEXED.t
      val destroy : Genimage.IMAGEINDEXED.t -> unit
      val get :
        Genimage.IMAGEINDEXED.t -> int -> int -> Genimage.IMAGEINDEXED.elt
      val get_color :
        Genimage.IMAGEINDEXED.t -> int -> int -> Genimage.IMAGEINDEXED.mapelt
      val set :
        Genimage.IMAGEINDEXED.t ->
        int -> int -> Genimage.IMAGEINDEXED.elt -> unit
      val unsafe_get :
        Genimage.IMAGEINDEXED.t -> int -> int -> Genimage.IMAGEINDEXED.elt
      val unsafe_get_color :
        Genimage.IMAGEINDEXED.t -> int -> int -> Genimage.IMAGEINDEXED.mapelt
      val unsafe_set :
        Genimage.IMAGEINDEXED.t ->
        int -> int -> Genimage.IMAGEINDEXED.elt -> unit
      val copy : Genimage.IMAGEINDEXED.t -> Genimage.IMAGEINDEXED.t
      val sub :
        Genimage.IMAGEINDEXED.t ->
        int -> int -> int -> int -> Genimage.IMAGEINDEXED.t
      val blit :
        Genimage.IMAGEINDEXED.t ->
        int ->
        int -> Genimage.IMAGEINDEXED.t -> int -> int -> int -> int -> unit
      val map :
        (Genimage.IMAGEINDEXED.elt ->
         Genimage.IMAGEINDEXED.elt -> Genimage.IMAGEINDEXED.elt) ->
        Genimage.IMAGEINDEXED.t ->
        int ->
        int -> Genimage.IMAGEINDEXED.t -> int -> int -> int -> int -> unit
      val dump : Genimage.IMAGEINDEXED.t -> string
      val unsafe_access :
        Genimage.IMAGEINDEXED.t -> int -> int -> string * int
      val get_strip : Genimage.IMAGEINDEXED.t -> int -> int -> int -> string
      val set_strip :
        Genimage.IMAGEINDEXED.t -> int -> int -> int -> string -> unit
      val get_scanline : Genimage.IMAGEINDEXED.t -> int -> string
      val set_scanline : Genimage.IMAGEINDEXED.t -> int -> string -> unit
    end
  module MakeIndexed :
    functor
      (RI : sig
              module Encode : ENCODE
              type elt = int
              and bitmap
              and t = { width : int; height : int; bitmap : bitmap; }
              val width : t -> int
              val height : t -> int
              val dump : t -> string
              val create_with : int -> int -> string -> t
              val create : int -> int -> t
              val make : int -> int -> elt -> t
              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 set_scanline : t -> int -> string -> unit
              val unsafe_get : t -> int -> int -> elt
              val unsafe_set : t -> int -> int -> elt -> unit
              val get : t -> int -> int -> elt
              val set : t -> int -> int -> elt -> unit
              val destroy : t -> 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
            end->
      functor
        (CON : sig
                 type container
                 type rawimage = RI.t
                 type mapelt
                 val rawimage : container -> rawimage
                 val create_default : int -> int -> rawimage -> container
                 val create_duplicate :
                   container -> int -> int -> rawimage -> container
                 val colormap : container -> mapelt Color.map
               end->
        sig
          type t = CON.container
          type elt = int
          type mapelt = CON.mapelt
          val create : int -> int -> t
          val make : int -> int -> elt -> t
          val destroy : t -> unit
          val get : t -> int -> int -> elt
          val get_color : t -> int -> int -> mapelt
          val set : t -> int -> int -> elt -> unit
          val unsafe_get : t -> int -> int -> elt
          val unsafe_get_color : t -> int -> int -> mapelt
          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 set_scanline : t -> int -> string -> unit
        end
end