pub struct Glyph {
pub id: u16,
pub style: FontStyle,
pub symbol: CompactString,
pub pixel_coords: (i32, i32),
pub is_emoji: bool,
}Expand description
Represents a single character glyph in a font atlas texture.
A Glyph contains the metadata needed to locate and identify a character
within a font atlas texture. Each glyph has a unique ID that maps
to its coordinates in a WebGL TEXTURE_2D_ARRAY.
§ASCII Optimization
For ASCII characters, the glyph ID directly corresponds to the character’s ASCII value, enabling fast lookups without hash table lookups. Non-ASCII characters are assigned sequential IDs starting from a base value.
§Glyph ID Bit Layout (16-bit)
| Bit(s) | Flag Name | Hex Mask | Binary Mask | Description |
|---|---|---|---|---|
| 0-9 | GLYPH_ID | 0x03FF | 0000_0011_1111_1111 | Base glyph identifier |
| 10 | BOLD | 0x0400 | 0000_0100_0000_0000 | Bold font style |
| 11 | ITALIC | 0x0800 | 0000_1000_0000_0000 | Italic font style |
| 12 | EMOJI | 0x1000 | 0001_0000_0000_0000 | Emoji character flag |
| 13 | UNDERLINE | 0x2000 | 0010_0000_0000_0000 | Underline effect |
| 14 | STRIKETHROUGH | 0x4000 | 0100_0000_0000_0000 | Strikethrough effect |
| 15 | RESERVED | 0x8000 | 1000_0000_0000_0000 | Reserved for future use |
- The first 10 bits (0-9) represent the base glyph ID, allowing for 1024 unique glyphs.
- Emoji glyphs implicitly clear any other font style bits.
- The fragment shader uses the glyph ID to decode the texture coordinates and effects.
§Glyph ID Encoding Examples
| Character | Style | Binary Representation | Hex Value | Description |
|---|---|---|---|---|
| ‘A’ (0x41) | Normal | 0000_0000_0100_0001 | 0x0041 | Plain ‘A’ |
| ‘A’ (0x41) | Bold | 0000_0100_0100_0001 | 0x0441 | Bold ‘A’ |
| ‘A’ (0x41) | Bold + Italic | 0000_1100_0100_0001 | 0x0C41 | Bold italic ‘A’ |
| ‘A’ (0x41) | Bold + Underline | 0010_0100_0100_0001 | 0x2441 | Bold underlined ‘A’ |
| ‘🚀’ (0x81) | Emoji | 0001_0000_1000_0001 | 0x1081 | “rocket” emoji |
Fields§
§id: u16The glyph ID; encodes the 3d texture coordinates
style: FontStyleThe style of the glyph, e.g., bold, italic
symbol: CompactStringThe character
pixel_coords: (i32, i32)The pixel coordinates of the glyph in the texture
is_emoji: boolIndicates if the glyph is an emoji
Implementations§
Source§impl Glyph
impl Glyph
Sourcepub const UNASSIGNED_ID: u16 = 65_535u16
pub const UNASSIGNED_ID: u16 = 65_535u16
The ID is used as a short-lived placeholder until the actual ID is assigned.
Sourcepub const GLYPH_ID_MASK: u16 = 1_023u16
pub const GLYPH_ID_MASK: u16 = 1_023u16
Glyph ID mask - extracts the base glyph identifier (bits 0-9). Supports 1024 unique base glyphs (0x000 to 0x3FF) in the texture atlas.
Sourcepub const GLYPH_ID_EMOJI_MASK: u16 = 8_191u16
pub const GLYPH_ID_EMOJI_MASK: u16 = 8_191u16
Glyph ID mask for emoji - extracts the base glyph identifier (bits 0-11). Supports 2048 emoji glyphs (0x000 to 0xFFF) occupying two slots each in the texture atlas.
Sourcepub const BOLD_FLAG: u16 = 1_024u16
pub const BOLD_FLAG: u16 = 1_024u16
Bold flag - selects the bold variant of the glyph from the texture atlas.
Sourcepub const ITALIC_FLAG: u16 = 2_048u16
pub const ITALIC_FLAG: u16 = 2_048u16
Italic flag - selects the italic variant of the glyph from the texture atlas.
Sourcepub const EMOJI_FLAG: u16 = 4_096u16
pub const EMOJI_FLAG: u16 = 4_096u16
Emoji flag - indicates this glyph represents an emoji character requiring special handling.
Sourcepub const UNDERLINE_FLAG: u16 = 8_192u16
pub const UNDERLINE_FLAG: u16 = 8_192u16
Underline flag - renders a horizontal line below the character baseline.
Sourcepub const STRIKETHROUGH_FLAG: u16 = 16_384u16
pub const STRIKETHROUGH_FLAG: u16 = 16_384u16
Strikethrough flag - renders a horizontal line through the middle of the character.
Source§impl Glyph
impl Glyph
Sourcepub fn new(symbol: &str, style: FontStyle, pixel_coords: (i32, i32)) -> Self
pub fn new(symbol: &str, style: FontStyle, pixel_coords: (i32, i32)) -> Self
Creates a new glyph with the specified symbol and pixel coordinates.
pub fn new_with_id( base_id: u16, symbol: &str, style: FontStyle, pixel_coords: (i32, i32), ) -> Self
pub fn new_emoji(base_id: u16, symbol: &str, pixel_coords: (i32, i32)) -> Self
Sourcepub fn base_id(&self) -> u16
pub fn base_id(&self) -> u16
Returns the base glyph ID without style flags.
For non-emoji glyphs, this masks off the style bits (bold/italic) using
GLYPH_ID_MASK to extract just the base identifier (bits 0-9).
For emoji glyphs, returns the full ID since emoji don’t use style variants.
§Examples
use beamterm_data::{Glyph, FontStyle};
// Bold 'A' (0x0441) -> base ID 0x41
let bold_a = Glyph::new_with_id(0x41, "A", FontStyle::Bold, (0, 0));
assert_eq!(bold_a.id, 0x441);
assert_eq!(bold_a.base_id(), 0x041);
// Emoji retains full ID
let emoji = Glyph::new_emoji(0x00, "🚀", (0, 0));
assert_eq!(emoji.base_id(), 0x1000); // includes EMOJI_FLAG