use oxitext_core::{Bitmap, RenderOutput};
#[derive(Debug, Clone)]
pub struct RasterResult {
pub output: RenderOutput,
pub advance_x: f32,
pub advance_y: f32,
pub bearing_x: i32,
pub bearing_y: i32,
}
impl RasterResult {
pub fn empty() -> Self {
Self {
output: RenderOutput::Greyscale(Bitmap {
width: 0,
height: 0,
pixels: Vec::new(),
}),
advance_x: 0.0,
advance_y: 0.0,
bearing_x: 0,
bearing_y: 0,
}
}
pub fn is_empty(&self) -> bool {
match &self.output {
RenderOutput::Greyscale(b) => b.pixels.is_empty(),
RenderOutput::Color(b) => b.rgba.is_empty(),
RenderOutput::Lcd(b) => b.rgb.is_empty(),
RenderOutput::Sdf { data, .. } => data.is_empty(),
RenderOutput::Msdf { data, .. } => data.is_empty(),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn empty_result_is_empty() {
let r = RasterResult::empty();
assert!(r.is_empty());
assert_eq!(r.advance_x, 0.0);
assert_eq!(r.bearing_x, 0);
}
#[test]
fn non_empty_greyscale_is_not_empty() {
let r = RasterResult {
output: RenderOutput::Greyscale(Bitmap {
width: 1,
height: 1,
pixels: vec![128],
}),
advance_x: 8.0,
advance_y: 0.0,
bearing_x: 0,
bearing_y: 8,
};
assert!(!r.is_empty());
}
#[test]
fn is_empty_matches_all_variants() {
use oxitext_core::{ColorBitmap, LcdBitmap};
let sdf = RasterResult {
output: RenderOutput::Sdf {
width: 0,
height: 0,
data: vec![],
},
..RasterResult::empty()
};
assert!(sdf.is_empty());
let lcd = RasterResult {
output: RenderOutput::Lcd(LcdBitmap::new(1, 1, vec![0, 0, 0])),
..RasterResult::empty()
};
assert!(!lcd.is_empty());
let color = RasterResult {
output: RenderOutput::Color(ColorBitmap {
width: 1,
height: 1,
rgba: vec![0, 0, 0, 255],
}),
..RasterResult::empty()
};
assert!(!color.is_empty());
let msdf = RasterResult {
output: RenderOutput::Msdf {
width: 0,
height: 0,
data: vec![],
},
..RasterResult::empty()
};
assert!(msdf.is_empty());
}
}