aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--build.rs13
-rw-r--r--src/font.rs8
-rw-r--r--src/main.rs51
3 files changed, 47 insertions, 25 deletions
diff --git a/build.rs b/build.rs
index ac7a5c4..bbabf0e 100644
--- a/build.rs
+++ b/build.rs
@@ -60,7 +60,7 @@ impl FontMetadata {
}
define_item(
&mut image,
- 10 + ((width as usize) * (height as usize)),
+ 14 + ((width as usize) * (height as usize)),
0x00,
);
@@ -72,11 +72,12 @@ impl FontMetadata {
// TODO: do we *really* need i32 values here? wouldn't i16 be sufficient?
image[2..6].copy_from_slice(&pixel_bounding_box.min.x.to_le_bytes());
image[6..10].copy_from_slice(&(pixel_bounding_box.min.y + (scale.y / 2.0) as i32).to_le_bytes());
+ image[10..14].copy_from_slice(&(glyph.h_metrics().advance_width).to_le_bytes());
positioned_glyph.draw(|gx: u32, gy: u32, v| {
let bit = (v * 255.0) as u8;
if gx < width {
- define_item(&mut image, (10 + (gy * width) + gx) as usize, bit);
+ define_item(&mut image, (14 + (gy * width) + gx) as usize, bit);
}
});
image
@@ -145,8 +146,12 @@ fn generate_struct(font: &FontMetadata) -> io::Result<String> {
let mut contents = format!(
"pub struct {name}Struct {{}}
impl BakedFont for {name}Struct {{
+ fn font_scale_y() -> f32 {{
+ {}
+ }}
fn has_char(&self, c: char) -> bool {{
- match c as u8 {{"
+ match c as u8 {{",
+ format!("{}{}",font.scale.y.to_string(),if font.scale.y % 1.0 == 0.0 {".0"} else {""})
);
for char in font.unique_chars() {
contents = format!(
@@ -197,7 +202,7 @@ use crate::font::BakedFont;
name: "Galmuri",
font: { Font::try_from_vec(fs::read("assets/fonts/Galmuri11.ttf")?).unwrap() },
charset: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz2053: ",
- scale: Scale::uniform(20.0),
+ scale: Scale::uniform(32.0),
},
FontMetadata {
name: "CherryBombOne",
diff --git a/src/font.rs b/src/font.rs
index fc5217e..a547928 100644
--- a/src/font.rs
+++ b/src/font.rs
@@ -17,12 +17,15 @@ pub struct RenderableCharacter {
pub data: &'static [u8],
/** The offset to draw the character at */
pub offset: Point,
+ /** The amount to advance the x position of the cursor when drawing */
+ pub advance_width: f32,
}
/**
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 font_scale_y() -> f32;
fn has_char(&self, character: char) -> bool;
fn get_char_bytes(&self, character: char) -> &'static [u8];
fn get_char(&self, character: char) -> RenderableCharacter {
@@ -30,7 +33,8 @@ pub trait BakedFont {
let width = u16::from_le_bytes(bytes[0..2].try_into().unwrap());
let offset_x = i32::from_le_bytes(bytes[2..6].try_into().unwrap());
let offset_y = i32::from_le_bytes(bytes[6..10].try_into().unwrap());
- let data = &bytes[10..];
+ let advance_width = f32::from_le_bytes(bytes[10..14].try_into().unwrap());
+ let data = &bytes[14..];
let height = if data.len() == 0 {
0
} else {
@@ -41,6 +45,7 @@ pub trait BakedFont {
height,
offset: Point::new(offset_x, offset_y),
data,
+ advance_width,
}
}
}
@@ -93,7 +98,6 @@ impl RenderableCharacter {
surface.as_texture(texture_creator)
}
pub fn to_rect(&self, x: i32, y: i32) -> Rect {
- println!("{:#?}",self.offset);
Rect::new(
x + self.offset.x,
y + self.offset.y,
diff --git a/src/main.rs b/src/main.rs
index ebe73d7..c212386 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -4,11 +4,10 @@ mod font;
pub mod generated;
use font::BakedFont;
-use generated::fonts::FONT_CHERRY_BOMB_ONE;
+use generated::fonts::{FONT_CHERRY_BOMB_ONE, FONT_GALMURI};
use sdl2::event::Event;
use sdl2::keyboard::Keycode;
use sdl2::pixels::Color;
-use sdl2::rect::Rect;
use std::time::Duration;
pub fn main() {
@@ -26,27 +25,41 @@ pub fn main() {
let texture_creator = canvas.texture_creator();
// let uwu_font = font::UwUFont::new(&texture_creator);
canvas.clear();
- let mut offset: u16 = 0;
- for c in "UwU Space".chars() {
- let char = FONT_CHERRY_BOMB_ONE.get_char(c);
- canvas
- .copy(
- &char
- .to_texture(&texture_creator, Color::RGB(255, 10, 100))
- .unwrap(),
- None,
- char.to_rect(offset as i32, 0),
- )
- .unwrap();
- offset += char.width;
- }
- canvas.draw_rect(Rect::new(100, 100, 200, 200)).unwrap();
canvas.present();
let mut event_pump = sdl_context.event_pump().unwrap();
let mut i = 0;
'running: loop {
i = (i + 1) % 255;
- // canvas.set_draw_color(Color::RGB(i, 64, 255 - i));
+
+ let mut offset: f32 = 0.0;
+ for c in "UwU Space".chars() {
+ let char = FONT_CHERRY_BOMB_ONE.get_char(c);
+ canvas
+ .copy(
+ &char
+ .to_texture(&texture_creator, Color::RGB(i, 64, 255 - i))
+ .unwrap(),
+ None,
+ char.to_rect(offset as i32, 0),
+ )
+ .unwrap();
+ offset += char.advance_width;
+ }
+ offset=0.0;
+ for c in "All hail Blahaj".chars() {
+ let char = FONT_GALMURI.get_char(c);
+ canvas
+ .copy(
+ &char
+ .to_texture(&texture_creator, Color::RGB(i, 64, 255 - i))
+ .unwrap(),
+ None,
+ char.to_rect(offset as i32, 40),
+ )
+ .unwrap();
+ offset += char.advance_width;
+ }
+ // canvas.set_draw_color();
// canvas.clear();
for event in event_pump.poll_iter() {
match event {
@@ -59,7 +72,7 @@ pub fn main() {
}
}
// The rest of the game loop goes here...
- // canvas.present();
+ canvas.present();
::std::thread::sleep(Duration::new(0, 1_000_000_000u32 / 60));
}
}