diff options
fix: make font rendering not wonky
Diffstat (limited to 'src/font.rs')
-rw-r--r-- | src/font.rs | 76 |
1 files changed, 57 insertions, 19 deletions
diff --git a/src/font.rs b/src/font.rs index 0baa862..fc5217e 100644 --- a/src/font.rs +++ b/src/font.rs @@ -1,6 +1,12 @@ use std::sync::LazyLock; -use sdl2::{pixels::{Color, PixelFormatEnum}, rect::Rect, render::{Texture, TextureCreator, TextureValueError}, surface::Surface, video::WindowContext}; +use sdl2::{ + pixels::{Color, PixelFormatEnum}, + rect::{Point, Rect}, + render::{Texture, TextureCreator, TextureValueError}, + surface::Surface, + video::WindowContext, +}; pub struct RenderableCharacter { /** The width of the character, indicating where to break into a newline */ @@ -9,6 +15,8 @@ pub struct RenderableCharacter { pub height: u16, /** The raw alpha layer of the character */ pub data: &'static [u8], + /** The offset to draw the character at */ + pub offset: Point, } /** A trait describing a generated font. @@ -19,11 +27,19 @@ pub trait BakedFont { 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..]; + 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 height = if data.len() == 0 { + 0 + } else { + data.len() as u16 / width + }; RenderableCharacter { width, - height: data.len() as u16 / width, + height, + offset: Point::new(offset_x, offset_y), data, } } @@ -32,23 +48,39 @@ impl RenderableCharacter { /** Alpha value of colour is currently ignored! */ pub fn to_surface(&self, colour: Color) -> Surface<'static> { let mut surface = Surface::new( - self.width.into(), - self.height.into(), + if self.width == 0 { + 1 + } else { + self.width.into() + }, + if self.height == 0 { + 1 + } else { + self.height.into() + }, PixelFormatEnum::RGBA32, ) .unwrap(); - surface.with_lock_mut(|buffer: &mut [u8]| { - let mut idx: usize = 0; - print!("{} ({}x{})", self.data.len() * 4, self.width, self.height); - for pixel in self.data { - let index = idx * 4; - buffer[index] = colour.r; // Red - buffer[index + 1] = colour.g; // Green - buffer[index + 2] = colour.b; // Blue - buffer[index + 3] = *pixel; // Alpha - idx += 1; - } - }); + if self.width != 0 || self.height != 0 { + surface.with_lock_mut(|buffer: &mut [u8]| { + let mut idx: usize = 0; + for pixel in self.data { + let index = idx * 4; + buffer[index] = colour.r; // Red + buffer[index + 1] = colour.g; // Green + buffer[index + 2] = colour.b; // Blue + buffer[index + 3] = *pixel; // Alpha + idx += 1; + } + }); + } else { + // Blank + surface.with_lock_mut(|buffer: &mut [u8]| { + for index in 0..buffer.len() { + buffer[index] = 0; + } + }) + } surface } /** Colour Alpha Channel is ignored */ @@ -61,6 +93,12 @@ impl RenderableCharacter { surface.as_texture(texture_creator) } pub fn to_rect(&self, x: i32, y: i32) -> Rect { - Rect::new(x, y, self.width.into(), self.height.into()) + println!("{:#?}",self.offset); + Rect::new( + x + self.offset.x, + y + self.offset.y, + i32::from(self.width).try_into().unwrap(), + i32::from(self.height).try_into().unwrap(), + ) } } |