diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/font.rs | 96 | ||||
-rw-r--r-- | src/main.rs | 42 | ||||
-rw-r--r-- | src/uwu-logo-font-20px.png | bin | 0 -> 1711 bytes |
3 files changed, 131 insertions, 7 deletions
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<WindowContext>) -> 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; diff --git a/src/main.rs b/src/main.rs index a3bcca1..c0a58a5 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,8 +1,14 @@ extern crate sdl2; +mod font; + +use font::{UwUFont, UWU_WIDTH}; use sdl2::event::Event; +use sdl2::image::LoadTexture; use sdl2::keyboard::Keycode; use sdl2::pixels::Color; +use sdl2::rect::Rect; +use sdl2::render::TextureCreator; use std::time::Duration; pub fn main() { @@ -10,22 +16,45 @@ pub fn main() { let video_subsystem = sdl_context.video().unwrap(); let window = video_subsystem - .window("hentai", 800, 600) + .window("hentai", 320, 256) .position_centered() + //.fullscreen() .build() .unwrap(); let mut canvas = window.into_canvas().build().unwrap(); + let texture_creator = canvas.texture_creator(); + let uwu_font = font::UwUFont::new(&texture_creator); + let u_char = uwu_font.u_surface().as_texture(&texture_creator).unwrap(); + let w_char = uwu_font.w_surface().as_texture(&texture_creator).unwrap(); - canvas.set_draw_color(Color::RGB(0, 255, 255)); - canvas.clear(); + canvas + .copy(&u_char, None, UwUFont::pos_to_rect(0, 0)) + .unwrap(); + canvas + .copy(&w_char, None, UwUFont::pos_to_rect(UWU_WIDTH as i32, 0)) + .unwrap(); + canvas + .copy(&u_char, None, UwUFont::pos_to_rect(UWU_WIDTH as i32 * 2, 0)) + .unwrap(); + //canvas.clear(); + let tc = canvas.texture_creator(); + let sheet = tc.load_texture_bytes(font::UWU_SHEET_RAW).unwrap(); + /* + canvas.copy( + &sheet, + Rect::new(0, 0, font::UWU_WIDTH, font::UWU_HEIGHT), + font::UwUFont::pos_to_rect(0, 0), + ); + */ + canvas.draw_rect(Rect::new(100, 100, 200, 200)); canvas.present(); let mut event_pump = sdl_context.event_pump().unwrap(); let mut i = 0; 'running: loop { i = (i + 1) % 255; - canvas.set_draw_color(Color::RGB(i, 64, 255 - i)); - canvas.clear(); + //canvas.set_draw_color(Color::RGB(i, 64, 255 - i)); + //canvas.clear(); for event in event_pump.poll_iter() { match event { Event::Quit { .. } @@ -37,8 +66,7 @@ pub fn main() { } } // The rest of the game loop goes here... - - canvas.present(); + //canvas.present(); ::std::thread::sleep(Duration::new(0, 1_000_000_000u32 / 60)); } } diff --git a/src/uwu-logo-font-20px.png b/src/uwu-logo-font-20px.png Binary files differnew file mode 100644 index 0000000..7ecbdaf --- /dev/null +++ b/src/uwu-logo-font-20px.png |