From 7bcd4e42f99564244426535a1f50e3991369fe00 Mon Sep 17 00:00:00 2001 From: Erin Date: Wed, 16 Aug 2017 11:53:58 -0500 Subject: [PATCH] textium: Add render_atlas example (packs atlas, exports as png) --- textium/Cargo.toml | 3 +++ textium/examples/Px437_IBM_VGA8.ttf | Bin 0 -> 26068 bytes textium/examples/render_atlas.rs | 27 ++++++++++----------------- 3 files changed, 13 insertions(+), 17 deletions(-) create mode 100644 textium/examples/Px437_IBM_VGA8.ttf diff --git a/textium/Cargo.toml b/textium/Cargo.toml index 0a51441..d59028d 100644 --- a/textium/Cargo.toml +++ b/textium/Cargo.toml @@ -6,3 +6,6 @@ authors = ["Erin "] [dependencies] glium = "0.17" rusttype = "0.2.1" + +[dev-dependencies] +image = "0.15" diff --git a/textium/examples/Px437_IBM_VGA8.ttf b/textium/examples/Px437_IBM_VGA8.ttf new file mode 100644 index 0000000000000000000000000000000000000000..a8284f13a9074b2bb27f690e0aa5e7e7eca2f842 GIT binary patch literal 26068 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 N748C)|79}u{{i$iMBe}a literal 0 HcmV?d00001 diff --git a/textium/examples/render_atlas.rs b/textium/examples/render_atlas.rs index d7fc1d6..f64ead3 100644 --- a/textium/examples/render_atlas.rs +++ b/textium/examples/render_atlas.rs @@ -1,10 +1,13 @@ +extern crate image; extern crate textium; extern crate rusttype; +use std::path::Path; use rusttype::{FontCollection}; +use textium::texture::Buffer2d; +use image::{ImageBuffer, Luma}; -/// An array of all of the ascii printable characters. -pub const ASCII: &'static [char] = &[ +const ASCII: &'static [char] = &[ ' ', '!', '"', '#', '$', '%', '&', '\'', '(', ')', '*', '+', ',', '-', '.', '/', ':', ';', '<', '=', '>', '?', '[', ']', '\\', '|', '{', '}', '^', '~', '_', '@', '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', @@ -14,24 +17,14 @@ pub const ASCII: &'static [char] = &[ ]; fn main() { - let font_data = include_bytes!("Gudea-Regular.ttf"); + let font_data = include_bytes!("Px437_IBM_VGA8.ttf"); let font = FontCollection::from_bytes(font_data as &[u8]) .into_font().unwrap(); let font = textium::Font::new(font); - let chrs = ASCII.iter().cloned(); - let (atlas, bitmap, line_height) = font.make_atlas(chrs, 40.0, 1, 64, 64); + let chrs = ASCII.iter().cloned().chain(ASCII.iter().cloned()); + let (_, bitmap, _) = font.make_atlas(chrs, 20.0, 1, 256, 128); - // println!("{:?}", atlas.glyph_data); - for line in bitmap.lines() { - print!("{:03} ", line.len()); - for &pixel in line { - if pixel == 0 { - print!(" "); - } else { - print!("#"); - } - } - println!(""); - } + let img: ImageBuffer, _> = ImageBuffer::from_raw(bitmap.width() as u32, bitmap.height() as u32, bitmap.raw()).unwrap(); + let _ = img.save(&Path::new("atlas.png")); }