aboutsummaryrefslogtreecommitdiffstats
path: root/src/font.rs
diff options
context:
space:
mode:
authorLibravatarLarge Libravatar memdmp <memdmpmemewarenet>2025-01-12 02:41:00 +0100
committerLibravatarLarge Libravatar memdmp <memdmpmemewarenet>2025-01-12 02:41:00 +0100
commitc8d7879f4daa41a26c534f42ce2b7050e062db8c (patch)
tree0476d9a389c864ce53990951f5ae55a93d787ebf /src/font.rs
parentc89d4ae45320a00670c3496060d661a65183a9ed (diff)
downloadcosin25-invite-mountainbytes-c8d7879f4daa41a26c534f42ce2b7050e062db8c.tar.gz
cosin25-invite-mountainbytes-c8d7879f4daa41a26c534f42ce2b7050e062db8c.tar.bz2
cosin25-invite-mountainbytes-c8d7879f4daa41a26c534f42ce2b7050e062db8c.tar.lz
cosin25-invite-mountainbytes-c8d7879f4daa41a26c534f42ce2b7050e062db8c.zip

fix: make font rendering not wonky

Diffstat (limited to 'src/font.rs')
-rw-r--r--src/font.rs76
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(),
+ )
}
}