cpdf-source/old/cpdfgraphics.mli
2023-06-13 14:07:34 +01:00

173 lines
5.1 KiB
OCaml

(** Structured Graphics. This will (eventually) be a module allowing for the raising of a page's contents to a tree form, the manipulation of that tree and its writing back to the page, with no possible loss of fidelity.
It is only a little experiment at the moment... *)
open Pdfutil
open Pdfio
(** Point. *)
type fpoint = float * float
(** Winding rule. *)
type winding_rule = EvenOdd | NonZero
(** A segment (a straight line or bezier curve) *)
type segment =
| Straight of fpoint * fpoint
| Bezier of fpoint * fpoint * fpoint * fpoint
(** Each segment list may be marked as a hole or not. *)
type hole = Hole | Not_hole
(* A [subpath] is either closed or open. *)
type closure = Closed | Open
(** A [subpath] is the pair of a hole and a list of segments. *)
type subpath = hole * closure * segment list
(** A path is made from a number of subpaths. *)
type path = winding_rule * subpath list
val string_of_path : path -> string
(** Colour values *)
type tiling = Tiling
type function_shading =
{funshading_domain : float * float * float * float;
funshading_matrix : Pdftransform.transform_matrix;
funshading_function : Pdffun.t}
type radial_shading =
{radialshading_coords : float * float * float * float * float * float;
radialshading_domain : float * float;
radialshading_function : Pdffun.t list;
radialshading_extend : bool * bool}
type axial_shading =
{axialshading_coords : float * float * float * float;
axialshading_domain : float * float;
axialshading_function : Pdffun.t list;
axialshading_extend : bool * bool}
type shading_kind =
| FunctionShading of function_shading
| AxialShading of axial_shading
| RadialShading of radial_shading
| FreeFormGouraudShading
| LatticeFormGouraudShading
| CoonsPatchMesh
| TensorProductPatchMesh
type shading =
{shading_colourspace : Pdf.pdfobject;
shading_background : Pdf.pdfobject option;
shading_bbox : Pdf.pdfobject option;
shading_antialias : bool;
shading_matrix : Pdftransform.transform_matrix;
shading_extgstate : Pdf.pdfobject;
shading : shading_kind}
type pattern =
| ColouredTilingPattern of tiling
| UncolouredTilingPattern of tiling
| ShadingPattern of shading
type colvals =
| Floats of float list
| Named of (string * float list)
| Pattern of pattern
type transparency_attributes =
{fill_transparency : float;
line_transparency : float}
(** Path attributes. *)
type path_attributes =
{path_transform : Pdftransform.transform_matrix;
path_fill : (Pdfspace.t * colvals) option;
path_line : (Pdfspace.t * colvals) option;
path_linewidth : float;
path_joinstyle : int;
path_capstyle : int;
path_dash : float list * float;
path_mitrelimit : float;
path_transparency : transparency_attributes;
path_intent : string}
type text_attributes =
{textmode : int}
type textblock_attributes =
{textblock_transform : Pdftransform.transform_matrix}
type textblock =
text_attributes * Pdfops.t
type image_attributes =
{image_transform : Pdftransform.transform_matrix;
image_transparency : float;
image_softmask : softmask option} (* The /ca value *)
and softmask_subtype =
Alpha | Luminosity
and transparency_group =
{tr_group_colourspace : Pdf.pdfobject option;
isolated : bool;
knockout : bool;
tr_graphic : t}
and softmask =
{softmask_subtype : softmask_subtype;
transparency_group : transparency_group;
softmask_bbox : float * float * float * float;
backdrop : float list option;
softmask_transfer : Pdffun.t option}
and fontname = string * Pdf.pdfobject
(** For now, just support for reading paths out. Eventually a tree-structure for
an op stream. *)
and graphic_elt =
| Path of (path * path_attributes)
| Text of textblock list * textblock_attributes
| MCPoint of string
| MCPointProperties of string * Pdf.pdfobject
| MCSection of string * graphic_elt list
| MCSectionProperties of string * Pdf.pdfobject * graphic_elt list
| Image of image_attributes * int
| GraphicInlineImage of Pdf.pdfobject * bytes * Pdftransform.transform_matrix
| Clip of path * graphic_elt list
| Shading of path option * shading * Pdftransform.transform_matrix
and t =
{elements : graphic_elt list; (* Page content *)
fonts : fontname list; (* Fonts *)
resources : Pdf.pdfobject} (* Anything else in /Resources *)
(** Bounding box xmin, xmax, ymin, yman of a graphic *)
val bbox_of_graphic : t -> float * float * float * float
(** Make a graphic from operations. *)
val graphic_of_page : Pdf.t -> Pdfpage.t -> t
(** Make a graphic from a simple string. *)
val graphic_of_ops : Pdfops.t list -> t
(** Flatten a graphic to a list of operations and replace the operations in a
page by them, returning the new page. *)
val page_of_graphic : Pdf.t -> (float * float * float * float) -> t -> Pdfpage.t
(** Debug string of a [graphic] *)
val string_of_graphic : t -> string
(** Operations from a simple graphic (i.e no need for resources etc.) *)
val ops_of_simple_graphic : t -> Pdfops.t list
(** Pdfdoc.content entry from a simple graphic (i.e no need for resources etc.) *)
val streams_of_simple_graphic : t -> Pdf.pdfobject list
(** Transform a graphic by a matrix. *)
val transform_graphic : Pdftransform.transform_matrix -> t -> t