diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/font.rs | 76 | ||||
| -rw-r--r-- | src/main.rs | 2 | 
2 files changed, 58 insertions, 20 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(), +    )    }  } 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( |