use image::{DynamicImage, LumaA}; use rusttype::{point, Font, Scale, ScaledGlyph}; use std::io::Cursor; lazy_static::lazy_static! { static ref DEJA_VU_MONO: Font<'static> = Font::from_bytes(include_bytes!("../fonts/dejavu/DejaVuSansMono.ttf") as &[u8]).unwrap(); static ref OPEN_SANS_ITALIC: Font<'static> = Font::from_bytes(include_bytes!("../fonts/opensans/OpenSans-Italic.ttf") as &[u8]).unwrap(); } fn draw_luma_alpha(glyph: ScaledGlyph<'_>) -> image::GrayAlphaImage { let glyph = glyph.positioned(point(0.0, 0.0)); let bounds = glyph.pixel_bounding_box().unwrap(); let mut glyph_image = DynamicImage::new_luma_a8(bounds.width() as _, bounds.height() as _).to_luma_alpha(); glyph.draw(|x, y, v| { glyph_image.put_pixel( x, y, LumaA { data: [128, (v * 255.0) as u8], }, ) }); glyph_image } /// Render a 600px U+2623 character require it to match the reference with /// 8-bit accuracy #[test] fn render_to_reference_big_biohazard() { let new_image = draw_luma_alpha(DEJA_VU_MONO.glyph('☣').scaled(Scale::uniform(600.0))); // save the new render for manual inspection new_image.save("target/big_biohazard.png").unwrap(); let reference = image::load( Cursor::new(include_bytes!("reference_big_biohazard.png") as &[u8]), image::PNG, ) .expect("!image::load") .to_luma_alpha(); assert_eq!(reference.dimensions(), new_image.dimensions()); for y in 0..reference.height() { for x in 0..reference.width() { assert_eq!( reference.get_pixel(x, y), new_image.get_pixel(x, y), "unexpected alpha difference at ({}, {})", x, y ); } } } /// Render a 16px 'w' character require it to match the reference with 8-bit /// accuracy #[test] fn render_to_reference_w() { let new_image = draw_luma_alpha(DEJA_VU_MONO.glyph('w').scaled(Scale::uniform(16.0))); // save the new render for manual inspection new_image.save("target/w.png").unwrap(); let reference = image::load( Cursor::new(include_bytes!("reference_w.png") as &[u8]), image::PNG, ) .expect("!image::load") .to_luma_alpha(); assert_eq!(reference.dimensions(), new_image.dimensions()); for y in 0..reference.height() { for x in 0..reference.width() { assert_eq!( reference.get_pixel(x, y), new_image.get_pixel(x, y), "unexpected alpha difference at ({}, {})", x, y ); } } } /// Render a 60px 'ΐ' character require it to match the reference with 8-bit /// accuracy #[test] fn render_to_reference_iota() { let new_image = draw_luma_alpha(OPEN_SANS_ITALIC.glyph('ΐ').scaled(Scale::uniform(60.0))); // save the new render for manual inspection new_image.save("target/iota.png").unwrap(); let reference = image::load( Cursor::new(include_bytes!("reference_iota.png") as &[u8]), image::PNG, ) .expect("!image::load") .to_luma_alpha(); assert_eq!(reference.dimensions(), new_image.dimensions()); for y in 0..reference.height() { for x in 0..reference.width() { assert_eq!( reference.get_pixel(x, y), new_image.get_pixel(x, y), "unexpected alpha difference at ({}, {})", x, y ); } } }