Portability | GHC with TypeFamilies and more |
---|---|

Stability | unstable |

Maintainer | stephen.tetley@gmail.com |

Font size calculation for Label's and their bounding boxes.

Calculations are based on metrics derived from Courier at 48pt. As Courier is a monospaced font, bounding boxes calculated for other font families will usually have longer width than is necessary for the printed text.

This is a deficiency of Wumpus, but alternatives would have significant implementation complexity.

- type FontSize = Int
- type CharCount = Int
- courier48_width :: Num u => u
- courier48_body_height :: Num u => u
- courier48_height :: Num u => u
- courier48_descender_depth :: Num u => u
- courier48_spacer_width :: Num u => u
- widthAt48pt :: Fractional u => CharCount -> u
- textWidth :: Fractional u => FontSize -> CharCount -> u
- textHeight :: Num u => FontSize -> u
- capHeight :: Fractional u => FontSize -> u
- descenderDepth :: Fractional u => FontSize -> u
- textBounds :: (Fractional u, Ord u) => FontSize -> Point2 u -> CharCount -> BoundingBox u

# Type synonyms

# Courier metrics at 48 point

courier48_width :: Num u => uSource

The width of a letter in Courier at 48 pt.

The value is not entirely accurate but it is satisfactory.

courier48_body_height :: Num u => uSource

The height of a letter without accents, ascenders or descenders in Courier at 48 pt .

The value is not entirely accurate but it is satisfactory - some letters are taller than others (e.g. numbers are taller then capitals).

courier48_height :: Num u => uSource

The *common maximum* height of a letter in Courier at 48pt.

By common maximum the letter is allowed to have both an accent or ascender and a descender.

Naturally the height is 48.0.

courier48_descender_depth :: Num u => uSource

The depth of a descender in Courier at 48 pt.

Also the height of an ascender.

courier48_spacer_width :: Num u => uSource

The spacing between letters printed directly with PostScript's show command for Courier at 48 pt.

The value is not entirely accurate but it is satisfactory.

# Metrics calculation

widthAt48pt :: Fractional u => CharCount -> uSource

Width of the supplied string when printed at 48pt.

textWidth :: Fractional u => FontSize -> CharCount -> uSource

Text width at `sz`

point size of the string `s`

. All
characters are counted literally - special chars may cause
problems (this a current deficiency of Wumpus).

textHeight :: Num u => FontSize -> uSource

Text height is just identity/double-coercion, i.e.
`18 == 18.0`

. The *size* of a font is the maximum height:

body + descender max + ascender max

capHeight :: Fractional u => FontSize -> uSource

descenderDepth :: Fractional u => FontSize -> uSource

Descender depth for font size `sz`

.

textBounds :: (Fractional u, Ord u) => FontSize -> Point2 u -> CharCount -> BoundingBox uSource

Find the bounding box for the character count at the supplied font-size.

The supplied point represents the bottom left corner of the
a regular upper-case letter (that is without descenders).
The bounding box will always be *dropped* to accommodate
ascenders - no interpretation of the string takes place to
see if it actually contains ascenders or descenders.

The metrics used are derived from Courier - a monospaced font. For variable width fonts the calculated bounding box will usually be too long.