Portability | GHC |
---|---|

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, applying these metrics to other font families will usually produce over-estimates (bounding boxes will be longer than the true visual length of the text).

This is a deficiency of Wumpus, and limits its text handling capabilities - for example, text cannot be reliably centered or right aligned as its true length is not known. However, more powerful alternatives would need access to the metrics embedded within font files. This would require a font loader and add significant implementation complexity.

- type FontSize = Int
- type CharCount = Int
- courier48_width :: PtSize
- courier48_height :: PtSize
- courier48_numeral_height :: PtSize
- courier48_xheight :: PtSize
- courier48_descender_depth :: PtSize
- courier48_ascender_height :: PtSize
- courier48_spacer_width :: PtSize
- widthAt48pt :: CharCount -> PtSize
- charWidth :: FontSize -> PtSize
- spacerWidth :: FontSize -> PtSize
- textWidth :: FontSize -> CharCount -> PtSize
- textHeight :: FontSize -> PtSize
- numeralHeight :: FontSize -> PtSize
- xcharHeight :: FontSize -> PtSize
- descenderDepth :: FontSize -> PtSize
- textBounds :: (Num u, Ord u, FromPtSize u) => FontSize -> Point2 u -> String -> BoundingBox u
- textBoundsEnc :: (Num u, Ord u, FromPtSize u) => FontSize -> Point2 u -> EncodedText -> BoundingBox u
- charCount :: String -> CharCount

# Type synonyms

# Courier metrics at 48 point

courier48_width :: PtSizeSource

The width of a letter in Courier at 48 pt.

The value is not entirely accurate but it is satisfactory.

width = 26.0

courier48_height :: PtSizeSource

The point size of a character in Courier at 48 pt.

** Naturally the height is 48.0 **.

courier48_numeral_height :: PtSizeSource

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

Note - the height of a numeral in Courier is slightly larger than a upper-case letter.

numeral_height = 30.0

courier48_xheight :: PtSizeSource

The height of the body of a lower-case letter (typically the letter 'x') in Courier at 48 pt.

This is also known as the "body height".

xheight = 20.0

courier48_descender_depth :: PtSizeSource

The depth of a descender in Courier at 48 pt.

descender_depth = 9.0

courier48_ascender_height :: PtSizeSource

The depth of an ascender in Courier at 48 pt.

ascender_height = 10.0

Note - for Courier point size is not the sum of descender, ascender and xheight and lower-case letters with ascenders are slightly taller than upper-case letters:

descender_depth + xheight + ascender_height /= point_size

xheight + ascender_height /= cap_height

xheight + ascender_height == numeral_height

courier48_spacer_width :: PtSizeSource

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 for bounding box calculations.

spacer_width = 3.0

# Metrics calculation

widthAt48pt :: CharCount -> PtSizeSource

Width of the supplied string when printed at 48pt (i.e. n chars + (n-1) spacers).

Use `charCount`

to calculate the `CharCount`

.

charWidth :: FontSize -> PtSizeSource

Approximate the width of a monospace character using metrics derived from the Courier font.

spacerWidth :: FontSize -> PtSizeSource

Approximate the width of a spacer between monospace characters using metrics derived from the Courier font.

textWidth :: FontSize -> CharCount -> PtSizeSource

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 :: FontSize -> PtSizeSource

Text height is just identity/double-coercion of the Point size.
i.e. `18 == 18.0`

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

numeralHeight :: FontSize -> PtSizeSource

Approximate the height of a numeral using metrics derived from the Courier monospaced font.

xcharHeight :: FontSize -> PtSizeSource

Approximate the height of the lower-case char 'x' using metrics derived from the Courier monospaced font.

descenderDepth :: FontSize -> PtSizeSource

Approximate the descender depth for font size `sz`

using
metrics derived from the Courier monospaced font.

textBounds :: (Num u, Ord u, FromPtSize u) => FontSize -> Point2 u -> String -> BoundingBox uSource

`textBounds`

: ` font_size * baseline_left * text -> BBox`

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

The supplied point represents the baseline 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.

textBoundsEnc :: (Num u, Ord u, FromPtSize u) => FontSize -> Point2 u -> EncodedText -> BoundingBox uSource

`textBoundsEnc`

: ` font_size * baseline_left * encoded_text -> BBox`

Version of textBounds for EncodedText.

Note this function is hidded by the top-level module
`Wumpus.Core`

.