extern crate freetype as ft;
extern crate unicode_normalization;
use unicode_normalization::UnicodeNormalization;
const WIDTH: usize = 32;
const HEIGHT: usize = 24;
fn draw_bitmap(bitmap: ft::Bitmap, x: usize, y: usize) -> [[u8; WIDTH]; HEIGHT] {
let mut figure = [[0; WIDTH]; HEIGHT];
let mut p = 0;
let mut q = 0;
let w = bitmap.width() as usize;
let x_max = x + w;
let y_max = y + bitmap.rows() as usize;
for i in x..x_max {
for j in y..y_max {
if i < WIDTH && j < HEIGHT {
figure[j][i] |= bitmap.buffer()[q * w + p];
q += 1;
}
}
q = 0;
p += 1;
}
figure
}
fn main() {
let ref mut args = std::env::args();
if args.len() != 3 {
let exe = args.next().unwrap();
println!("Usage: {} font character", exe);
return
}
let ref font = args.nth(1).unwrap();
let character = args.next().and_then(|s| s.nfc().next()).unwrap() as usize;
let library = ft::Library::init().unwrap();
let face = library.new_face(font, 0).unwrap();
face.set_char_size(40 * 64, 0, 50, 0).unwrap();
face.load_char(character, ft::face::LoadFlag::RENDER).unwrap();
let glyph = face.glyph();
let x = glyph.bitmap_left() as usize;
let y = HEIGHT - glyph.bitmap_top() as usize;
let figure = draw_bitmap(glyph.bitmap(), x, y);
for i in 0..HEIGHT {
for j in 0..WIDTH {
print!("{}", match figure[i][j] {
p if p == 0 => " ",
p if p < 128 => "*",
_ => "+",
});
}
println!("");
}
}