diff --git a/agb-image-converter/src/font_loader.rs b/agb-image-converter/src/font_loader.rs index b0cb31f..583c460 100644 --- a/agb-image-converter/src/font_loader.rs +++ b/agb-image-converter/src/font_loader.rs @@ -22,11 +22,17 @@ pub fn load_font(font_data: &[u8], pixels_per_em: f32) -> TokenStream { ) .expect("Invalid font data"); + let line_metrics = font.horizontal_line_metrics(pixels_per_em).unwrap(); + + let line_height = line_metrics.new_line_size as i32; + let ascent = line_metrics.ascent as i32; + let font = (0..128) .map(|i| font.rasterize(char::from_u32(i).unwrap(), pixels_per_em)) .map(|(metrics, bitmap)| { let width = metrics.width; let height = metrics.height; + LetterData { width, height, @@ -57,6 +63,6 @@ pub fn load_font(font_data: &[u8], pixels_per_em: f32) -> TokenStream { }); quote![ - agb::display::Font::new(&[#(#font),*]) + agb::display::Font::new(&[#(#font),*], #line_height, #ascent) ] } diff --git a/agb/src/display/font.rs b/agb/src/display/font.rs index 3a84a64..72ec062 100644 --- a/agb/src/display/font.rs +++ b/agb/src/display/font.rs @@ -33,11 +33,17 @@ impl FontLetter { pub struct Font { letters: &'static [FontLetter], + line_height: i32, + ascent: i32, } impl Font { - pub const fn new(letters: &'static [FontLetter]) -> Self { - Self { letters } + pub const fn new(letters: &'static [FontLetter], line_height: i32, ascent: i32) -> Self { + Self { + letters, + line_height, + ascent, + } } fn letter(&self, letter: char) -> &'static FontLetter { @@ -89,11 +95,12 @@ impl Font { let letter = self.letter(c); let xmin = (current_x_pos + letter.xmin as i32).max(0); + let y_start = current_y_pos + self.ascent - letter.height as i32 - letter.ymin as i32; for letter_y in 0..(letter.height as i32) { for letter_x in 0..(letter.width as i32) { let x = letter_x + xmin; - let y = current_y_pos + letter_y; + let y = y_start + letter_y; let px = letter.data[(letter_x + letter_y * letter.width as i32) as usize];