#[derive(Clone, Copy, Debug)]
pub struct AlignmentLines {
first: f32,
last: f32,
}
impl AlignmentLines {
pub fn new(first: Option<f32>, last: Option<f32>) -> Self {
Self {
first: first.filter(|value| value.is_finite()).unwrap_or(f32::NAN),
last: last.filter(|value| value.is_finite()).unwrap_or(f32::NAN),
}
}
pub fn first_baseline(self) -> Option<f32> {
self.first.is_finite().then_some(self.first)
}
pub fn last_baseline(self) -> Option<f32> {
self.last.is_finite().then_some(self.last)
}
pub fn translated(self, y: f32) -> Self {
Self {
first: self.first + y,
last: self.last + y,
}
}
pub fn merge(&mut self, other: Self) {
self.first = self.first.min(other.first);
self.last = self.last.max(other.last);
}
pub fn with_overrides(self, explicit: Self) -> Self {
Self::new(
explicit.first_baseline().or_else(|| self.first_baseline()),
explicit.last_baseline().or_else(|| self.last_baseline()),
)
}
}
impl Default for AlignmentLines {
fn default() -> Self {
Self {
first: f32::NAN,
last: f32::NAN,
}
}
}
impl PartialEq for AlignmentLines {
fn eq(&self, other: &Self) -> bool {
self.first_baseline() == other.first_baseline()
&& self.last_baseline() == other.last_baseline()
}
}