From 72743119c83f060602894366182b2e3f99d27319 Mon Sep 17 00:00:00 2001 From: fence Date: Wed, 8 Jan 2025 08:48:53 +0100 Subject: idk --- src/font.rs | 96 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 src/font.rs (limited to 'src/font.rs') diff --git a/src/font.rs b/src/font.rs new file mode 100644 index 0000000..5f70b59 --- /dev/null +++ b/src/font.rs @@ -0,0 +1,96 @@ +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; -- cgit v1.2.3