use crate::api::{Context, GraphicsContext, Spritesheet};
use crate::text::{Text, TextRenderer};
#[derive(Clone, Debug)]
pub struct Font {
index: usize,
spritesheet: Spritesheet,
}
impl Font {
#[cfg(feature = "ttf")]
pub fn with_ttf(ctx: &mut Context, ttf_data: Vec<u8>) -> Result<Font, rusttype::Error> {
let text = TextRenderer::with_ttf(&mut ctx.renderer, ttf_data)?;
let handle = text.draw_call().clone();
ctx.text_renderers.push(text);
Ok(Font {
index: ctx.text_renderers.len() - 1,
spritesheet: Spritesheet { handle },
})
}
#[cfg(feature = "font8x8")]
pub fn with_font8x8(ctx: &mut Context, smoothed: bool) -> Font {
let text = TextRenderer::with_font8x8(&mut ctx.renderer, smoothed);
let handle = text.draw_call().clone();
ctx.text_renderers.push(text);
Font {
index: ctx.text_renderers.len() - 1,
spritesheet: Spritesheet { handle },
}
}
pub fn draw<'a, S: Into<String>>(
&self,
ctx: &'a mut GraphicsContext,
text: S,
x: f32,
y: f32,
font_size: f32,
) -> Text<'a> {
ctx.text_renderers[self.index].draw(text.into(), x, y, font_size)
}
pub fn is_glyph_cache_full(&self, ctx: &GraphicsContext) -> bool {
ctx.text_renderers[self.index].glyph_cache_filled
}
pub fn spritesheet(&self) -> &Spritesheet {
&self.spritesheet
}
}