Skip to main content

vector_text_hershey/
lib.rs

1#![no_std]
2
3//! `vector-text-hershey` is a backend for the `vector-text` crate that
4//! renders Hershey fonts.
5//!
6//! It includes Hershey font data sourced from [Paul Bourke's compilation](https://paulbourke.net/dataformats/hershey/).
7
8extern crate alloc;
9
10use alloc::vec::Vec;
11use vector_text_core::{Glyph, PackedPoint, Point, Renderer};
12
13include!(concat!(env!("OUT_DIR"), "/hershey_font.rs"));
14
15/// A [Renderer] which draws text using Hershey fonts.
16pub struct HersheyRenderer;
17
18impl Renderer<HersheyFont> for HersheyRenderer {
19    fn render_text(text: &str, font: HersheyFont) -> Vec<Point> {
20        let mut result = Vec::new();
21        let mut x_idx = 0;
22
23        let mapping = font.table();
24
25        for character in text.chars() {
26            if character > 255 as char {
27                continue;
28            }
29
30            let hershey_id = mapping[character as usize] as usize;
31
32            if hershey_id == 0 || hershey_id >= HERSHEY_FONT.len() {
33                continue;
34            }
35
36            if let Some(glyph) = HERSHEY_FONT[hershey_id] {
37                result.extend(glyph.strokes.iter().map(|point| Point {
38                    x: point.x as i16 - glyph.left as i16 + x_idx,
39                    y: point.y as i16,
40                    pen: point.pen,
41                }));
42                x_idx += glyph.right as i16 - glyph.left as i16;
43            }
44        }
45
46        result
47    }
48}