aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--build.rs36
-rw-r--r--src/font.rs12
2 files changed, 37 insertions, 11 deletions
diff --git a/build.rs b/build.rs
index 7b7b410..a036b4a 100644
--- a/build.rs
+++ b/build.rs
@@ -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,