From c8d7879f4daa41a26c534f42ce2b7050e062db8c Mon Sep 17 00:00:00 2001 From: memdmp Date: Sun, 12 Jan 2025 02:41:00 +0100 Subject: fix: make font rendering not wonky --- src/font.rs | 76 +++++++++++++++++++++++++++++++++++++++++++++---------------- src/main.rs | 2 +- 2 files changed, 58 insertions(+), 20 deletions(-) (limited to 'src') 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(), + ) } } diff --git a/src/main.rs b/src/main.rs index 287847d..ebe73d7 100644 --- a/src/main.rs +++ b/src/main.rs @@ -27,7 +27,7 @@ pub fn main() { // let uwu_font = font::UwUFont::new(&texture_creator); canvas.clear(); let mut offset: u16 = 0; - for c in "UwUSpace".chars() { + for c in "UwU Space".chars() { let char = FONT_CHERRY_BOMB_ONE.get_char(c); canvas .copy( -- cgit v1.2.3