pub const UWU_HEIGHT: u32 = 24; pub const UWU_WIDTH: u32 = 16; pub const UWU_SHEET_RAW: &[u8] = include_bytes!("uwu-logo-font-20px.png"); mod sprite_sheets { use super::{UWU_HEIGHT, UWU_SHEET_RAW, UWU_WIDTH}; use sdl2::{ image::LoadTexture, pixels::PixelFormatEnum, rect::Rect, render::{Canvas, Texture, TextureCreator}, surface::{self, Surface}, video::WindowContext, }; use std::collections::HashMap; pub struct UwUFont<'a> { sheet: Surface<'a>, } fn uwu_get_n(n: u32) -> Rect { Rect::new((UWU_WIDTH * n) as i32, 0, UWU_WIDTH, UWU_HEIGHT) } #[inline] fn uwu_u() -> Rect { return uwu_get_n(0); } #[inline] fn uwu_w() -> Rect { return uwu_get_n(1); } #[inline] fn uwu_s() -> Rect { return uwu_get_n(2); } #[inline] fn uwu_p() -> Rect { return uwu_get_n(3); } #[inline] fn uwu_a() -> Rect { return uwu_get_n(4); } #[inline] fn uwu_c() -> Rect { return uwu_get_n(5); } #[inline] fn uwu_e() -> Rect { return uwu_get_n(6); } impl<'a> UwUFont<'a> { pub fn new(texture_creator: &'a TextureCreator) -> UwUFont<'a> { let surface = Surface::new(112, 24, PixelFormatEnum::RGB24).unwrap(); let mut canvas = Canvas::from_surface(surface).unwrap(); let tc = canvas.texture_creator(); let tx = tc.load_texture_bytes(UWU_SHEET_RAW).unwrap(); canvas.copy(&tx, None, None).unwrap(); canvas.present(); let sheet = canvas.into_surface(); UwUFont { sheet } } pub fn pos_to_rect(x: i32, y: i32) -> Rect { return Rect::new(x, y, UWU_WIDTH, UWU_HEIGHT); } pub fn char_to_surface(&self, char: Rect) -> Surface { let mut char_surface = Surface::new(UWU_WIDTH, UWU_HEIGHT, PixelFormatEnum::RGB24).unwrap(); self .sheet .blit(char, &mut char_surface, Self::pos_to_rect(0, 0)) .unwrap(); char_surface } pub fn u_surface(&self) -> Surface { return self.char_to_surface(uwu_u()); } pub fn w_surface(&self) -> Surface { return self.char_to_surface(uwu_w()); } } } pub use sprite_sheets::UwUFont;