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
  exception Error of Cairo.status
  external status_to_string : Cairo.status -> string
    = "caml_cairo_status_to_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
      external extents :
        Cairo.context -> Cairo.Glyph.t array -> Cairo.text_extents
        = "caml_cairo_glyph_extents"
      external show : Cairo.context -> Cairo.Glyph.t array -> unit
        = "caml_cairo_show_glyphs"
      external show_text :
        Cairo.context ->
        string ->
        Cairo.Glyph.t array ->
        Cairo.Glyph.cluster array -> Cairo.Glyph.cluster_flags -> unit
        = "caml_cairo_show_text_glyphs"
    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
      external set : Cairo.context -> Cairo.Font_options.t -> unit
        = "caml_cairo_set_font_options"
      external get : Cairo.context -> Cairo.Font_options.t
        = "caml_cairo_get_font_options"
      external create : unit -> Cairo.Font_options.t
        = "caml_cairo_font_options_create"
      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
      external copy : Cairo.Font_options.t -> Cairo.Font_options.t
        = "caml_cairo_font_options_copy"
      external merge : Cairo.Font_options.t -> Cairo.Font_options.t -> unit
        = "caml_cairo_font_options_merge"
      external set_antialias :
        Cairo.Font_options.t -> Cairo.antialias -> unit
        = "caml_cairo_font_options_set_antialias"
      external get_antialias : Cairo.Font_options.t -> Cairo.antialias
        = "caml_cairo_font_options_get_antialias"
      external set_subpixel_order :
        Cairo.Font_options.t -> Cairo.subpixel_order -> unit
        = "caml_cairo_font_options_set_subpixel_order"
      external get_subpixel_order :
        Cairo.Font_options.t -> Cairo.subpixel_order
        = "caml_cairo_font_options_get_subpixel_order"
      external set_hint_style :
        Cairo.Font_options.t -> Cairo.hint_style -> unit
        = "caml_cairo_font_options_set_hint_style"
      external get_hint_style : Cairo.Font_options.t -> Cairo.hint_style
        = "caml_cairo_font_options_get_hint_style"
      external set_hint_metrics :
        Cairo.Font_options.t -> Cairo.hint_metrics -> unit
        = "caml_cairo_font_options_set_hint_metrics"
      external get_hint_metrics : Cairo.Font_options.t -> Cairo.hint_metrics
        = "caml_cairo_font_options_get_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
      external set : Cairo.context -> 'Cairo.Font_face.t -> unit
        = "caml_cairo_set_font_face"
      external get : Cairo.context -> Cairo.font_type Cairo.Font_face.t
        = "caml_cairo_get_font_face"
      external get_type : 'Cairo.Font_face.t -> Cairo.font_type
        = "caml_cairo_font_face_get_type"
      val create :
        ?family:string ->
        Cairo.slant -> Cairo.weight -> [ `Toy ] Cairo.Font_face.t
      external get_family : [ `Toy ] Cairo.Font_face.t -> string
        = "caml_cairo_toy_font_face_get_family"
      external get_slant : [ `Toy ] Cairo.Font_face.t -> Cairo.slant
        = "caml_cairo_toy_font_face_get_slant"
      external get_weight : [ `Toy ] Cairo.Font_face.t -> Cairo.weight
        = "caml_cairo_toy_font_face_get_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
      external set : Cairo.context -> 'Cairo.Scaled_font.t -> unit
        = "caml_cairo_set_scaled_font"
      external get : Cairo.context -> 'Cairo.Scaled_font.t
        = "caml_cairo_get_scaled_font"
      val create :
        'Cairo.Font_face.t ->
        Cairo.Matrix.t ->
        Cairo.Matrix.t -> Cairo.Font_options.t -> 'Cairo.Scaled_font.t
      external extents : 'Cairo.Scaled_font.t -> Cairo.font_extents
        = "caml_cairo_scaled_font_extents"
      external text_extents :
        'Cairo.Scaled_font.t -> string -> Cairo.text_extents
        = "caml_cairo_scaled_font_text_extents"
      external glyph_extents :
        'Cairo.Scaled_font.t -> Cairo.Glyph.t array -> Cairo.text_extents
        = "caml_cairo_scaled_font_glyph_extents"
      external text_to_glyphs :
        'Cairo.Scaled_font.t ->
        x:float ->
        y:float ->
        string ->
        Cairo.Glyph.t array * Cairo.Glyph.cluster array *
        Cairo.Glyph.cluster_flags = "caml_cairo_scaled_font_text_to_glyphs"
      external get_font_face : 'Cairo.Scaled_font.t -> 'Cairo.Font_face.t
        = "caml_cairo_scaled_font_get_font_face"
      external get_font_options :
        'Cairo.Scaled_font.t -> Cairo.Font_options.t
        = "caml_cairo_scaled_font_get_font_options"
      external get_font_matrix : 'Cairo.Scaled_font.t -> Cairo.Matrix.t
        = "caml_cairo_scaled_font_get_font_matrix"
      external get_ctm : 'Cairo.Scaled_font.t -> Cairo.Matrix.t
        = "caml_cairo_scaled_font_get_ctm"
      external get_scale_matrix : 'Cairo.Scaled_font.t -> Cairo.Matrix.t
        = "caml_cairo_scaled_font_get_scale_matrix"
      external get_type : 'Cairo.Scaled_font.t -> Cairo.font_type
        = "caml_cairo_scaled_font_get_type"
    end
  val select_font_face :
    Cairo.context ->
    ?slant:Cairo.slant -> ?weight:Cairo.weight -> string -> unit
  external set_font_size : Cairo.context -> float -> unit
    = "caml_cairo_set_font_size"
  external set_font_matrix : Cairo.context -> Cairo.Matrix.t -> unit
    = "caml_cairo_set_font_matrix"
  external get_font_matrix : Cairo.context -> Cairo.Matrix.t
    = "caml_cairo_get_font_matrix"
  external show_text : Cairo.context -> string -> unit
    = "caml_cairo_show_text"
  external font_extents : Cairo.context -> Cairo.font_extents
    = "caml_cairo_font_extents"
  external text_extents : Cairo.context -> string -> Cairo.text_extents
    = "caml_cairo_text_extents"
  type content = COLOR | ALPHA | COLOR_ALPHA
  module Surface :
    sig
      type t
      external create_similar :
        Cairo.Surface.t ->
        Cairo.content -> width:int -> height:int -> Cairo.Surface.t
        = "caml_cairo_surface_create_similar"
      external finish : Cairo.Surface.t -> unit = "caml_cairo_surface_finish"
      external flush : Cairo.Surface.t -> unit = "caml_cairo_surface_flush"
      external get_font_options : Cairo.Surface.t -> Cairo.Font_options.t
        = "caml_cairo_surface_get_font_options"
      external get_content : Cairo.Surface.t -> Cairo.content
        = "caml_cairo_surface_get_content"
      external mark_dirty : Cairo.Surface.t -> unit
        = "caml_cairo_surface_mark_dirty"
      external mark_dirty_rectangle :
        Cairo.Surface.t -> x:int -> y:int -> w:int -> h:int -> unit
        = "caml_cairo_surface_mark_dirty_rectangle"
      external set_device_offset :
        Cairo.Surface.t -> x:float -> y:float -> unit
        = "caml_cairo_surface_set_device_offset"
      external get_device_offset : Cairo.Surface.t -> float * float
        = "caml_cairo_surface_get_device_offset"
      external set_fallback_resolution :
        Cairo.Surface.t -> x:float -> y:float -> unit
        = "caml_cairo_surface_set_fallback_resolution"
      external get_fallback_resolution : Cairo.Surface.t -> float * float
        = "caml_cairo_surface_get_fallback_resolution"
      type kind =
          [ `BEOS
          | `DirectFB
          | `GLITZ
          | `Image
          | `OS2
          | `PDF
          | `PS
          | `Quartz
          | `Quartz_image
          | `SVG
          | `Win32
          | `Win32_printing
          | `XCB
          | `XLib ]
      external get_type : Cairo.Surface.t -> Cairo.Surface.kind
        = "caml_cairo_surface_get_type"
      external copy_page : Cairo.Surface.t -> unit
        = "caml_cairo_surface_copy_page"
      external show_page : Cairo.Surface.t -> unit
        = "caml_cairo_surface_show_page"
      external has_show_text_glyphs : Cairo.Surface.t -> bool
        = "caml_cairo_surface_has_show_text_glyphs"
    end
  module Image :
    sig
      type format = ARGB32 | RGB24 | A8 | A1
      external create :
        Cairo.Image.format -> width:int -> height:int -> Cairo.Surface.t
        = "caml_cairo_image_surface_create"
      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
      external get_format : Cairo.Surface.t -> Cairo.Image.format
        = "caml_cairo_image_surface_get_format"
      external get_width : Cairo.Surface.t -> int
        = "caml_cairo_image_surface_get_width"
      external get_height : Cairo.Surface.t -> int
        = "caml_cairo_image_surface_get_height"
      external get_stride : Cairo.Surface.t -> int
        = "caml_cairo_image_surface_get_stride"
      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
      external set_size :
        Cairo.Surface.t -> width:float -> height:float -> unit
        = "caml_cairo_pdf_surface_set_size" "noalloc"
    end
  module PNG :
    sig
      external create : string -> Cairo.Surface.t
        = "caml_cairo_image_surface_create_from_png"
      external create_from_stream :
        input:(string -> int -> unit) -> Cairo.Surface.t
        = "caml_cairo_image_surface_create_from_png_stream"
      external write : Cairo.Surface.t -> string -> unit
        = "caml_cairo_surface_write_to_png"
      external write_to_stream :
        Cairo.Surface.t -> output:(string -> unit) -> unit
        = "caml_cairo_surface_write_to_png_stream"
    end
  module PS :
    sig
      external create :
        fname:string -> width:float -> height:float -> Cairo.Surface.t
        = "caml_cairo_ps_surface_create"
      external create_for_stream :
        output:(string -> unit) ->
        width:float -> height:float -> Cairo.Surface.t
        = "caml_cairo_ps_surface_create_for_stream"
      type level = LEVEL_2 | LEVEL_3
      external restrict_to_level : Cairo.Surface.t -> Cairo.PS.level -> unit
        = "caml_cairo_ps_surface_restrict_to_level"
      external get_levels : unit -> Cairo.PS.level list
        = "caml_cairo_ps_get_levels"
      external level_to_string : Cairo.PS.level -> string
        = "caml_cairo_ps_level_to_string"
      external set_eps : Cairo.Surface.t -> eps:bool -> unit
        = "caml_cairo_ps_surface_set_eps"
      external get_eps : Cairo.Surface.t -> bool
        = "caml_cairo_ps_surface_get_eps"
      external set_size :
        Cairo.Surface.t -> width:float -> height:float -> unit
        = "caml_cairo_ps_surface_set_size"
      module Dsc :
        sig
          external begin_setup : Cairo.Surface.t -> unit
            = "caml_cairo_ps_surface_dsc_begin_setup"
          external begin_page_setup : Cairo.Surface.t -> unit
            = "caml_cairo_ps_surface_dsc_begin_page_setup"
          external comment : Cairo.Surface.t -> string -> unit
            = "caml_cairo_ps_surface_dsc_comment"
        end
    end
  module SVG :
    sig
      external create :
        fname:string -> width:float -> height:float -> Cairo.Surface.t
        = "caml_cairo_svg_surface_create"
      external create_for_stream :
        output:(string -> unit) ->
        width:float -> height:float -> Cairo.Surface.t
        = "caml_cairo_svg_surface_create_for_stream"
      type version = VERSION_1_1 | VERSION_1_2
      external restrict_to_version :
        Cairo.Surface.t -> Cairo.SVG.version -> unit
        = "caml_cairo_svg_surface_restrict_to_version"
      external get_versions : unit -> Cairo.SVG.version list
        = "caml_cairo_svg_get_versions"
      external version_to_string : Cairo.SVG.version -> string
        = "caml_cairo_svg_version_to_string"
    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
      external get_color_stop_count :
        [< `Gradient | `Linear | `Radial | `Solid | `Surface > `Gradient ]
        Cairo.Pattern.t -> int = "caml_cairo_pattern_get_color_stop_count"
      val get_color_stop_rgba :
        [< `Gradient | `Linear | `Radial | `Solid | `Surface > `Gradient ]
        Cairo.Pattern.t -> idx:int -> float * float * float * float * float
      external create_rgb :
        r:float -> g:float -> b:float -> [ `Solid ] Cairo.Pattern.t
        = "caml_cairo_pattern_create_rgb"
      external create_rgba :
        r:float ->
        g:float -> b:float -> a:float -> [ `Solid ] Cairo.Pattern.t
        = "caml_cairo_pattern_create_rgba"
      external get_rgba :
        [< `Gradient | `Linear | `Radial | `Solid | `Surface > `Solid ]
        Cairo.Pattern.t -> float * float * float * float
        = "caml_cairo_pattern_get_rgba"
      external create_for_surface :
        Cairo.Surface.t -> [ `Surface ] Cairo.Pattern.t
        = "caml_cairo_pattern_create_for_surface"
      external get_surface : [ `Surface ] Cairo.Pattern.t -> Cairo.Surface.t
        = "caml_cairo_pattern_get_surface"
      external create_linear :
        x0:float ->
        y0:float ->
        x1:float -> y1:float -> [ `Gradient | `Linear ] Cairo.Pattern.t
        = "caml_cairo_pattern_create_linear"
      external get_linear_points :
        [< `Gradient | `Linear | `Radial | `Solid | `Surface
         > `Gradient `Linear ]
        Cairo.Pattern.t -> float * float * float * float
        = "caml_cairo_pattern_get_linear_points"
      external create_radial :
        x0:float ->
        y0:float ->
        r0:float ->
        x1:float ->
        y1:float -> r1:float -> [ `Gradient | `Radial ] Cairo.Pattern.t
        = "caml_cairo_pattern_create_radial_bc"
        "caml_cairo_pattern_create_radial"
      external get_radial_circles :
        [< `Gradient | `Linear | `Radial | `Solid | `Surface
         > `Gradient `Radial ]
        Cairo.Pattern.t -> float * float * float * float * float * float
        = "caml_cairo_pattern_get_radial_circles"
      type extend = NONE | REPEAT | REFLECT | PAD
      external set_extend :
        [< `Gradient | `Linear | `Radial | `Solid | `Surface ]
        Cairo.Pattern.t -> Cairo.Pattern.extend -> unit
        = "caml_cairo_pattern_set_extend" "noalloc"
      external get_extend :
        [< `Gradient | `Linear | `Radial | `Solid | `Surface ]
        Cairo.Pattern.t -> Cairo.Pattern.extend
        = "caml_cairo_pattern_get_extend"
      type filter = FAST | GOOD | BEST | NEAREST | BILINEAR
      external set_filter :
        [< `Gradient | `Linear | `Radial | `Solid | `Surface ]
        Cairo.Pattern.t -> Cairo.Pattern.filter -> unit
        = "caml_cairo_pattern_set_filter" "noalloc"
      external get_filter :
        [< `Gradient | `Linear | `Radial | `Solid | `Surface ]
        Cairo.Pattern.t -> Cairo.Pattern.filter
        = "caml_cairo_pattern_get_filter"
      external set_matrix :
        [< `Gradient | `Linear | `Radial | `Solid | `Surface ]
        Cairo.Pattern.t -> Cairo.Matrix.t -> unit
        = "caml_cairo_pattern_set_matrix" "noalloc"
      external get_matrix :
        [< `Gradient | `Linear | `Radial | `Solid | `Surface ]
        Cairo.Pattern.t -> Cairo.Matrix.t = "caml_cairo_pattern_get_matrix"
    end
  external create : Cairo.Surface.t -> Cairo.context = "caml_cairo_create"
  external save : Cairo.context -> unit = "caml_cairo_save"
  external restore : Cairo.context -> unit = "caml_cairo_restore"
  external get_target : Cairo.context -> Cairo.Surface.t
    = "caml_cairo_get_target"
  module Group :
    sig
      val push : ?content:Cairo.content -> Cairo.context -> unit
      external pop : Cairo.context -> Cairo.Pattern.any
        = "caml_cairo_pop_group"
      external pop_to_source : Cairo.context -> unit
        = "caml_cairo_pop_group_to_source"
      external get_target : Cairo.context -> Cairo.Surface.t
        = "caml_cairo_get_group_target"
    end
  external set_source_rgb :
    Cairo.context -> r:float -> g:float -> b:float -> unit
    = "caml_cairo_set_source_rgb"
  external set_source_rgba :
    Cairo.context -> r:float -> g:float -> b:float -> a:float -> unit
    = "caml_cairo_set_source_rgba"
  external set_source :
    Cairo.context ->
    [< `Gradient | `Linear | `Radial | `Solid | `Surface ] Cairo.Pattern.t ->
    unit = "caml_cairo_set_source"
  external set_source_surface :
    Cairo.context -> Cairo.Surface.t -> x:float -> y:float -> unit
    = "caml_cairo_set_source_surface"
  external get_source : Cairo.context -> Cairo.Pattern.any
    = "caml_cairo_get_source"
  external set_antialias : Cairo.context -> Cairo.antialias -> unit
    = "caml_cairo_set_antialias"
  external get_antialias : Cairo.context -> Cairo.antialias
    = "caml_cairo_get_antialias"
  val set_dash : Cairo.context -> ?ofs:float -> float array -> unit
  external get_dash : Cairo.context -> float array * float
    = "caml_cairo_get_dash"
  type fill_rule = WINDING | EVEN_ODD
  external set_fill_rule : Cairo.context -> Cairo.fill_rule -> unit
    = "caml_cairo_set_fill_rule"
  external get_fill_rule : Cairo.context -> Cairo.fill_rule
    = "caml_cairo_get_fill_rule"
  type line_cap = BUTT | ROUND | SQUARE
  external set_line_cap : Cairo.context -> Cairo.line_cap -> unit
    = "caml_cairo_set_line_cap"
  external get_line_cap : Cairo.context -> Cairo.line_cap
    = "caml_cairo_get_line_cap"
  type line_join = JOIN_MITER | JOIN_ROUND | JOIN_BEVEL
  external set_line_join : Cairo.context -> Cairo.line_join -> unit
    = "caml_cairo_set_line_join"
  external get_line_join : Cairo.context -> Cairo.line_join
    = "caml_cairo_get_line_join"
  external set_line_width : Cairo.context -> float -> unit
    = "caml_cairo_set_line_width"
  external get_line_width : Cairo.context -> float
    = "caml_cairo_get_line_width"
  external set_miter_limit : Cairo.context -> float -> unit
    = "caml_cairo_set_miter_limit"
  external get_miter_limit : Cairo.context -> float
    = "caml_cairo_get_miter_limit"
  type operator =
      CLEAR
    | SOURCE
    | OVER
    | IN
    | OUT
    | ATOP
    | DEST
    | DEST_OVER
    | DEST_IN
    | DEST_OUT
    | DEST_ATOP
    | XOR
    | ADD
    | SATURATE
  external set_operator : Cairo.context -> Cairo.operator -> unit
    = "caml_cairo_set_operator"
  external get_operator : Cairo.context -> Cairo.operator
    = "caml_cairo_get_operator"
  external set_tolerance : Cairo.context -> float -> unit
    = "caml_cairo_set_tolerance"
  external get_tolerance : Cairo.context -> float
    = "caml_cairo_get_tolerance"
  type rectangle = { x : float; y : float; w : float; h : float; }
  external clip : Cairo.context -> unit = "caml_cairo_clip"
  external clip_preserve : Cairo.context -> unit = "caml_cairo_clip_preserve"
  external clip_extents : Cairo.context -> Cairo.rectangle
    = "caml_cairo_clip_extents"
  external clip_reset : Cairo.context -> unit = "caml_cairo_reset_clip"
  external clip_rectangle_list : Cairo.context -> Cairo.rectangle list
    = "caml_cairo_copy_clip_rectangle_list"
  external fill : Cairo.context -> unit = "caml_cairo_fill"
  external fill_preserve : Cairo.context -> unit = "caml_cairo_fill_preserve"
  external fill_extents : Cairo.context -> Cairo.rectangle
    = "caml_cairo_fill_extents"
  external in_fill : Cairo.context -> x:float -> y:float -> bool
    = "caml_cairo_in_fill"
  external mask :
    Cairo.context ->
    [< `Gradient | `Linear | `Radial | `Solid | `Surface ] Cairo.Pattern.t ->
    unit = "caml_cairo_mask"
  external mask_surface :
    Cairo.context -> Cairo.Surface.t -> x:float -> y:float -> unit
    = "caml_cairo_mask_surface"
  val paint : ?alpha:float -> Cairo.context -> unit
  external stroke : Cairo.context -> unit = "caml_cairo_stroke"
  external stroke_preserve : Cairo.context -> unit
    = "caml_cairo_stroke_preserve"
  val stroke_extents : Cairo.context -> Cairo.rectangle
  external in_stroke : Cairo.context -> x:float -> y:float -> bool
    = "caml_cairo_in_stroke"
  external copy_page : Cairo.context -> unit = "caml_cairo_copy_page"
  external show_page : Cairo.context -> unit = "caml_cairo_show_page"
  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
      external copy : Cairo.context -> Cairo.Path.t = "caml_cairo_copy_path"
      external copy_flat : Cairo.context -> Cairo.Path.t
        = "caml_cairo_copy_path_flat"
      external append : Cairo.context -> Cairo.Path.t -> unit
        = "caml_cairo_append_path"
      external get_current_point : Cairo.context -> float * float
        = "caml_cairo_get_current_point"
      external clear : Cairo.context -> unit = "caml_cairo_new_path"
      external sub : Cairo.context -> unit = "caml_cairo_new_sub_path"
      external close : Cairo.context -> unit = "caml_cairo_close_path"
      external glyph : Cairo.context -> Cairo.Glyph.t array -> unit
        = "caml_cairo_glyph_path"
      external text : Cairo.context -> string -> unit
        = "caml_cairo_text_path"
      external extents : Cairo.context -> Cairo.rectangle
        = "caml_cairo_path_extents"
      external fold :
        Cairo.Path.t -> ('-> Cairo.path_data -> 'a) -> '-> 'a
        = "caml_cairo_path_fold"
      val to_array : Cairo.Path.t -> Cairo.path_data array
      val of_array : Cairo.path_data array -> Cairo.Path.t
    end
  external arc :
    Cairo.context ->
    x:float -> y:float -> r:float -> a1:float -> a2:float -> unit
    = "caml_cairo_arc_bc" "caml_cairo_arc"
  external arc_negative :
    Cairo.context ->
    x:float -> y:float -> r:float -> a1:float -> a2:float -> unit
    = "caml_cairo_arc_negative_bc" "caml_cairo_arc_negative"
  external curve_to :
    Cairo.context ->
    x1:float ->
    y1:float -> x2:float -> y2:float -> x3:float -> y3:float -> unit
    = "caml_cairo_curve_to_bc" "caml_cairo_curve_to"
  external line_to : Cairo.context -> x:float -> y:float -> unit
    = "caml_cairo_line_to"
  external move_to : Cairo.context -> x:float -> y:float -> unit
    = "caml_cairo_move_to"
  external rectangle :
    Cairo.context -> x:float -> y:float -> w:float -> h:float -> unit
    = "caml_cairo_rectangle"
  external rel_curve_to :
    Cairo.context ->
    x1:float ->
    y1:float -> x2:float -> y2:float -> x3:float -> y3:float -> unit
    = "caml_cairo_rel_curve_to_bc" "caml_cairo_rel_curve_to"
  external rel_line_to : Cairo.context -> x:float -> y:float -> unit
    = "caml_cairo_rel_line_to"
  external rel_move_to : Cairo.context -> x:float -> y:float -> unit
    = "caml_cairo_rel_move_to"
  external translate : Cairo.context -> x:float -> y:float -> unit
    = "caml_cairo_translate"
  external scale : Cairo.context -> x:float -> y:float -> unit
    = "caml_cairo_scale"
  external rotate : Cairo.context -> angle:float -> unit
    = "caml_cairo_rotate"
  external transform : Cairo.context -> Cairo.Matrix.t -> unit
    = "caml_cairo_transform" "noalloc"
  external set_matrix : Cairo.context -> Cairo.Matrix.t -> unit
    = "caml_cairo_set_matrix" "noalloc"
  external get_matrix : Cairo.context -> Cairo.Matrix.t
    = "caml_cairo_get_matrix"
  external identity_matrix : Cairo.context -> unit
    = "caml_cairo_identity_matrix"
  external user_to_device :
    Cairo.context -> x:float -> y:float -> float * float
    = "caml_cairo_user_to_device"
  external user_to_device_distance :
    Cairo.context -> x:float -> y:float -> float * float
    = "caml_cairo_user_to_device_distance"
  external device_to_user :
    Cairo.context -> x:float -> y:float -> float * float
    = "caml_cairo_device_to_user"
  external device_to_user_distance :
    Cairo.context -> x:float -> y:float -> float * float
    = "caml_cairo_device_to_user_distance"
end