sig
  module Matrix :
    sig
      type affine = {
        mutable xx : float;
        mutable yx : float;
        mutable xy : float;
        mutable yy : float;
        mutable x0 : float;
        mutable y0 : float;
      }
      type t = Archimedes.Matrix.affine
      exception Not_invertible
      val make_identity : unit -> Archimedes.Matrix.t
      val make_translate : x:float -> y:float -> Archimedes.Matrix.t
      val make_scale : x:float -> y:float -> Archimedes.Matrix.t
      val make_rotate : angle:float -> Archimedes.Matrix.t
      val set_to_identity : Archimedes.Matrix.t -> unit
      val copy : Archimedes.Matrix.t -> Archimedes.Matrix.t
      val blit : Archimedes.Matrix.t -> Archimedes.Matrix.t -> unit
      val translate : Archimedes.Matrix.t -> x:float -> y:float -> unit
      val scale : Archimedes.Matrix.t -> x:float -> y:float -> unit
      val rotate : Archimedes.Matrix.t -> angle:float -> unit
      val invert : Archimedes.Matrix.t -> unit
      val det : Archimedes.Matrix.t -> float
      val mul :
        Archimedes.Matrix.t -> Archimedes.Matrix.t -> Archimedes.Matrix.t
      val mul_in :
        Archimedes.Matrix.t ->
        Archimedes.Matrix.t -> Archimedes.Matrix.t -> unit
      val transform_point :
        Archimedes.Matrix.t -> x:float -> y:float -> float * float
      val transform_distance :
        Archimedes.Matrix.t -> dx:float -> dy:float -> float * float
      val inv_transform_point :
        Archimedes.Matrix.t -> x:float -> y:float -> float * float
      val inv_transform_distance :
        Archimedes.Matrix.t -> dx:float -> dy:float -> float * float
      val has_shear : Archimedes.Matrix.t -> bool
      type rectangle = { x : float; y : float; w : float; h : float; }
      val transform_rectangle :
        ?dist_basepoint:bool ->
        Archimedes.Matrix.t ->
        Archimedes.Matrix.rectangle -> Archimedes.Matrix.rectangle
      module Homothety :
        sig
          type t
          val of_matrix :
            Archimedes.Matrix.affine -> Archimedes.Matrix.Homothety.t
          val to_matrix :
            Archimedes.Matrix.Homothety.t -> Archimedes.Matrix.affine
          val make_identity : unit -> Archimedes.Matrix.Homothety.t
          val make_translate :
            x:float -> y:float -> Archimedes.Matrix.Homothety.t
          val make_scale :
            x:float -> y:float -> Archimedes.Matrix.Homothety.t
          val set_to_identity : Archimedes.Matrix.Homothety.t -> unit
          val copy :
            Archimedes.Matrix.Homothety.t -> Archimedes.Matrix.Homothety.t
          val blit :
            Archimedes.Matrix.Homothety.t ->
            Archimedes.Matrix.Homothety.t -> unit
          val translate :
            Archimedes.Matrix.Homothety.t -> x:float -> y:float -> unit
          val scale :
            Archimedes.Matrix.Homothety.t -> x:float -> y:float -> unit
          val invert : Archimedes.Matrix.Homothety.t -> unit
          val det : Archimedes.Matrix.Homothety.t -> float
          val mul :
            Archimedes.Matrix.Homothety.t ->
            Archimedes.Matrix.Homothety.t -> Archimedes.Matrix.Homothety.t
          val mul_in :
            Archimedes.Matrix.Homothety.t ->
            Archimedes.Matrix.Homothety.t ->
            Archimedes.Matrix.Homothety.t -> unit
          val transform_point :
            Archimedes.Matrix.Homothety.t ->
            x:float -> y:float -> float * float
          val transform_distance :
            Archimedes.Matrix.Homothety.t ->
            dx:float -> dy:float -> float * float
          val inv_transform_point :
            Archimedes.Matrix.Homothety.t ->
            x:float -> y:float -> float * float
          val inv_transform_distance :
            Archimedes.Matrix.Homothety.t ->
            dx:float -> dy:float -> float * float
          val transform_rectangle :
            ?dist_basepoint:bool ->
            Archimedes.Matrix.Homothety.t ->
            Archimedes.Matrix.rectangle -> Archimedes.Matrix.rectangle
        end
    end
  module Color :
    sig
      type t
      val rgb : float -> float -> float -> Archimedes.Color.t
      val rgba : float -> float -> float -> float -> Archimedes.Color.t
      val hex : int -> Archimedes.Color.t
      val r : Archimedes.Color.t -> float
      val g : Archimedes.Color.t -> float
      val b : Archimedes.Color.t -> float
      val a : Archimedes.Color.t -> float
      val get_rgb : Archimedes.Color.t -> float * float * float
      val get_rgba : Archimedes.Color.t -> float * float * float * float
      val luminance : Archimedes.Color.t -> float
      val black : Archimedes.Color.t
      val red : Archimedes.Color.t
      val green : Archimedes.Color.t
      val blue : Archimedes.Color.t
      val yellow : Archimedes.Color.t
      val magenta : Archimedes.Color.t
      val cyan : Archimedes.Color.t
      val white : Archimedes.Color.t
      val dark_slate_grey : Archimedes.Color.t
      val deep_sky_blue : Archimedes.Color.t
      val dodger_blue : Archimedes.Color.t
      val aquamarine : Archimedes.Color.t
      val light_blue : Archimedes.Color.t
      val medium_blue : Archimedes.Color.t
      val navy_blue : Archimedes.Color.t
      val royal_blue : Archimedes.Color.t
      val burlywood : Archimedes.Color.t
      val chocolate : Archimedes.Color.t
      val tan : Archimedes.Color.t
      val dark_green : Archimedes.Color.t
      val dark_olive_green : Archimedes.Color.t
      val forest_green : Archimedes.Color.t
      val green_yellow : Archimedes.Color.t
      val sea_green : Archimedes.Color.t
      val dark_orange : Archimedes.Color.t
      val peach_puff : Archimedes.Color.t
      val coral : Archimedes.Color.t
      val orange : Archimedes.Color.t
      val hot_pink : Archimedes.Color.t
      val indian_red : Archimedes.Color.t
      val light_pink : Archimedes.Color.t
      val misty_rose : Archimedes.Color.t
      val orange_red : Archimedes.Color.t
      val firebrick : Archimedes.Color.t
      val dark_orchid : Archimedes.Color.t
      val lavender_blush : Archimedes.Color.t
      val plum : Archimedes.Color.t
      val orchid : Archimedes.Color.t
      val purple : Archimedes.Color.t
      val thistle : Archimedes.Color.t
      val antique_white : Archimedes.Color.t
      val old_lace : Archimedes.Color.t
      val ivory : Archimedes.Color.t
      val linen : Archimedes.Color.t
      val wheat : Archimedes.Color.t
      val white_smoke : Archimedes.Color.t
      val lemon_chiffon : Archimedes.Color.t
      val light_goldenrod : Archimedes.Color.t
      val cornsilk : Archimedes.Color.t
      val gold : Archimedes.Color.t
      val light_gray : Archimedes.Color.t
      val gainsboro : Archimedes.Color.t
      val silver : Archimedes.Color.t
      val trolley_grey : Archimedes.Color.t
      type operator =
          Over
        | Source
        | Clear
        | In
        | Out
        | Atop
        | Dest
        | Dest_Over
        | Dest_In
        | Dest_Out
        | Dest_Atop
        | Xor
        | Add
        | Saturate
      val add :
        ?op:Archimedes.Color.operator ->
        Archimedes.Color.t -> Archimedes.Color.t -> Archimedes.Color.t
    end
  module Path :
    sig
      type t = Archimedes_internals.Path.t
      val make : unit -> Archimedes.Path.t
      val is_empty : Archimedes.Path.t -> bool
      val copy : Archimedes.Path.t -> Archimedes.Path.t
      val clear : Archimedes.Path.t -> unit
      val extents : Archimedes.Path.t -> Archimedes.Matrix.rectangle
      val move_to : Archimedes.Path.t -> x:float -> y:float -> unit
      val rel_move_to : Archimedes.Path.t -> x:float -> y:float -> unit
      val line_to : Archimedes.Path.t -> x:float -> y:float -> unit
      val rel_line_to : Archimedes.Path.t -> x:float -> y:float -> unit
      val line_of_array :
        Archimedes.Path.t ->
        ?i0:int ->
        ?i1:int ->
        ?const_x:bool -> float array -> ?const_y:bool -> float array -> unit
      type vec =
          (float, Bigarray.float64_elt, Bigarray.fortran_layout)
          Bigarray.Array1.t
      val line_of_vec :
        Archimedes.Path.t ->
        ?i0:int ->
        ?i1:int ->
        ?const_x:bool ->
        Archimedes.Path.vec -> ?const_y:bool -> Archimedes.Path.vec -> unit
      type cvec =
          (float, Bigarray.float64_elt, Bigarray.c_layout) Bigarray.Array1.t
      val line_of_cvec :
        Archimedes.Path.t ->
        ?i0:int ->
        ?i1:int ->
        ?const_x:bool ->
        Archimedes.Path.cvec -> ?const_y:bool -> Archimedes.Path.cvec -> unit
      val rectangle :
        Archimedes.Path.t -> x:float -> y:float -> w:float -> h:float -> unit
      val curve_to :
        Archimedes.Path.t ->
        x1:float ->
        y1:float -> x2:float -> y2:float -> x3:float -> y3:float -> unit
      val arc : Archimedes.Path.t -> r:float -> a1:float -> a2:float -> unit
      val close : Archimedes.Path.t -> unit
      val current_point : Archimedes.Path.t -> float * float
      val append : Archimedes.Path.t -> Archimedes.Path.t -> unit
      val transform :
        Archimedes.Matrix.t -> Archimedes.Path.t -> Archimedes.Path.t
    end
  module Backend :
    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
  module Coordinate :
    sig
      type t
      type ctm
      val use :
        Archimedes.Backend.t ->
        Archimedes.Coordinate.t -> Archimedes.Coordinate.ctm
      val restore : Archimedes.Backend.t -> Archimedes.Coordinate.ctm -> unit
      val to_parent :
        Archimedes.Coordinate.t -> x:float -> y:float -> float * float
      val from_parent :
        Archimedes.Coordinate.t -> x:float -> y:float -> float * float
      val to_device :
        Archimedes.Coordinate.t -> x:float -> y:float -> float * float
      val to_device_distance :
        Archimedes.Coordinate.t -> dx:float -> dy:float -> float * float
      val to_coord :
        Archimedes.Coordinate.t -> x:float -> y:float -> float * float
      val to_coord_distance :
        Archimedes.Coordinate.t -> dx:float -> dy:float -> float * float
      val make_root :
        Archimedes.Matrix.Homothety.t -> Archimedes.Coordinate.t
      val make_identity : Archimedes.Coordinate.t -> Archimedes.Coordinate.t
      val make_translate :
        Archimedes.Coordinate.t ->
        x:float -> y:float -> Archimedes.Coordinate.t
      val make_scale :
        Archimedes.Coordinate.t ->
        x:float -> y:float -> Archimedes.Coordinate.t
      val make_from_transform :
        Archimedes.Coordinate.t ->
        Archimedes.Matrix.Homothety.t -> Archimedes.Coordinate.t
      val copy : Archimedes.Coordinate.t -> Archimedes.Coordinate.t
      val translate : Archimedes.Coordinate.t -> x:float -> y:float -> unit
      val scale : Archimedes.Coordinate.t -> x:float -> y:float -> unit
      val transform : Archimedes.Coordinate.t -> Archimedes.Matrix.t -> unit
      type monitor
      val monitor : Archimedes.Coordinate.t -> Archimedes.Coordinate.monitor
      val reset : Archimedes.Coordinate.monitor -> unit
      val changed : Archimedes.Coordinate.monitor -> bool
    end
  module Viewport :
    sig
      type t
      type coord_name = [ `Data | `Device | `Graph | `Orthonormal ]
      val get_coord_from_name :
        Archimedes.Viewport.t ->
        Archimedes.Viewport.coord_name -> Archimedes.Coordinate.t
      val make :
        Archimedes.Viewport.t ->
        ?lines:float ->
        ?text:float ->
        ?marks:float ->
        ?redim:(Archimedes.Viewport.t -> float -> float -> unit) ->
        ?coord:[ `Device | `Graph | `Orthonormal ] ->
        float -> float -> float -> float -> Archimedes.Viewport.t
      val show : Archimedes.Viewport.t -> unit
      val get_backend : Archimedes.Viewport.t -> Archimedes.Backend.t
      val desync_ratio : Archimedes.Viewport.t -> unit
      val sync_ratio : Archimedes.Viewport.t -> Archimedes.Viewport.t -> unit
      val desync_range : ?x:bool -> ?y:bool -> Archimedes.Viewport.t -> unit
      val sync_range :
        ?x:bool ->
        ?y:bool -> Archimedes.Viewport.t -> Archimedes.Viewport.t -> unit
      val desync_unit_size :
        ?x:bool -> ?y:bool -> Archimedes.Viewport.t -> unit
      val sync_unit_size :
        ?x:bool ->
        ?y:bool -> Archimedes.Viewport.t -> Archimedes.Viewport.t -> unit
      val sync :
        ?x:bool ->
        ?y:bool -> Archimedes.Viewport.t -> Archimedes.Viewport.t -> unit
      val grid :
        ?syncs:bool * bool * bool * bool ->
        Archimedes.Viewport.t ->
        int -> int -> Archimedes.Viewport.t array array
      val rows :
        ?syncs:bool * bool ->
        Archimedes.Viewport.t -> int -> Archimedes.Viewport.t array
      val columns :
        ?syncs:bool * bool ->
        Archimedes.Viewport.t -> int -> Archimedes.Viewport.t array
      val layout_borders :
        ?north:float ->
        ?south:float ->
        ?west:float ->
        ?east:float ->
        Archimedes.Viewport.t ->
        Archimedes.Viewport.t * Archimedes.Viewport.t *
        Archimedes.Viewport.t * Archimedes.Viewport.t * Archimedes.Viewport.t
      val ortho_from :
        Archimedes.Viewport.t ->
        Archimedes.Viewport.coord_name -> float * float -> float * float
      val data_from :
        Archimedes.Viewport.t ->
        Archimedes.Viewport.coord_name -> float * float -> float * float
      val set_line_width : Archimedes.Viewport.t -> float -> unit
      val set_font_size : Archimedes.Viewport.t -> float -> unit
      val set_mark_size : Archimedes.Viewport.t -> float -> unit
      val set_rel_line_width : Archimedes.Viewport.t -> float -> unit
      val set_rel_font_size : Archimedes.Viewport.t -> float -> unit
      val set_rel_mark_size : Archimedes.Viewport.t -> float -> unit
      val get_color : Archimedes.Viewport.t -> Archimedes.Color.t
      val get_background_color : Archimedes.Viewport.t -> Archimedes.Color.t
      val get_line_width : Archimedes.Viewport.t -> float
      val get_font_size : Archimedes.Viewport.t -> float
      val get_mark_size : Archimedes.Viewport.t -> float
      val lower_left_corner : Archimedes.Viewport.t -> float * float
      val upper_right_corner : Archimedes.Viewport.t -> float * float
      val dimensions : Archimedes.Viewport.t -> float * float
      val set_color : Archimedes.Viewport.t -> Archimedes.Color.t -> unit
      val set_global_line_cap :
        Archimedes.Viewport.t -> Archimedes.Backend.line_cap -> unit
      val set_global_dash :
        Archimedes.Viewport.t -> float -> float array -> unit
      val set_global_line_join :
        Archimedes.Viewport.t -> Archimedes.Backend.line_join -> unit
      val get_line_cap : Archimedes.Viewport.t -> Archimedes.Backend.line_cap
      val get_dash : Archimedes.Viewport.t -> float array * float
      val get_line_join :
        Archimedes.Viewport.t -> Archimedes.Backend.line_join
      val move_to : Archimedes.Viewport.t -> x:float -> y:float -> unit
      val line_to : Archimedes.Viewport.t -> x:float -> y:float -> unit
      val rel_move_to : Archimedes.Viewport.t -> x:float -> y:float -> unit
      val rel_line_to : Archimedes.Viewport.t -> x:float -> y:float -> unit
      val curve_to :
        Archimedes.Viewport.t ->
        x1:float ->
        y1:float -> x2:float -> y2:float -> x3:float -> y3:float -> unit
      val rectangle :
        Archimedes.Viewport.t ->
        x:float -> y:float -> w:float -> h:float -> unit
      val arc :
        Archimedes.Viewport.t -> r:float -> a1:float -> a2:float -> unit
      val close_path : Archimedes.Viewport.t -> unit
      val clear_path : Archimedes.Viewport.t -> unit
      val stroke_preserve :
        ?path:Archimedes.Path.t ->
        ?fit:bool ->
        Archimedes.Viewport.t -> Archimedes.Viewport.coord_name -> unit
      val stroke :
        ?path:Archimedes.Path.t ->
        ?fit:bool ->
        Archimedes.Viewport.t -> Archimedes.Viewport.coord_name -> unit
      val fill_preserve :
        ?path:Archimedes.Path.t ->
        ?fit:bool ->
        Archimedes.Viewport.t -> Archimedes.Viewport.coord_name -> unit
      val fill :
        ?path:Archimedes.Path.t ->
        ?fit:bool ->
        Archimedes.Viewport.t -> Archimedes.Viewport.coord_name -> unit
      val clip_rectangle :
        Archimedes.Viewport.t ->
        x:float -> y:float -> w:float -> h:float -> unit
      val select_font_face :
        Archimedes.Viewport.t ->
        Archimedes.Backend.slant ->
        Archimedes.Backend.weight -> string -> unit
      val text :
        Archimedes.Viewport.t ->
        ?coord:Archimedes.Viewport.coord_name ->
        ?rotate:float ->
        float ->
        float -> ?pos:Archimedes.Backend.text_position -> string -> unit
      val mark :
        Archimedes.Viewport.t -> x:float -> y:float -> string -> unit
      val axes_ratio : Archimedes.Viewport.t -> float -> unit
      val xrange : Archimedes.Viewport.t -> float -> float -> unit
      val yrange : Archimedes.Viewport.t -> float -> float -> unit
      val xlabel : Archimedes.Viewport.t -> string -> unit
      val ylabel : Archimedes.Viewport.t -> string -> unit
      val title : Archimedes.Viewport.t -> string -> unit
      val xmin : Archimedes.Viewport.t -> float
      val xmax : Archimedes.Viewport.t -> float
      val ymin : Archimedes.Viewport.t -> float
      val ymax : Archimedes.Viewport.t -> float
      val xlog : Archimedes.Viewport.t -> bool
      val ylog : Archimedes.Viewport.t -> bool
      val set_xlog : Archimedes.Viewport.t -> bool -> unit
      val set_ylog : Archimedes.Viewport.t -> bool -> unit
      val set_line_width_direct :
        Archimedes.Viewport.t -> float -> unit -> unit
      val set_font_size_direct :
        Archimedes.Viewport.t -> float -> unit -> unit
      val set_mark_size_direct :
        Archimedes.Viewport.t -> float -> unit -> unit
      val set_rel_line_width_direct :
        Archimedes.Viewport.t -> float -> unit -> unit
      val set_rel_font_size_direct :
        Archimedes.Viewport.t -> float -> unit -> unit
      val set_rel_mark_size_direct :
        Archimedes.Viewport.t -> float -> unit -> unit
      val set_color_direct :
        Archimedes.Viewport.t -> Archimedes.Color.t -> unit -> unit
      val set_line_cap_direct :
        Archimedes.Viewport.t -> Archimedes.Backend.line_cap -> unit -> unit
      val set_dash_direct :
        Archimedes.Viewport.t -> float -> float array -> unit -> unit
      val set_line_join_direct :
        Archimedes.Viewport.t -> Archimedes.Backend.line_join -> unit -> unit
      val stroke_direct :
        ?path:Archimedes.Path.t ->
        Archimedes.Viewport.t ->
        Archimedes.Viewport.coord_name -> unit -> unit
      val fill_direct :
        ?path:Archimedes.Path.t ->
        Archimedes.Viewport.t ->
        Archimedes.Viewport.coord_name -> unit -> unit
      val clip_rectangle_direct :
        Archimedes.Viewport.t ->
        x:float -> y:float -> w:float -> h:float -> unit -> unit
      val select_font_face_direct :
        Archimedes.Viewport.t ->
        Archimedes.Backend.slant ->
        Archimedes.Backend.weight -> string -> unit -> unit
      val show_text_direct :
        Archimedes.Viewport.t ->
        Archimedes.Viewport.coord_name ->
        ?rotate:float ->
        x:float ->
        y:float -> Archimedes.Backend.text_position -> string -> unit -> unit
      val mark_direct :
        Archimedes.Viewport.t -> x:float -> y:float -> string -> unit -> unit
      val save_direct : Archimedes.Viewport.t -> unit -> unit
      val restore_direct : Archimedes.Viewport.t -> unit -> unit
      val add_instruction : Archimedes.Viewport.t -> (unit -> unit) -> unit
      val do_instructions : Archimedes.Viewport.t -> unit
      val auto_fit :
        Archimedes.Viewport.t -> float -> float -> float -> float -> unit
      val fit : Archimedes.Viewport.t -> Archimedes.Matrix.rectangle -> unit
      val save : Archimedes.Viewport.t -> unit
      val restore : Archimedes.Viewport.t -> unit
    end
  module Sampler :
    sig
      type strategy = float -> float -> float
      type cost =
          Archimedes.Matrix.rectangle ->
          float -> float -> float -> float -> float -> float -> float
      val xy :
        ?tlog:bool ->
        ?n:int ->
        ?strategy:Archimedes.Sampler.strategy ->
        ?cost:Archimedes.Sampler.cost ->
        (float -> float * float) ->
        float -> float -> float array * float array
      val x :
        ?tlog:bool ->
        ?n:int ->
        ?strategy:Archimedes.Sampler.strategy ->
        ?cost:Archimedes.Sampler.cost ->
        (float -> float) -> float -> float -> float array * float array
      val strategy_midpoint : Archimedes.Sampler.strategy
      val strategy_random : Archimedes.Sampler.strategy
      val strategy_center_random : Archimedes.Sampler.strategy
      val cost_angle : Archimedes.Sampler.cost
      val cost_angle_dist : Archimedes.Sampler.cost
      val cost_angle_log : bool -> bool -> Archimedes.Sampler.cost
    end
  module Marker :
    sig
      exception Error of string
      type name = string
      val add :
        name:Archimedes.Marker.name ->
        (Archimedes.Backend.t -> unit) -> Archimedes.Matrix.rectangle -> unit
      val names : unit -> Archimedes.Marker.name list
    end
  module Arrows :
    sig
      type style =
          Unstyled
        | Simple
        | Double
        | Triple
        | Diamond
        | Circle
        | Stop
        | Custom of (Archimedes.Path.t -> unit)
      val path_line_to :
        ?size:float ->
        ?head:Archimedes.Arrows.style ->
        ?tail:Archimedes.Arrows.style ->
        Archimedes.Path.t -> float -> float -> unit
      val line_direct :
        ?size:float ->
        ?head:Archimedes.Arrows.style ->
        ?tail:Archimedes.Arrows.style ->
        Archimedes.Viewport.t ->
        float -> float -> float -> float -> unit -> unit
      val line :
        ?size:float ->
        ?head:Archimedes.Arrows.style ->
        ?tail:Archimedes.Arrows.style ->
        Archimedes.Viewport.t -> float -> float -> float -> float -> unit
      val arc_direct :
        ?size:float ->
        ?head:Archimedes.Arrows.style ->
        ?tail:Archimedes.Arrows.style ->
        Archimedes.Viewport.t ->
        float -> float -> float -> float -> float -> unit -> unit
      val arc :
        ?size:float ->
        ?head:Archimedes.Arrows.style ->
        ?tail:Archimedes.Arrows.style ->
        Archimedes.Viewport.t ->
        float -> float -> float -> float -> float -> unit
    end
  module Tics :
    sig
      type labels =
          No_label
        | Text of (string * float) array
        | Number of int
        | Expnumber of float
        | Expnumber_named of float * string
        | Custom of (float -> string)
      type t =
          Fixed of Archimedes.Tics.labels * float list
        | Fixed_norm of Archimedes.Tics.labels * float list
        | Equidistants of Archimedes.Tics.labels * float * float * int
        | Auto of Archimedes.Tics.labels
      type tic = Major of string * float | Minor of float
      val tics :
        ?log:bool ->
        float -> float -> Archimedes.Tics.t -> Archimedes.Tics.tic list
    end
  module Axes :
    sig
      type offset = Relative of float | Absolute of float
      val x :
        ?grid:bool ->
        ?major:string * float ->
        ?minor:string * float ->
        ?start:Archimedes.Arrows.style ->
        ?stop:Archimedes.Arrows.style ->
        ?tics:Archimedes.Tics.t ->
        ?offset:Archimedes.Axes.offset -> Archimedes.Viewport.t -> unit
      val y :
        ?grid:bool ->
        ?major:string * float ->
        ?minor:string * float ->
        ?start:Archimedes.Arrows.style ->
        ?stop:Archimedes.Arrows.style ->
        ?tics:Archimedes.Tics.t ->
        ?offset:Archimedes.Axes.offset -> Archimedes.Viewport.t -> unit
      val box :
        ?grid:bool ->
        ?tics:Archimedes.Tics.t ->
        ?tics_alt:Archimedes.Tics.t -> Archimedes.Viewport.t -> unit
      val cross : ?tics:Archimedes.Tics.t -> Archimedes.Viewport.t -> unit
    end
  val init :
    ?lines:float ->
    ?text:float ->
    ?marks:float ->
    ?bg:Archimedes.Color.t ->
    ?w:float ->
    ?h:float -> ?dirs:string list -> string list -> Archimedes.Viewport.t
  val backend_of_filename : string -> string list
  val show : Archimedes.Viewport.t -> unit
  val close : Archimedes.Viewport.t -> unit
  val set_color : Archimedes.Viewport.t -> Archimedes.Color.t -> unit
  val set_line_width : Archimedes.Viewport.t -> float -> unit
  val xrange : Archimedes.Viewport.t -> float -> float -> unit
  val yrange : Archimedes.Viewport.t -> float -> float -> unit
  type style =
      [ `Bars of float
      | `HBars of float
      | `Impulses
      | `Lines
      | `Linesmarkers of string
      | `Markers of string ]
  val fx :
    Archimedes.Viewport.t ->
    ?tlog:bool ->
    ?n:int ->
    ?strategy:Archimedes.Sampler.strategy ->
    ?cost:Archimedes.Sampler.cost ->
    ?style:[ `Lines | `Linesmarkers of string | `Markers of string ] ->
    ?base:(float -> float) ->
    ?fill:bool ->
    ?fillcolor:Archimedes.Color.t ->
    (float -> float) -> float -> float -> unit
  val xyf :
    Archimedes.Viewport.t ->
    ?tlog:bool ->
    ?n:int ->
    ?strategy:Archimedes.Sampler.strategy ->
    ?cost:Archimedes.Sampler.cost ->
    ?style:[ `Lines | `Linesmarkers of string | `Markers of string ] ->
    ?fill:bool ->
    ?fillcolor:Archimedes.Color.t ->
    (float -> float * float) -> float -> float -> unit
  module Array :
    sig
      val y :
        Archimedes.Viewport.t ->
        ?const_base:bool ->
        ?base:float array ->
        ?fill:bool ->
        ?fillcolor:Archimedes.Color.t ->
        ?style:Archimedes.style -> ?const_y:bool -> float array -> unit
      val xy :
        Archimedes.Viewport.t ->
        ?fill:bool ->
        ?fillcolor:Archimedes.Color.t ->
        ?style:Archimedes.style ->
        ?const_x:bool -> float array -> ?const_y:bool -> float array -> unit
      val xy_pairs :
        Archimedes.Viewport.t ->
        ?fill:bool ->
        ?fillcolor:Archimedes.Color.t ->
        ?style:[ `Lines | `Linesmarkers of string | `Markers of string ] ->
        (float * float) array -> unit
      val stack :
        Archimedes.Viewport.t ->
        ?fill:bool ->
        ?fillcolors:Archimedes.Color.t array ->
        ?style:Archimedes.style -> ?const:bool -> float array array -> unit
    end
  module List :
    sig
      val y :
        Archimedes.Viewport.t ->
        ?base:float list ->
        ?fill:bool ->
        ?fillcolor:Archimedes.Color.t ->
        ?style:Archimedes.style -> float list -> unit
      val xy :
        Archimedes.Viewport.t ->
        ?fill:bool ->
        ?fillcolor:Archimedes.Color.t ->
        ?style:[ `Lines | `Linesmarkers of string | `Markers of string ] ->
        float list -> float list -> unit
      val xy_pairs :
        Archimedes.Viewport.t ->
        ?fill:bool ->
        ?fillcolor:Archimedes.Color.t ->
        ?style:[ `Lines | `Linesmarkers of string | `Markers of string ] ->
        (float * float) list -> unit
    end
  module Vec :
    sig
      type t =
          (float, Bigarray.float64_elt, Bigarray.fortran_layout)
          Bigarray.Array1.t
      val y :
        Archimedes.Viewport.t ->
        ?const_base:bool ->
        ?base:Archimedes.Vec.t ->
        ?fill:bool ->
        ?fillcolor:Archimedes.Color.t ->
        ?style:Archimedes.style -> ?const_y:bool -> Archimedes.Vec.t -> unit
      val xy :
        Archimedes.Viewport.t ->
        ?fill:bool ->
        ?fillcolor:Archimedes.Color.t ->
        ?style:Archimedes.style ->
        ?const_x:bool ->
        Archimedes.Vec.t -> ?const_y:bool -> Archimedes.Vec.t -> unit
      val stack :
        Archimedes.Viewport.t ->
        ?fill:bool ->
        ?fillcolors:Archimedes.Color.t array ->
        ?style:Archimedes.style ->
        ?const:bool -> Archimedes.Vec.t array -> unit
    end
  module CVec :
    sig
      type t =
          (float, Bigarray.float64_elt, Bigarray.c_layout) Bigarray.Array1.t
      val y :
        Archimedes.Viewport.t ->
        ?const_base:bool ->
        ?base:Archimedes.CVec.t ->
        ?fill:bool ->
        ?fillcolor:Archimedes.Color.t ->
        ?style:Archimedes.style -> ?const_y:bool -> Archimedes.CVec.t -> unit
      val xy :
        Archimedes.Viewport.t ->
        ?fill:bool ->
        ?fillcolor:Archimedes.Color.t ->
        ?style:Archimedes.style ->
        ?const_x:bool ->
        Archimedes.CVec.t -> ?const_y:bool -> Archimedes.CVec.t -> unit
      val stack :
        Archimedes.Viewport.t ->
        ?fill:bool ->
        ?fillcolors:Archimedes.Color.t array ->
        ?style:Archimedes.style ->
        ?const:bool -> Archimedes.CVec.t array -> unit
    end
  val y :
    Archimedes.Viewport.t ->
    ?base:((float -> unit) -> unit) ->
    ?fill:bool ->
    ?fillcolor:Archimedes.Color.t ->
    ?style:Archimedes.style -> ((float -> unit) -> unit) -> unit
  val xy :
    Archimedes.Viewport.t ->
    ?fill:bool ->
    ?fillcolor:Archimedes.Color.t ->
    ?style:[ `Lines | `Linesmarkers of string | `Markers of string ] ->
    ((float -> float -> unit) -> unit) -> unit
  module Piechart :
    sig
      type style = Flat | Separated | HighlightFlat | Relief
      type colorscheme =
          Default
        | Monochrome
        | Black
        | CustomColors of (string * Archimedes.Color.t) list
        | ValueDependant of (float -> Archimedes.Color.t)
        | LevelValueDependant of
            (int ->
             int ->
             float -> Archimedes.Color.t -> float -> Archimedes.Color.t)
      type keyplacement = Rectangle | OverPie | Outer
      type keylabels =
          Key
        | WithValues
        | WithProcents
        | CustomLabels of (string -> float -> float -> string)
      val simple :
        ?style:Archimedes.Piechart.style ->
        ?colorscheme:Archimedes.Piechart.colorscheme ->
        ?keyplacement:Archimedes.Piechart.keyplacement ->
        ?keylabels:Archimedes.Piechart.keylabels ->
        ?x0:float ->
        ?y0:float ->
        ?xend:float ->
        ?yend:float -> Archimedes.Viewport.t -> (string * float) list -> unit
      type multidata = {
        name : string;
        value : float;
        children : Archimedes.Piechart.multidata list;
      }
      val multilevel :
        ?style:Archimedes.Piechart.style ->
        ?colorscheme:Archimedes.Piechart.colorscheme ->
        ?keyplacement:Archimedes.Piechart.keyplacement ->
        ?keylabels:Archimedes.Piechart.keylabels ->
        ?x0:float ->
        ?y0:float ->
        ?xend:float ->
        ?yend:float ->
        Archimedes.Viewport.t -> Archimedes.Piechart.multidata list -> unit
    end
end