mirror of
https://github.com/servo/servo.git
synced 2025-08-06 14:10:11 +01:00
style: Use a computed type for page-size which converts paper sizes to a Size2D
Differential Revision: https://phabricator.services.mozilla.com/D115842
This commit is contained in:
parent
4f0e0c888c
commit
c9d4f812e5
2 changed files with 100 additions and 26 deletions
|
@ -5,10 +5,71 @@
|
||||||
//! Computed @page at-rule properties
|
//! Computed @page at-rule properties
|
||||||
|
|
||||||
use crate::values::computed::length::NonNegativeLength;
|
use crate::values::computed::length::NonNegativeLength;
|
||||||
|
use crate::values::computed::{Context, ToComputedValue};
|
||||||
use crate::values::generics;
|
use crate::values::generics;
|
||||||
use crate::values::generics::size::Size2D;
|
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::Orientation;
|
||||||
pub use generics::page::PaperSize;
|
pub use generics::page::PaperSize;
|
||||||
|
|
||||||
/// Computed value of the @page size descriptor
|
/// Computed value of the @page size descriptor
|
||||||
pub type PageSize = generics::page::GenericPageSize<Size2D<NonNegativeLength>>;
|
///
|
||||||
|
/// 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<NonNegativeLength>),
|
||||||
|
/// `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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -4,22 +4,14 @@
|
||||||
|
|
||||||
//! @page at-rule properties
|
//! @page at-rule properties
|
||||||
|
|
||||||
|
use crate::values::generics::NonNegative;
|
||||||
|
use crate::values::specified::length::AbsoluteLength;
|
||||||
|
|
||||||
/// Page size names.
|
/// Page size names.
|
||||||
///
|
///
|
||||||
/// https://drafts.csswg.org/css-page-3/#typedef-page-size-page-size
|
/// https://drafts.csswg.org/css-page-3/#typedef-page-size-page-size
|
||||||
#[derive(
|
#[derive(
|
||||||
Clone,
|
Clone, Copy, Debug, Eq, MallocSizeOf, Parse, PartialEq, SpecifiedValueInfo, ToCss, ToShmem,
|
||||||
Copy,
|
|
||||||
Debug,
|
|
||||||
Eq,
|
|
||||||
MallocSizeOf,
|
|
||||||
Parse,
|
|
||||||
PartialEq,
|
|
||||||
SpecifiedValueInfo,
|
|
||||||
ToComputedValue,
|
|
||||||
ToCss,
|
|
||||||
ToResolvedValue,
|
|
||||||
ToShmem,
|
|
||||||
)]
|
)]
|
||||||
#[repr(u8)]
|
#[repr(u8)]
|
||||||
pub enum PaperSize {
|
pub enum PaperSize {
|
||||||
|
@ -45,6 +37,39 @@ pub enum PaperSize {
|
||||||
Ledger,
|
Ledger,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl PaperSize {
|
||||||
|
/// Gets the long edge length of the paper size
|
||||||
|
pub fn long_edge(&self) -> NonNegative<AbsoluteLength> {
|
||||||
|
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<AbsoluteLength> {
|
||||||
|
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
|
/// Paper orientation
|
||||||
///
|
///
|
||||||
/// https://drafts.csswg.org/css-page-3/#page-size-prop
|
/// https://drafts.csswg.org/css-page-3/#page-size-prop
|
||||||
|
@ -57,7 +82,6 @@ pub enum PaperSize {
|
||||||
Parse,
|
Parse,
|
||||||
PartialEq,
|
PartialEq,
|
||||||
SpecifiedValueInfo,
|
SpecifiedValueInfo,
|
||||||
ToComputedValue,
|
|
||||||
ToCss,
|
ToCss,
|
||||||
ToResolvedValue,
|
ToResolvedValue,
|
||||||
ToShmem,
|
ToShmem,
|
||||||
|
@ -73,18 +97,7 @@ pub enum Orientation {
|
||||||
/// Page size property
|
/// Page size property
|
||||||
///
|
///
|
||||||
/// https://drafts.csswg.org/css-page-3/#page-size-prop
|
/// https://drafts.csswg.org/css-page-3/#page-size-prop
|
||||||
#[derive(
|
#[derive(Clone, Copy, Debug, MallocSizeOf, PartialEq, SpecifiedValueInfo, ToCss, ToShmem)]
|
||||||
Clone,
|
|
||||||
Copy,
|
|
||||||
Debug,
|
|
||||||
MallocSizeOf,
|
|
||||||
PartialEq,
|
|
||||||
SpecifiedValueInfo,
|
|
||||||
ToComputedValue,
|
|
||||||
ToCss,
|
|
||||||
ToResolvedValue,
|
|
||||||
ToShmem,
|
|
||||||
)]
|
|
||||||
#[repr(C, u8)]
|
#[repr(C, u8)]
|
||||||
pub enum GenericPageSize<S> {
|
pub enum GenericPageSize<S> {
|
||||||
/// Page dimensions.
|
/// Page dimensions.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue