packages feed

kb-text-shape-0.1.0.1: README.md

# kb-text-shape

Haskell wrapper for the [kb_text_shape.h] unicode segmentation and shaping library (v2.06).

[kb_text_shape.h]: https://github.com/JimmyLefevre/kb/blob/main/kb_text_shape.h

> ```
>   Your text       A        Text runs with         B       Sequence of glyphs      C
>   (Probably ------------> uniform direction ------------> ready to rasterize ------------> Pixels
>   UTF-8)                    and script
> ```
> We call arrow A text segmentation, arrow B text shaping, and arrow C rasterization.
> This library does A and B.

```haskell
import KB.Text.Shape where qualified as TextShape

main = do
  TextShape.withContext \ctx -> do
    _fallback <- TextShape.pushFontFromFile ctx "test/NotoSans-Regular.ttf" 0
    _main <- TextShape.pushFontFromFile ctx "test/Ubuntu-R.ttf" 0
    results <- TextShape.run ctx do
      TextShape.text_ "A bunch of characters"
      TextShape.char_ '!'
    forM_ results \(run, glyphs) ->
      forM_ glyphs \glyph ->
        print (run.font, glyph.id, glyph.gpos.advanceX)
```

## Font blobs

The library has an internal "blob" format for the pre-processed font data for leaner files and faster loading.

```haskell
import KB.Text.Shape.Font qualified as Font

main = do
  ttfData <- ByteString.readFile "test/Ubuntu-R.ttf"
  putStrLn $ "Distilling " <> show (ByteString.length ttfData `div` 1024) <> "Kb of TTF"
  blobData <- Font.extractBlob ttfData 0
  putStrLn $ "Distilled into " <> show (ByteString.length blobData `div` 1024) <> "Kb blob"
  ByteString.writeFile "test/Ubuntu-R.kbts" blobData
```

The savings are modest, but can be improved even further with compression.

```
Distilling 1047Kb of TTF
Distilled into 618Kb blob
```