---
title: "Using bitmap fonts"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{Using bitmap fonts}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

```{r, include = FALSE}
knitr::opts_chunk$set(
  collapse = FALSE,
  comment = "#>"
)
```

```{r setup}
library(lofifonts)
```


## Bitmap font: included fonts

```{r}
names(font_info$bitmap)
```

| Type   | Name            | Sizes                         | Unicode?              | # glyphs |
|--------|-----------------|-------------------------------|-----------------------|----------|
| Bitmap | Spleen          | 5x8, 6x12, 8x16, 12x24, 16x32 | Some                  | 450-1000 |
| Bitmap | Unifont         | 16x16                         | Yes. Plane 0, 1       | 113446   |
| Bitmap | Unscii          | 8x8, 8x16                     | Some                   | 3240    |

## Bitmap font functions

* `bitmap_text_coords()` returns a data.frame of pixel locations
* `bitmap_text_matrix()` returns a binary matrix with pixel locations set to 1
* `bitmap_text_raster()` returns a raster image of the text


## Bitmap font: Rendering text

Text may be rendered with a bitmap font to 

1. A data.frame of pixel locations
2. A binary matrix of pixel locations
3. A simple `raster` object 

```{r bitmap-coords, fig.height = 3}
library(lofifonts)
bitmap_text_coords("Hello", font = 'unifont') |>
  head()
```


```{r bitmap-matrix, fig.height = 3}
bitmap_text_matrix("Hello", "unifont") 
```


```{r bitmap-raster, fig.height = 3}
bitmap_text_raster("Hello", "unifont") |>
  plot(interpolate = FALSE)
```

## Bitmap font: Bespoke pixel rendering

This is an example of bespoke rendering of the pixel data for an example string.

Each pixel in the `coords` data.frame has an `x` and `y` coordinates, and to 
render this font, a small square will be drawn for each pixel.  

A gap will be left between the rectangels to highlight the pixelated origin 
of the text.

```{r bitmap-bespoke, fig.height = 4, fig.width = 8}
library(grid)
coords <- bitmap_text_coords("Hello\n#RStats", "spleen-6x12")
head(coords)

grid.newpage()
grid.rect(
  x = coords$x * 4, 
  y = coords$y * 4, 
  width  = 3, 
  height = 3, 
  default.units = 'mm',
  gp = gpar(fill = rainbow(nrow(coords)), col = NA)
)
```