From db96ecae94a7c06d04528e8d4461ebca86d2d249 Mon Sep 17 00:00:00 2001 From: Laurenz Date: Sat, 30 Mar 2019 16:58:45 +0100 Subject: =?UTF-8?q?Move=20some=20types=20into=20better=20places=20?= =?UTF-8?q?=F0=9F=A7=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/doc.rs | 202 +------------------------------------------------------------ 1 file changed, 3 insertions(+), 199 deletions(-) (limited to 'src/doc.rs') diff --git a/src/doc.rs b/src/doc.rs index 5d3c1e14..3ffc7f8c 100644 --- a/src/doc.rs +++ b/src/doc.rs @@ -1,9 +1,10 @@ -//! Abstract representation of a typesetted document. +//! Representation of typesetted documents. use crate::font::Font; +use crate::engine::Size; -/// A representation of a typesetted document. +/// A complete typesetted document, which can be exported. #[derive(Debug, Clone, PartialEq)] pub struct Document { /// The pages of the document. @@ -12,62 +13,6 @@ pub struct Document { pub fonts: Vec, } -/// Default styles for a document. -#[derive(Debug, Clone, PartialEq)] -pub struct Style { - /// The width of the paper. - pub width: Size, - /// The height of the paper. - pub height: Size, - - /// The left margin of the paper. - pub margin_left: Size, - /// The top margin of the paper. - pub margin_top: Size, - /// The right margin of the paper. - pub margin_right: Size, - /// The bottom margin of the paper. - pub margin_bottom: Size, - - /// A fallback list of font families to use. - pub font_families: Vec, - /// The font size. - pub font_size: f32, - /// The line spacing (as a multiple of the font size). - pub line_spacing: f32, -} - -/// A family of fonts (either generic or named). -#[derive(Debug, Clone, Eq, PartialEq)] -pub enum FontFamily { - SansSerif, - Serif, - Monospace, - Named(String), -} - -impl Default for Style { - fn default() -> Style { - use FontFamily::*; - Style { - // A4 paper. - width: Size::from_mm(210.0), - height: Size::from_mm(297.0), - - // Margins. A bit more on top and bottom. - margin_left: Size::from_cm(2.5), - margin_top: Size::from_cm(3.0), - margin_right: Size::from_cm(2.5), - margin_bottom: Size::from_cm(3.0), - - // Default font family, font size and line spacing. - font_families: vec![SansSerif, Serif, Monospace], - font_size: 12.0, - line_spacing: 1.25, - } - } -} - /// A page with text contents in a document. #[derive(Debug, Clone, PartialEq)] pub struct Page { @@ -96,144 +41,3 @@ pub enum TextCommand { /// Use the indexed font in the documents font list with a given font size. SetFont(usize, f32), } - -/// A general distance type that can convert between units. -#[derive(Debug, Copy, Clone, PartialEq)] -pub struct Size { - /// The size in typographic points (1/72 inches). - points: f32, -} - -impl Size { - /// Create an zeroed size. - #[inline] - pub fn zero() -> Size { Size { points: 0.0 } } - - /// Create a size from a number of points. - #[inline] - pub fn from_points(points: f32) -> Size { Size { points } } - - /// Create a size from a number of inches. - #[inline] - pub fn from_inches(inches: f32) -> Size { Size { points: 72.0 * inches } } - - /// Create a size from a number of millimeters. - #[inline] - pub fn from_mm(mm: f32) -> Size { Size { points: 2.83465 * mm } } - - /// Create a size from a number of centimeters. - #[inline] - pub fn from_cm(cm: f32) -> Size { Size { points: 28.3465 * cm } } - - /// Create a size from a number of points. - #[inline] - pub fn to_points(&self) -> f32 { self.points } - - /// Create a size from a number of inches. - #[inline] - pub fn to_inches(&self) -> f32 { self.points * 0.0138889 } - - /// Create a size from a number of millimeters. - #[inline] - pub fn to_mm(&self) -> f32 { self.points * 0.352778 } - - /// Create a size from a number of centimeters. - #[inline] - pub fn to_cm(&self) -> f32 { self.points * 0.0352778 } -} - -mod size { - use super::Size; - use std::cmp::Ordering; - use std::fmt; - use std::iter::Sum; - use std::ops::*; - - impl fmt::Display for Size { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "{}pt", self.points) - } - } - - macro_rules! impl_reflexive { - ($trait:ident, $func:ident, $assign_trait:ident, $assign_func:ident) => { - impl $trait for Size { - type Output = Size; - - #[inline] - fn $func(self, other: Size) -> Size { - Size { points: $trait::$func(self.points, other.points) } - } - } - - impl $assign_trait for Size { - #[inline] - fn $assign_func(&mut self, other: Size) { - $assign_trait::$assign_func(&mut self.points, other.points); - } - } - }; - } - - macro_rules! impl_num_back { - ($trait:ident, $func:ident, $assign_trait:ident, $assign_func:ident, $ty:ty) => { - impl $trait<$ty> for Size { - type Output = Size; - - #[inline] - fn $func(self, other: $ty) -> Size { - Size { points: $trait::$func(self.points, other as f32) } - } - } - - impl $assign_trait<$ty> for Size { - #[inline] - fn $assign_func(&mut self, other: $ty) { - $assign_trait::$assign_func(&mut self.points, other as f32); - } - } - }; - } - - macro_rules! impl_num_both { - ($trait:ident, $func:ident, $assign_trait:ident, $assign_func:ident, $ty:ty) => { - impl_num_back!($trait, $func, $assign_trait, $assign_func, $ty); - - impl $trait for $ty { - type Output = Size; - - #[inline] - fn $func(self, other: Size) -> Size { - Size { points: $trait::$func(self as f32, other.points) } - } - } - }; - } - - impl Neg for Size { - type Output = Size; - - fn neg(self) -> Size { - Size { points: -self.points } - } - } - - impl_reflexive!(Add, add, AddAssign, add_assign); - impl_reflexive!(Sub, sub, SubAssign, sub_assign); - impl_num_both!(Mul, mul, MulAssign, mul_assign, f32); - impl_num_both!(Mul, mul, MulAssign, mul_assign, i32); - impl_num_back!(Div, div, DivAssign, div_assign, f32); - impl_num_back!(Div, div, DivAssign, div_assign, i32); - - impl PartialOrd for Size { - fn partial_cmp(&self, other: &Size) -> Option { - self.points.partial_cmp(&other.points) - } - } - - impl Sum for Size { - fn sum(iter: I) -> Size where I: Iterator { - iter.fold(Size::zero(), Add::add) - } - } -} -- cgit v1.2.3