sig
  type segment =
      [ `Ccurve of Gg.p2 * Gg.p2 * Gg.p2
      | `Close
      | `Earc of bool * bool * float * Gg.size2 * Gg.p2
      | `Line of Gg.p2
      | `Qcurve of Gg.p2 * Gg.p2
      | `Sub of Gg.p2 ]
  type path = Vg.Vgr.Private.Data.segment list
  val of_path : Vg.P.t -> Vg.Vgr.Private.Data.path
  type tr = Move of Gg.v2 | Rot of float | Scale of Gg.v2 | Matrix of Gg.m3
  val tr_to_m3 : Vg.Vgr.Private.Data.tr -> Gg.M3.t
  val inv_tr_to_m3 : Vg.Vgr.Private.Data.tr -> Gg.M3.t
  type blender = [ `Atop | `Copy | `In | `Out | `Over | `Plus | `Xor ]
  type primitive =
      Const of Gg.color
    | Axial of Gg.Color.stops * Gg.p2 * Gg.p2
    | Radial of Gg.Color.stops * Gg.p2 * Gg.p2 * float
    | Raster of Gg.box2 * Gg.raster
  type glyph_run = {
    font : Vg.font;
    text : string option;
    o : Gg.p2;
    blocks : bool * (int * int) list;
    advances : Gg.v2 list;
    glyphs : Vg.glyph list;
  }
  type image =
      Primitive of Vg.Vgr.Private.Data.primitive
    | Cut of Vg.P.area * Vg.Vgr.Private.Data.path * Vg.Vgr.Private.Data.image
    | Cut_glyphs of Vg.P.area * Vg.Vgr.Private.Data.glyph_run *
        Vg.Vgr.Private.Data.image
    | Blend of Vg.Vgr.Private.Data.blender * float option *
        Vg.Vgr.Private.Data.image * Vg.Vgr.Private.Data.image
    | Tr of Vg.Vgr.Private.Data.tr * Vg.Vgr.Private.Data.image
  val of_image : Vg.I.t -> Vg.Vgr.Private.Data.image
end