/* Hurry Curry! - a game about cooking Copyright 2024 metamuffin This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, version 3 of the License only. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ use super::{sprite::SpriteDraw, AtlasLayout, Renderer}; use hurrycurry_protocol::glam::Vec2; use sdl2::rect::Rect; pub struct FontTextures { pub glyphs: [Rect; 128], } impl FontTextures { pub fn init(layout: &AtlasLayout) -> Self { FontTextures { glyphs: (0..128) .map(|n| { layout .get(&format!("letter_{n}+a")) .copied() .unwrap_or(Rect::new(0, 0, 0, 0)) }) .collect::>() .try_into() .expect("some letters are missing in the font"), } } } impl Renderer<'_> { pub fn draw_text( &mut self, position: Vec2, text: &str, scale: f32, tint: Option<[u8; 4]>, ) -> Vec2 { let mut cursor = position; let mut line_height = 0f32; for c in text.chars() { if c == '\n' { cursor.y += line_height; cursor.x = position.x } if (c as u32) < 128 { let r = self.font_textures.glyphs[c as usize]; let size = Vec2::new(r.width() as f32, r.height() as f32) * scale; self.draw_ui(SpriteDraw::overlay(r, cursor, size, tint)); cursor.x += size.x; line_height = line_height.max(size.y) } } (cursor - position.y) + Vec2::Y * line_height } }