sig
  type doc
  val new_document : width:int -> height:int -> unit -> Cnv.doc
  val finish : Cnv.doc -> unit
  val add_comment : Cnv.doc -> s:string -> unit -> unit
  val add_newline : Cnv.doc -> unit
  val get_document : Cnv.doc -> string
  val write_file : Cnv.doc -> filename:string -> unit
  val print_document : Cnv.doc -> unit
  val add_rect :
    Cnv.doc ->
    x:int ->
    y:int ->
    width:int ->
    height:int ->
    ?fill:string -> ?stroke:string -> ?stroke_width:float -> unit -> unit
  val add_circle :
    Cnv.doc ->
    c:float * float ->
    r:float ->
    ?fill:string -> ?stroke:string -> ?stroke_width:float -> unit -> unit
  val add_triangle :
    Cnv.doc ->
    p1:int * int ->
    p2:int * int ->
    p3:int * int ->
    ?fill:string -> ?stroke:string -> ?stroke_width:float -> unit -> unit
  val add_line :
    Cnv.doc ->
    p1:int * int ->
    p2:int * int -> ?stroke:string -> ?stroke_width:float -> unit -> unit
  val add_polyline :
    Cnv.doc ->
    points:(int * int) list ->
    ?fill:string -> ?stroke:string -> ?stroke_width:float -> unit -> unit
  val add_polygon :
    Cnv.doc ->
    points:(int * int) list ->
    ?fill:string -> ?stroke:string -> ?stroke_width:float -> unit -> unit
  val add_ellipse :
    Cnv.doc ->
    c:float * float ->
    rs:float * float ->
    ?angle:float ->
    ?fill:string -> ?stroke:string -> ?stroke_width:float -> unit -> unit
  val add_text :
    Cnv.doc ->
    x:int ->
    y:int ->
    text:string ->
    font:string ->
    ?fill:string -> ?stroke:string -> ?stroke_width:float -> unit -> unit
  val add_path :
    Cnv.doc ->
    d:string ->
    ?fill:string -> ?stroke:string -> ?stroke_width:float -> unit -> unit
  type path
  val add_path2 :
    Cnv.doc ->
    f:(Cnv.path -> Cnv.path) ->
    ?fill:string -> ?stroke:string -> ?stroke_width:float -> unit -> unit
  val move_to : Cnv.path -> x:float -> y:float -> Cnv.path
  val line_to : Cnv.path -> x:float -> y:float -> Cnv.path
  val arc_to :
    Cnv.path ->
    x1:float -> y1:float -> x2:float -> y2:float -> radius:float -> Cnv.path
  val quad_curve :
    Cnv.path -> x1:float -> y1:float -> x:float -> y:float -> Cnv.path
  val cubic_curve :
    Cnv.path ->
    x1:float ->
    y1:float -> x2:float -> y2:float -> x:float -> y:float -> Cnv.path
  val close_path : Cnv.path -> Cnv.path
  val add_svg_document :
    Cnv.doc -> frag:string -> x:int -> y:int -> unit -> unit
  val begin_group :
    Cnv.doc ->
    ?translate:float * float ->
    ?rotate:float -> ?scale:float * float -> unit -> unit
  val end_group : Cnv.doc -> unit
  val to_radian : float -> float
  type def
  val linear_gradient :
    p1:int * int ->
    p2:int * int ->
    stops:(float * string) list ->
    ?translate:int * int -> unit -> Cnv.def * string
  val radial_gradient :
    c1:int * int ->
    c2:int * int ->
    rs:int * int ->
    stops:(float * string) list ->
    ?translate:int * int -> unit -> Cnv.def * string
  val conic_gradient :
    c:int * int ->
    start_angle:float ->
    stops:(float * string) list ->
    ?translate:int * int -> unit -> Cnv.def * string
  val add_def : Cnv.doc -> Cnv.def -> unit
  val add_defs : Cnv.doc -> Cnv.def list -> unit
end