diff --git a/components/style/values/computed/page.rs b/components/style/values/computed/page.rs index d8ef03c1f6d..524f6ba468e 100644 --- a/components/style/values/computed/page.rs +++ b/components/style/values/computed/page.rs @@ -5,10 +5,71 @@ //! Computed @page at-rule properties use crate::values::computed::length::NonNegativeLength; +use crate::values::computed::{Context, ToComputedValue}; use crate::values::generics; use crate::values::generics::size::Size2D; +use crate::values::specified::page as specified; +pub use generics::page::GenericPageSize; pub use generics::page::Orientation; pub use generics::page::PaperSize; + /// Computed value of the @page size descriptor -pub type PageSize = generics::page::GenericPageSize>; +/// +/// The spec says that the computed value should be the same as the specified +/// value but with all absolute units, but it's not currently possibly observe +/// the computed value of page-size. +#[derive(Clone, Copy, Debug, MallocSizeOf, PartialEq, ToCss, ToResolvedValue, ToShmem)] +#[repr(C, u8)] +pub enum PageSize { + /// Specified size, paper size, or paper size and orientation. + Size(Size2D), + /// `landscape` or `portrait` value, no specified size. + Orientation(Orientation), + /// `auto` value + Auto, +} + +impl ToComputedValue for specified::PageSize { + type ComputedValue = PageSize; + + fn to_computed_value(&self, ctx: &Context) -> Self::ComputedValue { + match &*self { + Self::Size(s) => PageSize::Size(s.to_computed_value(ctx)), + Self::PaperSizeAndOrientation(p, Orientation::Landscape) => PageSize::Size(Size2D { + width: p.long_edge().to_computed_value(ctx), + height: p.short_edge().to_computed_value(ctx), + }), + Self::PaperSizeAndOrientation(p, Orientation::Portrait) | Self::PaperSize(p) => { + PageSize::Size(Size2D { + width: p.short_edge().to_computed_value(ctx), + height: p.long_edge().to_computed_value(ctx), + }) + }, + Self::Orientation(o) => PageSize::Orientation(*o), + Self::Auto => PageSize::Auto, + } + } + + fn from_computed_value(computed: &Self::ComputedValue) -> Self { + match *computed { + PageSize::Size(s) => Self::Size(ToComputedValue::from_computed_value(&s)), + PageSize::Orientation(o) => Self::Orientation(o), + PageSize::Auto => Self::Auto, + } + } +} + +impl PageSize { + /// `auto` value. + #[inline] + pub fn auto() -> Self { + PageSize::Auto + } + + /// Whether this is the `auto` value. + #[inline] + pub fn is_auto(&self) -> bool { + matches!(*self, PageSize::Auto) + } +} diff --git a/components/style/values/generics/page.rs b/components/style/values/generics/page.rs index 35ffee7b97e..6f561710491 100644 --- a/components/style/values/generics/page.rs +++ b/components/style/values/generics/page.rs @@ -4,22 +4,14 @@ //! @page at-rule properties +use crate::values::generics::NonNegative; +use crate::values::specified::length::AbsoluteLength; + /// Page size names. /// /// https://drafts.csswg.org/css-page-3/#typedef-page-size-page-size #[derive( - Clone, - Copy, - Debug, - Eq, - MallocSizeOf, - Parse, - PartialEq, - SpecifiedValueInfo, - ToComputedValue, - ToCss, - ToResolvedValue, - ToShmem, + Clone, Copy, Debug, Eq, MallocSizeOf, Parse, PartialEq, SpecifiedValueInfo, ToCss, ToShmem, )] #[repr(u8)] pub enum PaperSize { @@ -45,6 +37,39 @@ pub enum PaperSize { Ledger, } +impl PaperSize { + /// Gets the long edge length of the paper size + pub fn long_edge(&self) -> NonNegative { + NonNegative(match *self { + PaperSize::A5 => AbsoluteLength::Mm(210.0), + PaperSize::A4 => AbsoluteLength::Mm(297.0), + PaperSize::A3 => AbsoluteLength::Mm(420.0), + PaperSize::B5 => AbsoluteLength::Mm(250.0), + PaperSize::B4 => AbsoluteLength::Mm(353.0), + PaperSize::JisB5 => AbsoluteLength::Mm(257.0), + PaperSize::JisB4 => AbsoluteLength::Mm(364.0), + PaperSize::Letter => AbsoluteLength::In(11.0), + PaperSize::Legal => AbsoluteLength::In(14.0), + PaperSize::Ledger => AbsoluteLength::In(17.0), + }) + } + /// Gets the short edge length of the paper size + pub fn short_edge(&self) -> NonNegative { + NonNegative(match *self { + PaperSize::A5 => AbsoluteLength::Mm(148.0), + PaperSize::A4 => AbsoluteLength::Mm(210.0), + PaperSize::A3 => AbsoluteLength::Mm(297.0), + PaperSize::B5 => AbsoluteLength::Mm(176.0), + PaperSize::B4 => AbsoluteLength::Mm(250.0), + PaperSize::JisB5 => AbsoluteLength::Mm(182.0), + PaperSize::JisB4 => AbsoluteLength::Mm(257.0), + PaperSize::Letter => AbsoluteLength::In(8.5), + PaperSize::Legal => AbsoluteLength::In(8.5), + PaperSize::Ledger => AbsoluteLength::In(11.0), + }) + } +} + /// Paper orientation /// /// https://drafts.csswg.org/css-page-3/#page-size-prop @@ -57,7 +82,6 @@ pub enum PaperSize { Parse, PartialEq, SpecifiedValueInfo, - ToComputedValue, ToCss, ToResolvedValue, ToShmem, @@ -73,18 +97,7 @@ pub enum Orientation { /// Page size property /// /// https://drafts.csswg.org/css-page-3/#page-size-prop -#[derive( - Clone, - Copy, - Debug, - MallocSizeOf, - PartialEq, - SpecifiedValueInfo, - ToComputedValue, - ToCss, - ToResolvedValue, - ToShmem, -)] +#[derive(Clone, Copy, Debug, MallocSizeOf, PartialEq, SpecifiedValueInfo, ToCss, ToShmem)] #[repr(C, u8)] pub enum GenericPageSize { /// Page dimensions.