blob: d802e17989026e1b2e0d9ef87a1fbdf955fa3347 [file] [log] [blame]
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
);
}
}
}