extern crate atlas;
extern crate framing;
extern crate png_framing;
extern crate rand;
use atlas::Atlas;
use framing::{Rgba, Function, Image};
use png_framing as png;
use rand::distributions::{Range, IndependentSample};
const SORT: bool = true;
const FRAMES: usize = 5000;
const PRINT_RECTS: bool = false;
fn main() {
let mut rng = rand::thread_rng();
let between = Range::new(1, 17);
let mut frames = Vec::with_capacity(FRAMES);
let mut used = 0;
for _ in 0..FRAMES {
let (r, g, b) = rand::random::<(u8, u8, u8)>();
let color = Rgba(r, g, b, 255);
let (w, h) = (
between.ind_sample(&mut rng) * 16,
between.ind_sample(&mut rng) * 16
);
used += w * h;
if PRINT_RECTS {
println!("{}x{}", w, h);
}
frames.push(Function::new(w, h, move |_, _| color));
}
if SORT {
println!("Sorting...");
frames.sort_by_key(|frame| -({
let (width, height) = (frame.width(), frame.height());
if width < height { width } else { height }
} as isize));
}
println!("Adding frames to atlas...");
let mut atlas = Atlas::new(Rgba(0, 0, 0, 0));
for frame in frames {
atlas.add(frame);
}
let total = atlas.width() * atlas.height();
let efficiency = used as f64 / total as f64;
println!("Generated with {}% efficiency!", efficiency * 100.0);
png::save(&atlas.into(), "output.png").unwrap();
println!("Atlas saved to `output.png`!");
}