style/values/computed/
page.rs

1/* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this
3 * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
5//! Computed @page at-rule properties and named-page style properties
6
7use crate::derives::*;
8use crate::values::computed::length::NonNegativeLength;
9use crate::values::computed::{Context, ToComputedValue};
10use crate::values::generics;
11use crate::values::generics::size::Size2D;
12
13use crate::values::specified::page as specified;
14pub use generics::page::GenericPageSize;
15pub use generics::page::PageOrientation;
16pub use generics::page::PageSizeOrientation;
17pub use generics::page::PaperSize;
18pub use specified::PageName;
19
20/// Computed value of the @page size descriptor
21///
22/// The spec says that the computed value should be the same as the specified
23/// value but with all absolute units, but it's not currently possibly observe
24/// the computed value of page-size.
25#[derive(Clone, Copy, Debug, MallocSizeOf, PartialEq, ToCss, ToResolvedValue, ToShmem, ToTyped)]
26#[repr(C, u8)]
27pub enum PageSize {
28    /// Specified size, paper size, or paper size and orientation.
29    Size(Size2D<NonNegativeLength>),
30    /// `landscape` or `portrait` value, no specified size.
31    Orientation(PageSizeOrientation),
32    /// `auto` value
33    Auto,
34}
35
36impl ToComputedValue for specified::PageSize {
37    type ComputedValue = PageSize;
38
39    fn to_computed_value(&self, ctx: &Context) -> Self::ComputedValue {
40        match &*self {
41            Self::Size(s) => PageSize::Size(s.to_computed_value(ctx)),
42            Self::PaperSize(p, PageSizeOrientation::Landscape) => PageSize::Size(Size2D {
43                width: p.long_edge().to_computed_value(ctx),
44                height: p.short_edge().to_computed_value(ctx),
45            }),
46            Self::PaperSize(p, PageSizeOrientation::Portrait) => PageSize::Size(Size2D {
47                width: p.short_edge().to_computed_value(ctx),
48                height: p.long_edge().to_computed_value(ctx),
49            }),
50            Self::Orientation(o) => PageSize::Orientation(*o),
51            Self::Auto => PageSize::Auto,
52        }
53    }
54
55    fn from_computed_value(computed: &Self::ComputedValue) -> Self {
56        match *computed {
57            PageSize::Size(s) => Self::Size(ToComputedValue::from_computed_value(&s)),
58            PageSize::Orientation(o) => Self::Orientation(o),
59            PageSize::Auto => Self::Auto,
60        }
61    }
62}
63
64impl PageSize {
65    /// `auto` value.
66    #[inline]
67    pub fn auto() -> Self {
68        PageSize::Auto
69    }
70
71    /// Whether this is the `auto` value.
72    #[inline]
73    pub fn is_auto(&self) -> bool {
74        matches!(*self, PageSize::Auto)
75    }
76}