Using vector fonts

library(lofifonts)

Vector Fonts: included fonts

get_lofi_names('vector')
#> [1] "arcade"          "gridfont"        "gridfont_smooth"
Type Name Sizes Unicode? # glyphs
Vector gridfont Lower case ASCII only
Vector gridfont_smooth Lower case ASCII only
Vector arcade Upper case ASCII only

Vector font: functions

  • vector_text_coords() returns a data.frame of strokes
  • vector_text_matrix() returns a binary matrix with pixel locations set to 1
  • vector_text_raster() returns a raster image of the text

Vector font: Rendering text

Text may be rendered with a vector font to

  1. A data.frame of stroke endpoints
  2. A binary matrix of pixel locations
  3. A simple raster object
library(lofifonts)
vector_text_coords("Hello", font = 'gridfont_smooth') |> 
  head()
#> # A tibble: 6 × 8
#>   char_idx codepoint stroke_idx     x     y  line    x0    y0
#>      <int>     <int>      <int> <dbl> <dbl> <int> <dbl> <dbl>
#> 1        1       104          1 0      9        0 0      9   
#> 2        1       104          1 0      3        0 0      3   
#> 3        1       104          2 0      5.67     0 0      5.67
#> 4        1       104          2 0.167  6.33     0 0.167  6.33
#> 5        1       104          2 0.667  6.83     0 0.667  6.83
#> 6        1       104          2 1.17   7        0 1.17   7
vector_text_raster("Hello", "gridfont_smooth") |>
  plot()

Vector font: Bespoke pixel rendering

This is an example of bespoke rendering of the strokes for an example string.

For each character (char_idx) there are 1-or-more strokes (stroke). Each stroke has at least 2 points (indicated by idx).

When plotting with ggplot, draw path for the points-within-strokes-within-characters.

library(ggplot2)

coords <- vector_text_coords("Hello", "gridfont_smooth")
head(coords)
#> # A tibble: 6 × 8
#>   char_idx codepoint stroke_idx     x     y  line    x0    y0
#>      <int>     <int>      <int> <dbl> <dbl> <int> <dbl> <dbl>
#> 1        1       104          1 0      9        0 0      9   
#> 2        1       104          1 0      3        0 0      3   
#> 3        1       104          2 0      5.67     0 0      5.67
#> 4        1       104          2 0.167  6.33     0 0.167  6.33
#> 5        1       104          2 0.667  6.83     0 0.667  6.83
#> 6        1       104          2 1.17   7        0 1.17   7
ggplot(coords) +
  geom_path(aes(x, y, 
                group = interaction(char_idx, stroke_idx), 
                colour = as.factor(char_idx)), 
            linewidth = 4) +
  geom_point(aes(x, y), color = 'yellow') + 
  theme_bw() + 
  theme(legend.position = 'none') + 
  coord_equal()