sig
  type line_cap = BUTT | ROUND | SQUARE
  type line_join = JOIN_MITER | JOIN_ROUND | JOIN_BEVEL
  type text_position = CC | LC | RC | CT | CB | LT | LB | RT | RB
  type slant = Upright | Italic
  type weight = Normal | Bold
  module type T =
    sig
      type t
      val set_color : Archimedes.Backend.T.t -> Archimedes.Color.t -> unit
      val set_line_width : Archimedes.Backend.T.t -> float -> unit
      val set_line_cap :
        Archimedes.Backend.T.t -> Archimedes.Backend.line_cap -> unit
      val set_dash : Archimedes.Backend.T.t -> float -> float array -> unit
      val set_line_join :
        Archimedes.Backend.T.t -> Archimedes.Backend.line_join -> unit
      val get_line_width : Archimedes.Backend.T.t -> float
      val get_line_cap :
        Archimedes.Backend.T.t -> Archimedes.Backend.line_cap
      val get_dash : Archimedes.Backend.T.t -> float array * float
      val get_line_join :
        Archimedes.Backend.T.t -> Archimedes.Backend.line_join
      val move_to : Archimedes.Backend.T.t -> x:float -> y:float -> unit
      val line_to : Archimedes.Backend.T.t -> x:float -> y:float -> unit
      val rel_move_to : Archimedes.Backend.T.t -> x:float -> y:float -> unit
      val rel_line_to : Archimedes.Backend.T.t -> x:float -> y:float -> unit
      val curve_to :
        Archimedes.Backend.T.t ->
        x1:float ->
        y1:float -> x2:float -> y2:float -> x3:float -> y3:float -> unit
      val rectangle :
        Archimedes.Backend.T.t ->
        x:float -> y:float -> w:float -> h:float -> unit
      val arc :
        Archimedes.Backend.T.t -> r:float -> a1:float -> a2:float -> unit
      val close_path : Archimedes.Backend.T.t -> unit
      val clear_path : Archimedes.Backend.T.t -> unit
      val path_extents :
        Archimedes.Backend.T.t -> Archimedes.Matrix.rectangle
      val stroke : Archimedes.Backend.T.t -> unit
      val stroke_preserve : Archimedes.Backend.T.t -> unit
      val fill : Archimedes.Backend.T.t -> unit
      val fill_preserve : Archimedes.Backend.T.t -> unit
      val stroke_path_preserve :
        Archimedes.Backend.T.t -> Archimedes.Path.t -> unit
      val fill_path_preserve :
        Archimedes.Backend.T.t -> Archimedes.Path.t -> unit
      val fill_with_color :
        Archimedes.Backend.T.t -> Archimedes.Color.t -> unit
      val show : Archimedes.Backend.T.t -> unit
      val clip_rectangle :
        Archimedes.Backend.T.t ->
        x:float -> y:float -> w:float -> h:float -> unit
      val save : Archimedes.Backend.T.t -> unit
      val restore : Archimedes.Backend.T.t -> unit
      val translate : Archimedes.Backend.T.t -> x:float -> y:float -> unit
      val scale : Archimedes.Backend.T.t -> x:float -> y:float -> unit
      val rotate : Archimedes.Backend.T.t -> angle:float -> unit
      val set_matrix : Archimedes.Backend.T.t -> Archimedes.Matrix.t -> unit
      val get_matrix : Archimedes.Backend.T.t -> Archimedes.Matrix.t
      val flipy : Archimedes.Backend.T.t -> bool
      val select_font_face :
        Archimedes.Backend.T.t ->
        Archimedes.Backend.slant ->
        Archimedes.Backend.weight -> string -> unit
      val set_font_size : Archimedes.Backend.T.t -> float -> unit
      val text_extents :
        Archimedes.Backend.T.t -> string -> Archimedes.Matrix.rectangle
      val show_text :
        Archimedes.Backend.T.t ->
        rotate:float ->
        x:float ->
        y:float -> Archimedes.Backend.text_position -> string -> unit
    end
  type error =
      Corrupted_dependency of string
    | Non_loadable_dependency of string * Dynlink.error
    | Nonexistent of string
    | Not_loadable of string * Dynlink.error
    | Not_registering of string
  exception Error of Archimedes.Backend.error * string
  type t
  val set_color : t -> Color.t -> unit
  val set_line_width : t -> float -> unit
  val set_line_cap : t -> line_cap -> unit
  val set_dash : t -> float -> float array -> unit
  val set_line_join : t -> line_join -> unit
  val get_line_width : t -> float
  val get_line_cap : t -> line_cap
  val get_dash : t -> float array * float
  val get_line_join : t -> line_join
  val move_to : t -> x:float -> y:float -> unit
  val line_to : t -> x:float -> y:float -> unit
  val rel_move_to : t -> x:float -> y:float -> unit
  val rel_line_to : t -> x:float -> y:float -> unit
  val curve_to :
    t ->
    x1:float ->
    y1:float -> x2:float -> y2:float -> x3:float -> y3:float -> unit
  val rectangle : t -> x:float -> y:float -> w:float -> h:float -> unit
  val arc : t -> r:float -> a1:float -> a2:float -> unit
  val close_path : t -> unit
  val clear_path : t -> unit
  val path_extents : t -> Matrix.rectangle
  val stroke : t -> unit
  val stroke_preserve : t -> unit
  val fill : t -> unit
  val fill_preserve : t -> unit
  val stroke_path_preserve : t -> Path.t -> unit
  val fill_path_preserve : t -> Path.t -> unit
  val fill_with_color : t -> Color.t -> unit
  val show : t -> unit
  val clip_rectangle : t -> x:float -> y:float -> w:float -> h:float -> unit
  val save : t -> unit
  val restore : t -> unit
  val translate : t -> x:float -> y:float -> unit
  val scale : t -> x:float -> y:float -> unit
  val rotate : t -> angle:float -> unit
  val set_matrix : t -> Matrix.t -> unit
  val get_matrix : t -> Matrix.t
  val flipy : t -> bool
  val select_font_face : t -> slant -> weight -> string -> unit
  val set_font_size : t -> float -> unit
  val text_extents : t -> string -> Matrix.rectangle
  val show_text :
    t ->
    rotate:float -> x:float -> y:float -> text_position -> string -> unit
  val make : ?dirs:string list -> string list -> float -> float -> t
  val close : t -> unit
  val height : t -> float
  val width : t -> float
  val name : t -> string
  val registered : unit -> string list
  val available : dirs:string list -> string list
  module type Capabilities =
    sig
      type t
      val set_color : t -> Color.t -> unit
      val set_line_width : t -> float -> unit
      val set_line_cap : t -> line_cap -> unit
      val set_dash : t -> float -> float array -> unit
      val set_line_join : t -> line_join -> unit
      val get_line_width : t -> float
      val get_line_cap : t -> line_cap
      val get_dash : t -> float array * float
      val get_line_join : t -> line_join
      val move_to : t -> x:float -> y:float -> unit
      val line_to : t -> x:float -> y:float -> unit
      val rel_move_to : t -> x:float -> y:float -> unit
      val rel_line_to : t -> x:float -> y:float -> unit
      val curve_to :
        t ->
        x1:float ->
        y1:float -> x2:float -> y2:float -> x3:float -> y3:float -> unit
      val rectangle : t -> x:float -> y:float -> w:float -> h:float -> unit
      val arc : t -> r:float -> a1:float -> a2:float -> unit
      val close_path : t -> unit
      val clear_path : t -> unit
      val path_extents : t -> Matrix.rectangle
      val stroke : t -> unit
      val stroke_preserve : t -> unit
      val fill : t -> unit
      val fill_preserve : t -> unit
      val stroke_path_preserve : t -> Path.t -> unit
      val fill_path_preserve : t -> Path.t -> unit
      val fill_with_color : t -> Color.t -> unit
      val show : t -> unit
      val clip_rectangle :
        t -> x:float -> y:float -> w:float -> h:float -> unit
      val save : t -> unit
      val restore : t -> unit
      val translate : t -> x:float -> y:float -> unit
      val scale : t -> x:float -> y:float -> unit
      val rotate : t -> angle:float -> unit
      val set_matrix : t -> Matrix.t -> unit
      val get_matrix : t -> Matrix.t
      val flipy : t -> bool
      val select_font_face : t -> slant -> weight -> string -> unit
      val set_font_size : t -> float -> unit
      val text_extents : t -> string -> Matrix.rectangle
      val show_text :
        t ->
        rotate:float -> x:float -> y:float -> text_position -> string -> unit
      val name : string
      val make : options:string list -> float -> float -> t
      val close : options:string list -> t -> unit
    end
  module Register : functor (B : Capabilities-> sig  end
end