diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/font.rs | 41 | ||||
-rw-r--r-- | src/main.rs | 56 |
2 files changed, 63 insertions, 34 deletions
diff --git a/src/font.rs b/src/font.rs index d82d5a9..056c691 100644 --- a/src/font.rs +++ b/src/font.rs @@ -41,6 +41,42 @@ pub trait BakedFont { } } } +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(), + 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; + } + }); + surface + } + /** Colour Alpha Channel is ignored */ + pub fn to_texture<'a>( + &self, + texture_creator: &'a TextureCreator<WindowContext>, + colour: Color, + ) -> Result<Texture<'a>, TextureValueError> { + let surface = self.to_surface(colour); + 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()) + } +} pub struct Font<'a> { pub texture: &'a [u8], pub glyphs: Vec<*const Glyph>, @@ -151,4 +187,9 @@ mod sprite_sheets { use std::str::Bytes; +use sdl2::pixels::{Color, PixelFormatEnum}; +use sdl2::rect::Rect; +use sdl2::render::{Canvas, Texture, TextureCreator, TextureValueError}; +use sdl2::surface::Surface; +use sdl2::video::WindowContext; pub use sprite_sheets::UwUFont; diff --git a/src/main.rs b/src/main.rs index 39f39d2..287847d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,12 +3,12 @@ extern crate sdl2; mod font; pub mod generated; -use font::{UwUFont, UWU_WIDTH}; +use font::BakedFont; +use generated::fonts::FONT_CHERRY_BOMB_ONE; use sdl2::event::Event; use sdl2::keyboard::Keycode; use sdl2::pixels::Color; use sdl2::rect::Rect; -use sdl2::render::TextureCreator; use std::time::Duration; pub fn main() { @@ -24,42 +24,30 @@ pub fn main() { 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(); - let p_char = uwu_font.p_surface().as_texture(&texture_creator).unwrap(); - - 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 - .copy(&p_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::MEOW_FONT.texture).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)); + // let uwu_font = font::UwUFont::new(&texture_creator); + canvas.clear(); + let mut offset: u16 = 0; + for c in "UwUSpace".chars() { + let char = FONT_CHERRY_BOMB_ONE.get_char(c); + canvas + .copy( + &char + .to_texture(&texture_creator, Color::RGB(255, 10, 100)) + .unwrap(), + None, + char.to_rect(offset as i32, 0), + ) + .unwrap(); + offset += char.width; + } + canvas.draw_rect(Rect::new(100, 100, 200, 200)).unwrap(); 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 { .. } @@ -71,7 +59,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)); } } |