use rdocx_oxml::units::{Emu, HalfPoint, Twips};
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct Length {
emu: i64,
}
impl Length {
pub fn inches(val: f64) -> Self {
Length {
emu: (val * 914400.0) as i64,
}
}
pub fn cm(val: f64) -> Self {
Length {
emu: (val * 360000.0) as i64,
}
}
pub fn pt(val: f64) -> Self {
Length {
emu: (val * 12700.0) as i64,
}
}
pub fn emu(val: i64) -> Self {
Length { emu: val }
}
pub fn twips(val: i32) -> Self {
Length {
emu: val as i64 * 635,
}
}
pub fn to_inches(self) -> f64 {
self.emu as f64 / 914400.0
}
pub fn to_cm(self) -> f64 {
self.emu as f64 / 360000.0
}
pub fn to_pt(self) -> f64 {
self.emu as f64 / 12700.0
}
pub fn to_emu(self) -> i64 {
self.emu
}
pub fn to_twips(self) -> i32 {
(self.emu / 635) as i32
}
pub fn as_twips(self) -> Twips {
Twips(self.to_twips())
}
pub fn as_emu(self) -> Emu {
Emu(self.emu)
}
pub fn as_half_points(self) -> HalfPoint {
HalfPoint((self.to_pt() * 2.0) as u32)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn length_conversions() {
let one_inch = Length::inches(1.0);
assert!((one_inch.to_inches() - 1.0).abs() < 0.001);
assert!((one_inch.to_cm() - 2.54).abs() < 0.01);
assert!((one_inch.to_pt() - 72.0).abs() < 0.01);
assert_eq!(one_inch.to_twips(), 1440);
}
#[test]
fn length_from_pt() {
let twelve_pt = Length::pt(12.0);
assert_eq!(twelve_pt.as_half_points().0, 24);
}
}