173 lines
5.1 KiB
OCaml
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
|