From bfe0d3bf265536023145ab8f54217bc307d4c639 Mon Sep 17 00:00:00 2001 From: Yash Karandikar Date: Wed, 16 Mar 2022 11:26:25 -0500 Subject: [PATCH] Add ability to draw text --- Cargo.toml | 2 +- cozette_bitmap.ttf | Bin 0 -> 69876 bytes src/lib.rs | 46 ++++++++++++++++++++++++++++++++++++++++++--- src/main.rs | 4 +++- 4 files changed, 47 insertions(+), 5 deletions(-) create mode 100644 cozette_bitmap.ttf diff --git a/Cargo.toml b/Cargo.toml index 7bfb602..f2d4b90 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,4 +12,4 @@ exclude = ["src/main.rs"] [dependencies.sdl2] version = "0.35.2" -features = ["image"] +features = ["image", "ttf"] diff --git a/cozette_bitmap.ttf b/cozette_bitmap.ttf new file mode 100644 index 0000000000000000000000000000000000000000..5eca0941f9c42cc086eb7d149d8fc5712a2bf41d GIT binary patch literal 69876 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 UKM=j_Jlu|ZRG;Kgpn(woA5tn~egFUf literal 0 HcmV?d00001 diff --git a/src/lib.rs b/src/lib.rs index 4e2b8e4..95e5d6b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -57,7 +57,7 @@ use sdl2::{ rwops::RWops, surface::Surface, video::{Window, WindowBuildError, WindowContext}, - EventPump, IntegerOrSdlError, + EventPump, IntegerOrSdlError, ttf::{Sdl2TtfContext, Font, FontError}, }; #[doc(no_inline)] @@ -109,6 +109,12 @@ impl From for CatboxError { } } +impl From for CatboxError { + fn from(e: FontError) -> Self { + CatboxError(format!("{}", e)) + } +} + pub type Result = std::result::Result; /// Wrapper type around SDL's [`EventPump`](sdl2::EventPump). See those docs for more info. @@ -233,20 +239,32 @@ impl Sprite { } } +pub enum TextMode { + Transparent { + colour: (u8, u8, u8) + }, + Shaded { + foreground: (u8, u8, u8), + background: (u8, u8, u8) + } +} + /// Game context. /// /// In most cases, this should never actually be used; instead, just pass it around to the various cat-box functions such as [`Sprite::draw()`]. pub struct Context { canvas: Canvas, texture_creator: TextureCreator, + ttf_subsystem: Sdl2TtfContext } impl Context { - fn new(canvas: Canvas) -> Self { + fn new(canvas: Canvas, ttf_subsystem: Sdl2TtfContext) -> Self { let creator = canvas.texture_creator(); Self { canvas, texture_creator: creator, + ttf_subsystem } } @@ -271,6 +289,27 @@ impl Context { } } +pub fn draw_text(ctx: &mut Context, text: &str, font: &str, size: u16, pos: (i32, i32), mode: TextMode) -> Result<()> { + let font = ctx.ttf_subsystem.load_font(font, size)?; + let renderer = font.render(text); + + let surf = match mode { + TextMode::Transparent { colour: (r, g, b) } => renderer.solid(Color::RGB(r, g, b)), + TextMode::Shaded { foreground: (fr, fg, fb), background: (br, bg, bb) } => renderer.shaded(Color::RGB(fr, fg, fb), Color::RGB(br, bg, bb)), + }?; + + drop(font); + let (creator, canvas) = ctx.inner(); + let texture = creator.create_texture_from_surface(&surf)?; + + let srect = surf.rect(); + let dest_rect: Rect = Rect::from_center(pos, srect.width(), srect.height()); + + canvas.copy_ex(&texture, None, dest_rect, 0.0, None, false, false)?; + + Ok(()) +} + /// Representation of the game. pub struct Game { /// The title that the window displays. @@ -322,12 +361,13 @@ impl Game { .build()?; let canvas = window.into_canvas().build()?; + let s = sdl2::ttf::init().unwrap(); let event_pump = sdl_context.event_pump()?; let mut events = Events { pump: event_pump }; - let mut ctx = Context::new(canvas); + let mut ctx = Context::new(canvas, s); loop { if self.stopped.get() { diff --git a/src/main.rs b/src/main.rs index a83f14e..c2fd5fb 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,4 +1,4 @@ -use cat_box::{Event, Game, Keycode, Sprite}; +use cat_box::{Event, Game, Keycode, Sprite, draw_text}; fn main() { let game = Game::new("catbox demo", 1000, 800); @@ -10,6 +10,8 @@ fn main() { i = (i + 1.0) % 360.0; ctx.set_background_colour(i as u8, 64, 255); + draw_text(ctx, "this is a test", "cozette_bitmap.ttf", 65535, (300, 300), cat_box::TextMode::Shaded {foreground: (255, 255, 255), background: (0, 0, 0)}).unwrap(); + let (start_x, start_y) = s.position(); let m = sdl2::mouse::MouseState::new(event_pump.as_ref()); let x_diff = m.x() - start_x;