This is a wrapper around Sean Barrett's TrueType font rasterizer code.
The original can be found at http://nothings.org/stb/stb_truetype.h.
The version of stb-truetype
used here is 0.3
.
- newtype TrueType = TrueType ByteString
- data Offset
- data Font
- data Glyph
- loadTTF :: FilePath -> IO TrueType
- withTTF :: FilePath -> (TrueType -> IO a) -> IO a
- enumerateFonts :: TrueType -> IO [Offset]
- initFont :: TrueType -> Offset -> IO Font
- findGlyph :: Font -> Char -> IO (Maybe Glyph)
- type Unscaled = Int
- data HorizontalMetrics a = HMetrics {
- advanceWidth :: a
- leftSideBearing :: a
- data VerticalMetrics a = VMetrics {}
- data BoundingBox a = BBox (a, a) (a, a)
- lineAdvance :: Num a => VerticalMetrics a -> a
- verticalSize :: Num a => VerticalMetrics a -> a
- scaleForPixelHeight :: VerticalMetrics Unscaled -> Float -> Float
- getFontVerticalMetrics :: Font -> IO (VerticalMetrics Unscaled)
- getGlyphHorizontalMetrics :: Font -> Glyph -> IO (HorizontalMetrics Unscaled)
- getGlyphKernAdvance :: Font -> Glyph -> Glyph -> IO Unscaled
- getGlyphBoundingBox :: Font -> Glyph -> IO (BoundingBox Unscaled)
- type Scaling = (Float, Float)
- data Bitmap = Bitmap {
- bitmapSize :: (Int, Int)
- bitmapPtr :: ForeignPtr Word8
- newBitmap :: (Int, Int) -> IO Bitmap
- withBitmap :: Bitmap -> (Int -> Int -> Ptr Word8 -> IO a) -> IO a
- flipBitmap :: Bitmap -> IO Bitmap
- type BitmapOfs = (Int, Int)
- getGlyphBitmapBox :: Font -> Glyph -> Scaling -> IO (BoundingBox Int)
- newGlyphBitmap :: Font -> Glyph -> Scaling -> IO (Bitmap, BitmapOfs)
- renderGlyphIntoBitmap' :: Font -> Glyph -> Scaling -> Bitmap -> BitmapOfs -> IO ()
- renderGlyphIntoBitmap :: Font -> Glyph -> Scaling -> Bitmap -> BitmapOfs -> IO ()
- bitmapArray :: Bitmap -> IO (UArray (Int, Int) Word8)
- bitmapFloatArray :: Bitmap -> IO (UArray (Int, Int) Float)
- data CachedBitmap = CBM Bitmap BitmapOfs (HorizontalMetrics Float)
- data BitmapCache
- bmcVerticalMetrics :: BitmapCache -> VerticalMetrics Float
- bmcScaling :: BitmapCache -> Scaling
- newBitmapCache :: Font -> Bool -> (Float, Float) -> IO BitmapCache
- getCachedBitmap :: BitmapCache -> Char -> IO (Maybe CachedBitmap)
Documentation
A TrueType font file (containing maybe multiple font sets) loaded into memory.
Initialization
enumerateFonts :: TrueType -> IO [Offset]Source
Enumerates the fonts found in a TrueType file. Often there is only one, but there may be more.
Font metrics
data HorizontalMetrics a Source
HMetrics | |
|
Functor HorizontalMetrics | |
Show a => Show (HorizontalMetrics a) |
data VerticalMetrics a Source
ascent
is the coordinate above the baseline the font extends; descent
is the coordinate below the baseline the font extends (i.e. it is typically negative)
lineGap
is the spacing between one row's descent and the next row's ascent...
so you should advance the vertical position by ascent - descent + lineGap
Functor VerticalMetrics | |
Show a => Show (VerticalMetrics a) |
data BoundingBox a Source
The convention is BBox (x0,y0) (x1,y1)
.
BBox (a, a) (a, a) |
Show a => Show (BoundingBox a) |
lineAdvance :: Num a => VerticalMetrics a -> aSource
As calculated by (ascent - descent + lineGap)
.
verticalSize :: Num a => VerticalMetrics a -> aSource
As calculated by (ascent - descent)
.
getGlyphKernAdvance :: Font -> Glyph -> Glyph -> IO UnscaledSource
This is not yet implemented in stb_truetype
; it always returns 0.
getGlyphBoundingBox :: Font -> Glyph -> IO (BoundingBox Unscaled)Source
Bitmaps
A 8-bit grayscale bitmap.
Bitmap | |
|
flipBitmap :: Bitmap -> IO BitmapSource
Flips the bitmap vertically (leaving the original unchanged)
getGlyphBitmapBox :: Font -> Glyph -> Scaling -> IO (BoundingBox Int)Source
Returns the size of the bitmap (in pixels) needed to render the glyph with the given scaling.
The box is centered around the glyph origin; so the
bitmap width is x1-x0
, height is y1-y0
, and location to place
the bitmap top left is (leftSideBearing*scale,y0)
.
Note that the bitmap uses y-increases-down, but the shape uses
y-increases-up, so the results of getGlyphBitmapBox
and
getGlyphBoundingBox
are inverted.
newGlyphBitmap :: Font -> Glyph -> Scaling -> IO (Bitmap, BitmapOfs)Source
Creates a new bitmap just enough to fit the glyph with the given scaling, and renders the glyph into it. The offset returned is the offset in pixel space from the glyph origin to the top-left of the bitmap (so it's almost always negative).
renderGlyphIntoBitmap' :: Font -> Glyph -> Scaling -> Bitmap -> BitmapOfs -> IO ()Source
The offset is the top-left corner of the bounding box of the glyph, and must be nonnegative (otherwise nothing will happen).
renderGlyphIntoBitmap :: Font -> Glyph -> Scaling -> Bitmap -> BitmapOfs -> IO ()Source
The offset is the origin of the glyph. If the glyph extends from the bitmap in the positive direction, it is clipped; however, if it extends in the negative direction, no drawing will happen!
bitmapArray :: Bitmap -> IO (UArray (Int, Int) Word8)Source
NOTE: because of the way Haskell indexes rectangular arrays,
the resulting array is indexed with (y,x)
, as opposed to what
you would expect.
Cached glyph storage
data CachedBitmap Source
Note: the metrics are scaled!
data BitmapCache Source
A "bitmap cache".
bmcVerticalMetrics :: BitmapCache -> VerticalMetrics FloatSource
Note: these metrics are scaled!
newBitmapCache :: Font -> Bool -> (Float, Float) -> IO BitmapCacheSource
Creates a new cache where glyph bitmaps with the given scaling will be stored. The second argument is whether the resulting bitmaps should be flipped vertically or not (this is useful with OpenGL).
getCachedBitmap :: BitmapCache -> Char -> IO (Maybe CachedBitmap)Source
Fetches a rendered glyph bitmap from the cache (rendering it first if it was not present in the cache before).