sig
  type status =
      INVALID_RESTORE
    | INVALID_POP_GROUP
    | NO_CURRENT_POINT
    | INVALID_MATRIX
    | INVALID_STATUS
    | NULL_POINTER
    | INVALID_STRING
    | INVALID_PATH_DATA
    | READ_ERROR
    | WRITE_ERROR
    | SURFACE_FINISHED
    | SURFACE_TYPE_MISMATCH
    | PATTERN_TYPE_MISMATCH
    | INVALID_CONTENT
    | INVALID_FORMAT
    | INVALID_VISUAL
    | FILE_NOT_FOUND
    | INVALID_DASH
    | INVALID_DSC_COMMENT
    | INVALID_INDEX
    | CLIP_NOT_REPRESENTABLE
    | TEMP_FILE_ERROR
    | INVALID_STRIDE
    | FONT_TYPE_MISMATCH
    | USER_FONT_IMMUTABLE
    | USER_FONT_ERROR
    | NEGATIVE_COUNT
    | INVALID_CLUSTERS
    | INVALID_SLANT
    | INVALID_WEIGHT
    | INVALID_SIZE
    | USER_FONT_NOT_IMPLEMENTED
    | DEVICE_TYPE_MISMATCH
    | DEVICE_ERROR
    | INVALID_MESH_CONSTRUCTION
    | DEVICE_FINISHED
    | JBIG2_GLOBAL_MISSING
  exception Error of Cairo.status
  val status_to_string : Cairo.status -> string
  exception Unavailable
  type context
  type matrix = {
    mutable xx : float;
    mutable yx : float;
    mutable xy : float;
    mutable yy : float;
    mutable x0 : float;
    mutable y0 : float;
  }
  module Matrix :
    sig
      type t = Cairo.matrix
      val init_identity : unit -> Cairo.Matrix.t
      val init_translate : x:float -> y:float -> Cairo.Matrix.t
      val init_scale : x:float -> y:float -> Cairo.Matrix.t
      val init_rotate : angle:float -> Cairo.Matrix.t
      val translate : Cairo.Matrix.t -> x:float -> y:float -> unit
      val scale : Cairo.Matrix.t -> x:float -> y:float -> unit
      val rotate : Cairo.Matrix.t -> angle:float -> unit
      val invert : Cairo.Matrix.t -> unit
      val multiply : Cairo.Matrix.t -> Cairo.Matrix.t -> Cairo.Matrix.t
      val transform_distance :
        Cairo.Matrix.t -> dx:float -> dy:float -> float * float
      val transform_point :
        Cairo.Matrix.t -> x:float -> y:float -> float * float
    end
  type text_extents = {
    x_bearing : float;
    y_bearing : float;
    width : float;
    height : float;
    x_advance : float;
    y_advance : float;
  }
  module Glyph :
    sig
      type t = { index : int; x : float; y : float; }
      type cluster = { num_bytes : int; num_glyphs : int; }
      type cluster_flags = BACKWARD
      val extents :
        Cairo.context -> Cairo.Glyph.t array -> Cairo.text_extents
      val show : Cairo.context -> Cairo.Glyph.t array -> unit
      val show_text :
        Cairo.context ->
        string ->
        Cairo.Glyph.t array ->
        Cairo.Glyph.cluster array -> Cairo.Glyph.cluster_flags -> unit
    end
  type antialias =
      ANTIALIAS_DEFAULT
    | ANTIALIAS_NONE
    | ANTIALIAS_GRAY
    | ANTIALIAS_SUBPIXEL
  type subpixel_order =
      SUBPIXEL_ORDER_DEFAULT
    | SUBPIXEL_ORDER_RGB
    | SUBPIXEL_ORDER_BGR
    | SUBPIXEL_ORDER_VRGB
    | SUBPIXEL_ORDER_VBGR
  type hint_style =
      HINT_STYLE_DEFAULT
    | HINT_STYLE_NONE
    | HINT_STYLE_SLIGHT
    | HINT_STYLE_MEDIUM
    | HINT_STYLE_FULL
  type hint_metrics =
      HINT_METRICS_DEFAULT
    | HINT_METRICS_OFF
    | HINT_METRICS_ON
  module Font_options :
    sig
      type t
      val set : Cairo.context -> Cairo.Font_options.t -> unit
      val get : Cairo.context -> Cairo.Font_options.t
      val create : unit -> Cairo.Font_options.t
      val make :
        ?antialias:Cairo.antialias ->
        ?subpixel_order:Cairo.subpixel_order ->
        ?hint_style:Cairo.hint_style ->
        ?hint_metrics:Cairo.hint_metrics -> unit -> Cairo.Font_options.t
      val copy : Cairo.Font_options.t -> Cairo.Font_options.t
      val merge : Cairo.Font_options.t -> Cairo.Font_options.t -> unit
      val set_antialias : Cairo.Font_options.t -> Cairo.antialias -> unit
      val get_antialias : Cairo.Font_options.t -> Cairo.antialias
      val set_subpixel_order :
        Cairo.Font_options.t -> Cairo.subpixel_order -> unit
      val get_subpixel_order : Cairo.Font_options.t -> Cairo.subpixel_order
      val set_hint_style : Cairo.Font_options.t -> Cairo.hint_style -> unit
      val get_hint_style : Cairo.Font_options.t -> Cairo.hint_style
      val set_hint_metrics :
        Cairo.Font_options.t -> Cairo.hint_metrics -> unit
      val get_hint_metrics : Cairo.Font_options.t -> Cairo.hint_metrics
    end
  type slant = Upright | Italic | Oblique
  type weight = Normal | Bold
  type font_type = [ `Ft | `Quartz | `Toy | `User | `Win32 ]
  module Font_face :
    sig
      type 'a t
      val set : Cairo.context -> 'Cairo.Font_face.t -> unit
      val get : Cairo.context -> Cairo.font_type Cairo.Font_face.t
      val get_type : 'Cairo.Font_face.t -> Cairo.font_type
      val create :
        ?family:string ->
        Cairo.slant -> Cairo.weight -> [ `Toy ] Cairo.Font_face.t
      val get_family : [ `Toy ] Cairo.Font_face.t -> string
      val get_slant : [ `Toy ] Cairo.Font_face.t -> Cairo.slant
      val get_weight : [ `Toy ] Cairo.Font_face.t -> Cairo.weight
    end
  type font_extents = {
    ascent : float;
    descent : float;
    baseline : float;
    max_x_advance : float;
    max_y_advance : float;
  }
  module Scaled_font :
    sig
      type 'a t
      val set : Cairo.context -> 'Cairo.Scaled_font.t -> unit
      val get : Cairo.context -> 'Cairo.Scaled_font.t
      val create :
        'Cairo.Font_face.t ->
        Cairo.Matrix.t ->
        Cairo.Matrix.t -> Cairo.Font_options.t -> 'Cairo.Scaled_font.t
      val extents : 'Cairo.Scaled_font.t -> Cairo.font_extents
      val text_extents :
        'Cairo.Scaled_font.t -> string -> Cairo.text_extents
      val glyph_extents :
        'Cairo.Scaled_font.t -> Cairo.Glyph.t array -> Cairo.text_extents
      val text_to_glyphs :
        'Cairo.Scaled_font.t ->
        x:float ->
        y:float ->
        string ->
        Cairo.Glyph.t array * Cairo.Glyph.cluster array *
        Cairo.Glyph.cluster_flags
      val get_font_face : 'Cairo.Scaled_font.t -> 'Cairo.Font_face.t
      val get_font_options : 'Cairo.Scaled_font.t -> Cairo.Font_options.t
      val get_font_matrix : 'Cairo.Scaled_font.t -> Cairo.Matrix.t
      val get_ctm : 'Cairo.Scaled_font.t -> Cairo.Matrix.t
      val get_scale_matrix : 'Cairo.Scaled_font.t -> Cairo.Matrix.t
      val get_type : 'Cairo.Scaled_font.t -> Cairo.font_type
    end
  val select_font_face :
    Cairo.context ->
    ?slant:Cairo.slant -> ?weight:Cairo.weight -> string -> unit
  val set_font_size : Cairo.context -> float -> unit
  val set_font_matrix : Cairo.context -> Cairo.Matrix.t -> unit
  val get_font_matrix : Cairo.context -> Cairo.Matrix.t
  val show_text : Cairo.context -> string -> unit
  val font_extents : Cairo.context -> Cairo.font_extents
  val text_extents : Cairo.context -> string -> Cairo.text_extents
  type rectangle = { x : float; y : float; w : float; h : float; }
  type content = COLOR | ALPHA | COLOR_ALPHA
  module Surface :
    sig
      type t
      val create_similar :
        Cairo.Surface.t ->
        Cairo.content -> width:int -> height:int -> Cairo.Surface.t
      val finish : Cairo.Surface.t -> unit
      val flush : Cairo.Surface.t -> unit
      val get_font_options : Cairo.Surface.t -> Cairo.Font_options.t
      val get_content : Cairo.Surface.t -> Cairo.content
      val mark_dirty : Cairo.Surface.t -> unit
      val mark_dirty_rectangle :
        Cairo.Surface.t -> x:int -> y:int -> w:int -> h:int -> unit
      val set_device_offset : Cairo.Surface.t -> x:float -> y:float -> unit
      val get_device_offset : Cairo.Surface.t -> float * float
      val set_fallback_resolution :
        Cairo.Surface.t -> x:float -> y:float -> unit
      val get_fallback_resolution : Cairo.Surface.t -> float * float
      type kind =
          [ `BEOS
          | `DirectFB
          | `GLITZ
          | `Image
          | `OS2
          | `PDF
          | `PS
          | `Quartz
          | `Quartz_image
          | `Recording
          | `SVG
          | `Win32
          | `Win32_printing
          | `XCB
          | `XLib ]
      val get_type : Cairo.Surface.t -> Cairo.Surface.kind
      val copy_page : Cairo.Surface.t -> unit
      val show_page : Cairo.Surface.t -> unit
      val has_show_text_glyphs : Cairo.Surface.t -> bool
    end
  module Image :
    sig
      type format = ARGB32 | RGB24 | A8 | A1
      val create :
        Cairo.Image.format -> width:int -> height:int -> Cairo.Surface.t
      type data8 =
          (int, Bigarray.int8_unsigned_elt, Bigarray.c_layout)
          Bigarray.Array1.t
      type data32 =
          (int32, Bigarray.int32_elt, Bigarray.c_layout) Bigarray.Array2.t
      val create_for_data8 :
        Cairo.Image.data8 ->
        Cairo.Image.format -> ?stride:int -> int -> int -> Cairo.Surface.t
      val create_for_data32 :
        ?width:int ->
        ?height:int -> ?alpha:bool -> Cairo.Image.data32 -> Cairo.Surface.t
      val get_data8 : Cairo.Surface.t -> Cairo.Image.data8
      val get_data32 : Cairo.Surface.t -> Cairo.Image.data32
      val get_format : Cairo.Surface.t -> Cairo.Image.format
      val get_width : Cairo.Surface.t -> int
      val get_height : Cairo.Surface.t -> int
      val get_stride : Cairo.Surface.t -> int
      val stride_for_width : Cairo.Image.format -> width:int -> int
      val output_ppm :
        Pervasives.out_channel ->
        ?width:int -> ?height:int -> Cairo.Image.data32 -> unit
    end
  module PDF :
    sig
      val create :
        fname:string -> width:float -> height:float -> Cairo.Surface.t
      val create_for_stream :
        output:(string -> unit) ->
        width:float -> height:float -> Cairo.Surface.t
      val set_size : Cairo.Surface.t -> width:float -> height:float -> unit
    end
  module PNG :
    sig
      val create : string -> Cairo.Surface.t
      val create_from_stream :
        input:(string -> int -> unit) -> Cairo.Surface.t
      val write : Cairo.Surface.t -> string -> unit
      val write_to_stream :
        Cairo.Surface.t -> output:(string -> unit) -> unit
    end
  module PS :
    sig
      val create :
        fname:string -> width:float -> height:float -> Cairo.Surface.t
      val create_for_stream :
        output:(string -> unit) ->
        width:float -> height:float -> Cairo.Surface.t
      type level = LEVEL_2 | LEVEL_3
      val restrict_to_level : Cairo.Surface.t -> Cairo.PS.level -> unit
      val get_levels : unit -> Cairo.PS.level list
      val level_to_string : Cairo.PS.level -> string
      val set_eps : Cairo.Surface.t -> eps:bool -> unit
      val get_eps : Cairo.Surface.t -> bool
      val set_size : Cairo.Surface.t -> width:float -> height:float -> unit
      module Dsc :
        sig
          val begin_setup : Cairo.Surface.t -> unit
          val begin_page_setup : Cairo.Surface.t -> unit
          val comment : Cairo.Surface.t -> string -> unit
        end
    end
  module SVG :
    sig
      val create :
        fname:string -> width:float -> height:float -> Cairo.Surface.t
      val create_for_stream :
        output:(string -> unit) ->
        width:float -> height:float -> Cairo.Surface.t
      type version = VERSION_1_1 | VERSION_1_2
      val restrict_to_version : Cairo.Surface.t -> Cairo.SVG.version -> unit
      val get_versions : unit -> Cairo.SVG.version list
      val version_to_string : Cairo.SVG.version -> string
    end
  module Recording :
    sig
      val create :
        ?extents:Cairo.rectangle -> Cairo.content -> Cairo.Surface.t
      val ink_extents : Cairo.Surface.t -> Cairo.rectangle
    end
  module Pattern :
    sig
      type 'a t
        constraint 'a =
          [< `Gradient | `Linear | `Radial | `Solid | `Surface ]
      type any =
          [ `Gradient | `Linear | `Radial | `Solid | `Surface ]
          Cairo.Pattern.t
      val add_color_stop_rgb :
        [< `Gradient | `Linear | `Radial | `Solid | `Surface > `Gradient ]
        Cairo.Pattern.t -> ?ofs:float -> float -> float -> float -> unit
      val add_color_stop_rgba :
        [< `Gradient | `Linear | `Radial | `Solid | `Surface > `Gradient ]
        Cairo.Pattern.t ->
        ?ofs:float -> float -> float -> float -> float -> unit
      val get_color_stop_count :
        [< `Gradient | `Linear | `Radial | `Solid | `Surface > `Gradient ]
        Cairo.Pattern.t -> int
      val get_color_stop_rgba :
        [< `Gradient | `Linear | `Radial | `Solid | `Surface > `Gradient ]
        Cairo.Pattern.t -> idx:int -> float * float * float * float * float
      val create_rgb :
        r:float -> g:float -> b:float -> [ `Solid ] Cairo.Pattern.t
      val create_rgba :
        r:float ->
        g:float -> b:float -> a:float -> [ `Solid ] Cairo.Pattern.t
      val get_rgba :
        [< `Gradient | `Linear | `Radial | `Solid | `Surface > `Solid ]
        Cairo.Pattern.t -> float * float * float * float
      val create_for_surface :
        Cairo.Surface.t -> [ `Surface ] Cairo.Pattern.t
      val get_surface : [ `Surface ] Cairo.Pattern.t -> Cairo.Surface.t
      val create_linear :
        x0:float ->
        y0:float ->
        x1:float -> y1:float -> [ `Gradient | `Linear ] Cairo.Pattern.t
      val get_linear_points :
        [< `Gradient | `Linear | `Radial | `Solid | `Surface
         > `Gradient `Linear ]
        Cairo.Pattern.t -> float * float * float * float
      val create_radial :
        x0:float ->
        y0:float ->
        r0:float ->
        x1:float ->
        y1:float -> r1:float -> [ `Gradient | `Radial ] Cairo.Pattern.t
      val get_radial_circles :
        [< `Gradient | `Linear | `Radial | `Solid | `Surface
         > `Gradient `Radial ]
        Cairo.Pattern.t -> float * float * float * float * float * float
      type extend = NONE | REPEAT | REFLECT | PAD
      val set_extend :
        [< `Gradient | `Linear | `Radial | `Solid | `Surface ]
        Cairo.Pattern.t -> Cairo.Pattern.extend -> unit
      val get_extend :
        [< `Gradient | `Linear | `Radial | `Solid | `Surface ]
        Cairo.Pattern.t -> Cairo.Pattern.extend
      type filter = FAST | GOOD | BEST | NEAREST | BILINEAR
      val set_filter :
        [< `Gradient | `Linear | `Radial | `Solid | `Surface ]
        Cairo.Pattern.t -> Cairo.Pattern.filter -> unit
      val get_filter :
        [< `Gradient | `Linear | `Radial | `Solid | `Surface ]
        Cairo.Pattern.t -> Cairo.Pattern.filter
      val set_matrix :
        [< `Gradient | `Linear | `Radial | `Solid | `Surface ]
        Cairo.Pattern.t -> Cairo.Matrix.t -> unit
      val get_matrix :
        [< `Gradient | `Linear | `Radial | `Solid | `Surface ]
        Cairo.Pattern.t -> Cairo.Matrix.t
    end
  val create : Cairo.Surface.t -> Cairo.context
  val save : Cairo.context -> unit
  val restore : Cairo.context -> unit
  val get_target : Cairo.context -> Cairo.Surface.t
  module Group :
    sig
      val push : ?content:Cairo.content -> Cairo.context -> unit
      val pop : Cairo.context -> Cairo.Pattern.any
      val pop_to_source : Cairo.context -> unit
      val get_target : Cairo.context -> Cairo.Surface.t
    end
  val set_source_rgb : Cairo.context -> r:float -> g:float -> b:float -> unit
  val set_source_rgba :
    Cairo.context -> r:float -> g:float -> b:float -> a:float -> unit
  val set_source :
    Cairo.context ->
    [< `Gradient | `Linear | `Radial | `Solid | `Surface ] Cairo.Pattern.t ->
    unit
  val set_source_surface :
    Cairo.context -> Cairo.Surface.t -> x:float -> y:float -> unit
  val get_source : Cairo.context -> Cairo.Pattern.any
  val set_antialias : Cairo.context -> Cairo.antialias -> unit
  val get_antialias : Cairo.context -> Cairo.antialias
  val set_dash : Cairo.context -> ?ofs:float -> float array -> unit
  val get_dash : Cairo.context -> float array * float
  type fill_rule = WINDING | EVEN_ODD
  val set_fill_rule : Cairo.context -> Cairo.fill_rule -> unit
  val get_fill_rule : Cairo.context -> Cairo.fill_rule
  type line_cap = BUTT | ROUND | SQUARE
  val set_line_cap : Cairo.context -> Cairo.line_cap -> unit
  val get_line_cap : Cairo.context -> Cairo.line_cap
  type line_join = JOIN_MITER | JOIN_ROUND | JOIN_BEVEL
  val set_line_join : Cairo.context -> Cairo.line_join -> unit
  val get_line_join : Cairo.context -> Cairo.line_join
  val set_line_width : Cairo.context -> float -> unit
  val get_line_width : Cairo.context -> float
  val set_miter_limit : Cairo.context -> float -> unit
  val get_miter_limit : Cairo.context -> float
  type operator =
      CLEAR
    | SOURCE
    | OVER
    | IN
    | OUT
    | ATOP
    | DEST
    | DEST_OVER
    | DEST_IN
    | DEST_OUT
    | DEST_ATOP
    | XOR
    | ADD
    | SATURATE
  val set_operator : Cairo.context -> Cairo.operator -> unit
  val get_operator : Cairo.context -> Cairo.operator
  val set_tolerance : Cairo.context -> float -> unit
  val get_tolerance : Cairo.context -> float
  val clip : Cairo.context -> unit
  val clip_preserve : Cairo.context -> unit
  val clip_extents : Cairo.context -> Cairo.rectangle
  val clip_reset : Cairo.context -> unit
  val clip_rectangle_list : Cairo.context -> Cairo.rectangle list
  val fill : Cairo.context -> unit
  val fill_preserve : Cairo.context -> unit
  val fill_extents : Cairo.context -> Cairo.rectangle
  val in_fill : Cairo.context -> x:float -> y:float -> bool
  val mask :
    Cairo.context ->
    [< `Gradient | `Linear | `Radial | `Solid | `Surface ] Cairo.Pattern.t ->
    unit
  val mask_surface :
    Cairo.context -> Cairo.Surface.t -> x:float -> y:float -> unit
  val paint : ?alpha:float -> Cairo.context -> unit
  val stroke : Cairo.context -> unit
  val stroke_preserve : Cairo.context -> unit
  val stroke_extents : Cairo.context -> Cairo.rectangle
  val in_stroke : Cairo.context -> x:float -> y:float -> bool
  val copy_page : Cairo.context -> unit
  val show_page : Cairo.context -> unit
  type path_data =
      MOVE_TO of float * float
    | LINE_TO of float * float
    | CURVE_TO of float * float * float * float * float * float
    | CLOSE_PATH
  module Path :
    sig
      type t
      val copy : Cairo.context -> Cairo.Path.t
      val copy_flat : Cairo.context -> Cairo.Path.t
      val append : Cairo.context -> Cairo.Path.t -> unit
      val get_current_point : Cairo.context -> float * float
      val clear : Cairo.context -> unit
      val sub : Cairo.context -> unit
      val close : Cairo.context -> unit
      val glyph : Cairo.context -> Cairo.Glyph.t array -> unit
      val text : Cairo.context -> string -> unit
      val extents : Cairo.context -> Cairo.rectangle
      val fold : Cairo.Path.t -> ('-> Cairo.path_data -> 'a) -> '-> 'a
      val to_array : Cairo.Path.t -> Cairo.path_data array
      val of_array : Cairo.path_data array -> Cairo.Path.t
    end
  val arc :
    Cairo.context ->
    x:float -> y:float -> r:float -> a1:float -> a2:float -> unit
  val arc_negative :
    Cairo.context ->
    x:float -> y:float -> r:float -> a1:float -> a2:float -> unit
  val curve_to :
    Cairo.context ->
    x1:float ->
    y1:float -> x2:float -> y2:float -> x3:float -> y3:float -> unit
  val line_to : Cairo.context -> x:float -> y:float -> unit
  val move_to : Cairo.context -> x:float -> y:float -> unit
  val rectangle :
    Cairo.context -> x:float -> y:float -> w:float -> h:float -> unit
  val rel_curve_to :
    Cairo.context ->
    x1:float ->
    y1:float -> x2:float -> y2:float -> x3:float -> y3:float -> unit
  val rel_line_to : Cairo.context -> x:float -> y:float -> unit
  val rel_move_to : Cairo.context -> x:float -> y:float -> unit
  val translate : Cairo.context -> x:float -> y:float -> unit
  val scale : Cairo.context -> x:float -> y:float -> unit
  val rotate : Cairo.context -> angle:float -> unit
  val transform : Cairo.context -> Cairo.Matrix.t -> unit
  val set_matrix : Cairo.context -> Cairo.Matrix.t -> unit
  val get_matrix : Cairo.context -> Cairo.Matrix.t
  val identity_matrix : Cairo.context -> unit
  val user_to_device : Cairo.context -> x:float -> y:float -> float * float
  val user_to_device_distance :
    Cairo.context -> x:float -> y:float -> float * float
  val device_to_user : Cairo.context -> x:float -> y:float -> float * float
  val device_to_user_distance :
    Cairo.context -> x:float -> y:float -> float * float
end