use oxitext_raster::subpixel::rasterize_with_offset;
use std::path::Path;
fn load_test_font() -> Vec<u8> {
let fixture = Path::new(env!("CARGO_MANIFEST_DIR")).join("../../tests/fixtures/test-font.ttf");
if fixture.exists() {
return std::fs::read(&fixture).expect("read fixture font");
}
oxifont_bundled::NOTO_SANS_REGULAR.to_vec()
}
#[test]
fn subpixel_shift_changes_coverage() {
let font_data = load_test_font();
let glyph_id = 36u16;
let px_size = 32.0_f32;
let (key0, cov0) = rasterize_with_offset(&font_data, glyph_id, px_size, 0.0)
.expect("rasterize at offset 0.0 failed");
let (key1, cov1) = rasterize_with_offset(&font_data, glyph_id, px_size, 0.5)
.expect("rasterize at offset 0.5 failed");
assert_ne!(
key0, key1,
"cache keys for offset=0.0 and offset=0.5 must be different"
);
if cov0.is_empty() || cov1.is_empty() {
return;
}
assert_ne!(
cov0, cov1,
"coverage bitmaps for x_offset=0.0 and x_offset=0.5 must differ \
(subpixel shift should change edge anti-aliasing)"
);
}
#[test]
fn cache_key_respects_subpixel_bucket() {
use oxitext_raster::subpixel::{SubpixelCacheKey, SubpixelOffset};
let k_zero = SubpixelCacheKey::new(36, 16.0, 0.0);
let k_half = SubpixelCacheKey::new(36, 16.0, 0.5);
let k_zero_dup = SubpixelCacheKey::new(36, 16.0, 0.0);
assert_ne!(k_zero, k_half);
assert_eq!(k_zero, k_zero_dup);
assert_eq!(SubpixelOffset::from_float(0.0).bucket(), 0);
assert_eq!(SubpixelOffset::from_float(0.5).bucket(), 2);
}