Portability | GHC |
---|---|
Stability | highly unstable |
Maintainer | Stephen Tetley <stephen.tetley@gmail.com> |
Common interface to Wumpus.Core...
- module Wumpus.Core.AffineTrans
- module Wumpus.Core.BoundingBox
- module Wumpus.Core.Colour
- module Wumpus.Core.FontSize
- module Wumpus.Core.Geometry
- module Wumpus.Core.GraphicsState
- module Wumpus.Core.OutputPostScript
- module Wumpus.Core.OutputSVG
- module Wumpus.Core.Picture
- module Wumpus.Core.PictureLanguage
- module Wumpus.Core.TextEncoding
- data Picture u
- type DPicture = Picture Double
- data Primitive u
- type DPrimitive = Primitive Double
- data Path u
- type DPath = Path Double
- data PathSegment u
- type DPathSegment = PathSegment Double
- data Label u
- type DLabel = Label Double
- type PathProps = (PSRgb, DrawPath)
- type LabelProps = (PSRgb, FontAttr)
- type EllipseProps = (PSRgb, DrawEllipse)
- data DrawPath
- data DrawEllipse
Documentation
module Wumpus.Core.AffineTrans
module Wumpus.Core.BoundingBox
module Wumpus.Core.Colour
module Wumpus.Core.FontSize
module Wumpus.Core.Geometry
module Wumpus.Core.GraphicsState
module Wumpus.Core.OutputPostScript
module Wumpus.Core.OutputSVG
module Wumpus.Core.Picture
module Wumpus.Core.PictureLanguage
module Wumpus.Core.TextEncoding
Picture is a leaf attributed tree - where atttibutes are colour, line-width etc. It is parametric on the unit type of points (typically Double).
Wumpus's Picture, being a leaf attributed tree, is not ideally matched to PostScript's picture representation, which might be considered a node attributed tree if you recast graphics state updates as syntactic commands encountered during top-down evaluation.
Currently this mismatch means that the PostScript code
generated by Wumpus has significant overuse of PostScript's
gsave
and grestore
.
At some point a tree-rewriting step might be added to coalesce some of the repeated graphics state updates.
Apropos the constructors, Picture is a simple non-empty leaf-labelled rose tree via
Single (aka leaf) | Picture (OneList tree)
Where OneList is a variant of the standard list type that disallows empty lists.
The additional constructors are convenience:
PickBlank
has a bounding box but no content and is useful for
some picture language operations (e.g. hsep
).
Clip
nests a picture (tree) inside a clipping path.
Eq u => Eq (Picture u) | |
Show u => Show (Picture u) | |
(Num u, Pretty u) => Pretty (Picture u) | |
Num u => Blank (Picture u) | |
(Num u, Ord u, Horizontal (Picture u), Vertical (Picture u)) => Move (Picture u) | |
(Num u, Ord u) => Composite (Picture u) | |
(Num u, Ord u) => Vertical (Picture u) | |
(Num u, Ord u) => Horizontal (Picture u) | |
(Num u, Ord u) => Translate (Picture u) | |
(Num u, Ord u) => Scale (Picture u) | |
(Floating u, Real u) => RotateAbout (Picture u) | |
(Floating u, Real u) => Rotate (Picture u) | |
Boundary (Picture u) |
Wumpus's drawings are built from two fundamental primitives: paths (line segments and Bezier curves) and labels (single lines of text).
Ellipses are a included as a primitive only for optimization
- drawing a reasonable circle with Bezier curves needs at
least eight curves. This is inconvenient for drawing dots
which can otherwise be drawn with a single arc
command.
Wumpus does not follow PostScript and employ arcs as general path primitives - they are used only to draw ellipses. This is because arcs do not enjoy the nice properties of Bezier curves, whereby the affine transformation of a Bezier curve can simply be achieved by the affine transformation of it's control points.
Ellipses are represented by their center, half-width and half-height. Half-width and half-height are used so the bounding box can be calculated using only multiplication, and thus initially only obliging a Num constraint on the unit. Though typically for affine transformations a Fractional constraint is also obliged.
type DPrimitive = Primitive DoubleSource
data PathSegment u Source
Eq u => Eq (PathSegment u) | |
Show u => Show (PathSegment u) | |
Pretty u => Pretty (PathSegment u) | |
Pointwise (PathSegment u) |
type DPathSegment = PathSegment DoubleSource
type LabelProps = (PSRgb, FontAttr)Source
type EllipseProps = (PSRgb, DrawEllipse)Source
Note when drawn filled and drawn stroked the same polygon will have (slightly) different size:
- A filled shape fills within the boundary of the shape
- A stroked shape draws a pen line around the boundary of the shape. The actual size depends on the thickness of the line (stroke width).
data DrawEllipse Source
Ellipses and circles are always closed.