moho 0.0.9

Barebones Rust Game Library
use errors::*;
use renderer;
use renderer::font;

use glm;
use sdl2::pixels::Color;
use sdl2::ttf::Font as SdlFont;
use sdl2::ttf::Sdl2TtfContext;
use sdl2::render::Renderer as SdlRenderer;
use sdl2::render::Texture as SdlTexture;

impl<'a> font::Font for SdlFont<'a, 'static> {
    fn measure(&self, text: &str) -> Result<glm::UVec2> {
        self.size_of(text)
            .map(|(x, y)| glm::uvec2(x, y))
            .chain_err(|| "error measuring font")
    }
}

impl<'a> renderer::FontLoader<'a> for Sdl2TtfContext {
    type Font = SdlFont<'a, 'static>;
}

impl<'a> renderer::Loader<'a, SdlFont<'a, 'static>, renderer::FontDetails> for Sdl2TtfContext {
    fn load(&'a self, data: &renderer::FontDetails) -> Result<SdlFont<'a, 'static>> {
        self.load_font(data.path, data.size).map_err(Into::into)
    }
}

impl<'a> renderer::FontTexturizer<'a> for SdlRenderer<'static> {
    type Texture = SdlTexture;
    type Font = SdlFont<'a, 'static>;
    fn texturize(&self,
                 font: &SdlFont<'a, 'static>,
                 text: &str,
                 color: &renderer::ColorRGBA)
                 -> Result<SdlTexture> {
        let &renderer::ColorRGBA(red, green, blue, alpha) = color;
        let color = Color::RGBA(red, green, blue, alpha);
        let surface = font.render(text)
            .blended(color)
            .chain_err(|| "error when creatinga a blended font surface")?;

        self.create_texture_from_surface(&surface)
            .chain_err(|| "error creating a texture from a surface")
    }
}