sig
  type transform_op =
      Scale of (float * float) * float * float
    | Rotate of (float * float) * float
    | Translate of float * float
    | ShearX of (float * float) * float
    | ShearY of (float * float) * float
  type transform = Transform.transform_op list
  val i : Transform.transform
  val string_of_transform : Transform.transform -> string
  type transform_matrix = {
    a : float;
    b : float;
    c : float;
    d : float;
    e : float;
    f : float;
  }
  val i_matrix : Transform.transform_matrix
  val string_of_matrix : Transform.transform_matrix -> string
  val mktranslate : float -> float -> Transform.transform_matrix
  val mkscale : float * float -> float -> float -> Transform.transform_matrix
  val mkrotate : float * float -> float -> Transform.transform_matrix
  val mkshearx : float * float -> float -> Transform.transform_matrix
  val mksheary : float * float -> float -> Transform.transform_matrix
  val compose :
    Transform.transform_op -> Transform.transform -> Transform.transform
  val append :
    Transform.transform -> Transform.transform -> Transform.transform
  val matrix_compose :
    Transform.transform_matrix ->
    Transform.transform_matrix -> Transform.transform_matrix
  exception NonInvertable
  val matrix_invert :
    Transform.transform_matrix -> Transform.transform_matrix
  val transform : Transform.transform -> float * float -> float * float
  val transform_matrix :
    Transform.transform_matrix -> float * float -> float * float
  val matrix_of_op : Transform.transform_op -> Transform.transform_matrix
  val matrix_of_transform : Transform.transform -> Transform.transform_matrix
  val decompose :
    Transform.transform_matrix ->
    float * float * float * float * float * float
  val recompose :
    float ->
    float -> float -> float -> float -> float -> Transform.transform_matrix
end