diff options
fix: nyaa
-rw-r--r-- | build.rs | 36 | ||||
-rw-r--r-- | src/font.rs | 12 |
2 files changed, 37 insertions, 11 deletions
@@ -101,17 +101,39 @@ fn save_bits_to_file(font: &FontMetadata, char: u8, bits: &[u8]) -> io::Result<( file.write_all(&FontMetadata::img_to_hex(bits.to_vec()))?; Ok(()) } +fn to_upper_snake_with_first_upper_preceeded_by_underscore(str: String) -> String { + let mut str = str; + for char in "ABCDEFGHIJKLMNOPQRSTUVWXYZ".chars() { + str = str.replace(char,format!("_{char}").as_str()); + } + str.to_uppercase() +} fn generate_struct(font: &FontMetadata) -> io::Result<String> { let name = font.name; let mut contents = format!( - "pub struct {name} {{}} -impl BakedFont for {name} {{ - fn get_char_bytes(c: char) -> &'static [u8] {{ - match c as u8 {{ -" + "pub struct {name}Struct {{}} +impl BakedFont for {name}Struct {{ + fn has_char(&self, c: char) -> bool {{ + match c as u8 {{" ); for char in font.unique_chars() { contents = format!( + "{contents} + | {}", + char as u8, + ); + } + contents = format!( + "{contents} + => true, + _ => false + }} + }} + fn get_char_bytes(&self, c: char) -> &'static [u8] {{ + match c as u8 {{ +"); + for char in font.unique_chars() { + contents = format!( "{contents} {} => include_bytes!(\"../../assets/computed-fonts/{}/{}.bin\"), ", char as u8, font.name, char as u8 @@ -122,7 +144,9 @@ impl BakedFont for {name} {{ }} }} }} -" +pub const FONT{}: {name}Struct = {name}Struct{{ +}}; +", to_upper_snake_with_first_upper_preceeded_by_underscore(name.to_string()) ); Ok(contents) } diff --git a/src/font.rs b/src/font.rs index 7df0545..92c0f6b 100644 --- a/src/font.rs +++ b/src/font.rs @@ -24,12 +24,14 @@ pub struct RenderableCharacter { pub data: &'static [u8], } /** - A trait describing a generated font. + A trait describing a generated font. + We use traits implemented by each font because it's somehow optimized better in preliminary testing(?) */ pub trait BakedFont { - fn get_char_bytes(character: char) -> &'static [u8]; - fn get_char(character: char) -> RenderableCharacter { - let bytes = Self::get_char_bytes(character); + fn has_char(&self,character: char) -> bool; + fn get_char_bytes(&self,character: char) -> &'static [u8]; + fn get_char(&self,character: char) -> RenderableCharacter { + let bytes = self.get_char_bytes(character); let width = (bytes[0] as u16) | (bytes[1] as u16 >> 8); let data = &bytes[2..]; RenderableCharacter { @@ -54,7 +56,7 @@ pub const MEOW_FONT: LazyLock<Font> = LazyLock::new(|| Font { }); mod sprite_sheets { - use super::{MEOW_FONT, UWU_HEIGHT, UWU_WIDTH}; + use super::{BakedFont, MEOW_FONT, UWU_HEIGHT, UWU_WIDTH}; use sdl2::{ // image::LoadTexture, pixels::PixelFormatEnum, |