glium_text 0.14.0

Text drawing with glium and freetype
Documentation
extern crate glium;
extern crate glium_text;
extern crate cgmath;

use std::path::Path;
use glium::Surface;
use glium::glutin::{ControlFlow, Event, self, WindowEvent};

fn main() {
    use std::fs::File;

    let mut event_loop = glutin::EventsLoop::new();
    let window = glutin::WindowBuilder::new().with_dimensions((1024, 768).into());
    let context = glutin::ContextBuilder::new();
    let display = glium::Display::new(window, context, &event_loop).unwrap();
    let system = glium_text::TextSystem::new(&display);

    let font = match std::env::args().nth(1) {
        Some(file) => glium_text::FontTexture::new(&display, File::open(&Path::new(&file)).unwrap(), 70),
        None => {
            match File::open(&Path::new("C:\\Windows\\Fonts\\Arial.ttf")) {
                Ok(f) => glium_text::FontTexture::new(&display, f, 70),
                Err(_) => glium_text::FontTexture::new(&display, &include_bytes!("font.ttf")[..], 70),
            }
        }
    }.unwrap();

    let mut buffer = String::new();

    println!("Type with your keyboard");

    event_loop.run_forever(|event| {
        let text = glium_text::TextDisplay::new(&system, &font, &buffer);

        let (w, h) = display.get_framebuffer_dimensions();

        let matrix:[[f32; 4]; 4] = cgmath::Matrix4::new(
            0.1, 0.0, 0.0, 0.0,
            0.0, 0.1 * (w as f32) / (h as f32), 0.0, 0.0,
            0.0, 0.0, 1.0, 0.0,
            -0.9, 0.0, 0.0, 1.0f32,
        ).into();

        let mut target = display.draw();
        target.clear_color(0.0, 0.0, 0.0, 1.0);
        glium_text::draw(&text, &system, &mut target, matrix, (1.0, 1.0, 0.0, 1.0));
        target.finish().unwrap();

        if let Event::WindowEvent {event, ..} = event {
            match event {
                WindowEvent::ReceivedCharacter('\r') => buffer.clear(),
                WindowEvent::ReceivedCharacter(c) if c as u32 == 8 => { buffer.pop(); },
                WindowEvent::ReceivedCharacter(chr) => buffer.push(chr),
                WindowEvent::CloseRequested => return ControlFlow::Break,
                _ => ()
            }
        }
        ControlFlow::Continue
    });
}