mirror of
https://github.com/servo/servo.git
synced 2025-08-07 06:25:32 +01:00
Implement viewport percentage length units ('vw', 'vh', 'vmin', 'vmax')
This commit is contained in:
parent
16a8047343
commit
bc1c44bbc2
3 changed files with 64 additions and 0 deletions
|
@ -34,6 +34,8 @@ impl Range<specified::Length> {
|
||||||
let initial_font_size = longhands::font_size::get_initial_value();
|
let initial_font_size = longhands::font_size::get_initial_value();
|
||||||
value.to_computed_value(initial_font_size, initial_font_size)
|
value.to_computed_value(initial_font_size, initial_font_size)
|
||||||
}
|
}
|
||||||
|
&specified::Length::ViewportPercentage(value) =>
|
||||||
|
value.to_computed_value(viewport_size),
|
||||||
_ => unreachable!()
|
_ => unreachable!()
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -19,6 +19,7 @@ use cssparser::{Parser, Color, RGBA, AtRuleParser, DeclarationParser,
|
||||||
DeclarationListParser, parse_important, ToCss};
|
DeclarationListParser, parse_important, ToCss};
|
||||||
use geom::num::Zero;
|
use geom::num::Zero;
|
||||||
use geom::SideOffsets2D;
|
use geom::SideOffsets2D;
|
||||||
|
use geom::size::Size2D;
|
||||||
|
|
||||||
use values::specified::BorderStyle;
|
use values::specified::BorderStyle;
|
||||||
use values::computed::{self, ToComputedValue};
|
use values::computed::{self, ToComputedValue};
|
||||||
|
@ -3732,6 +3733,7 @@ pub fn cascade(viewport_size: Size2D<Au>,
|
||||||
let inherited_font_style = inherited_style.get_font();
|
let inherited_font_style = inherited_style.get_font();
|
||||||
computed::Context {
|
computed::Context {
|
||||||
is_root_element: is_root_element,
|
is_root_element: is_root_element,
|
||||||
|
viewport_size: viewport_size,
|
||||||
inherited_font_weight: inherited_font_style.font_weight,
|
inherited_font_weight: inherited_font_style.font_weight,
|
||||||
inherited_font_size: inherited_font_style.font_size,
|
inherited_font_size: inherited_font_style.font_size,
|
||||||
inherited_height: inherited_style.get_box().height,
|
inherited_height: inherited_style.get_box().height,
|
||||||
|
|
|
@ -52,11 +52,14 @@ pub type CSSFloat = f64;
|
||||||
|
|
||||||
pub mod specified {
|
pub mod specified {
|
||||||
use std::ascii::AsciiExt;
|
use std::ascii::AsciiExt;
|
||||||
|
use std::cmp;
|
||||||
use std::f64::consts::PI;
|
use std::f64::consts::PI;
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
use std::fmt::{Formatter, Debug};
|
use std::fmt::{Formatter, Debug};
|
||||||
|
use std::num::{NumCast, ToPrimitive};
|
||||||
use url::Url;
|
use url::Url;
|
||||||
use cssparser::{self, Token, Parser, ToCss, CssStringWriter};
|
use cssparser::{self, Token, Parser, ToCss, CssStringWriter};
|
||||||
|
use geom::size::Size2D;
|
||||||
use parser::ParserContext;
|
use parser::ParserContext;
|
||||||
use text_writer::{self, TextWriter};
|
use text_writer::{self, TextWriter};
|
||||||
use util::geometry::Au;
|
use util::geometry::Au;
|
||||||
|
@ -154,6 +157,51 @@ pub mod specified {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, PartialEq, Copy)]
|
||||||
|
pub enum ViewportPercentageLength {
|
||||||
|
Vw(CSSFloat),
|
||||||
|
Vh(CSSFloat),
|
||||||
|
Vmin(CSSFloat),
|
||||||
|
Vmax(CSSFloat)
|
||||||
|
}
|
||||||
|
|
||||||
|
impl fmt::Debug for ViewportPercentageLength {
|
||||||
|
#[inline] fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { self.fmt_to_css(f) }
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ToCss for ViewportPercentageLength {
|
||||||
|
fn to_css<W>(&self, dest: &mut W) -> text_writer::Result where W: TextWriter {
|
||||||
|
match self {
|
||||||
|
&ViewportPercentageLength::Vw(length) => write!(dest, "{}vw", length),
|
||||||
|
&ViewportPercentageLength::Vh(length) => write!(dest, "{}vh", length),
|
||||||
|
&ViewportPercentageLength::Vmin(length) => write!(dest, "{}vmin", length),
|
||||||
|
&ViewportPercentageLength::Vmax(length) => write!(dest, "{}vmax", length)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ViewportPercentageLength {
|
||||||
|
pub fn to_computed_value(&self, viewport_size: Size2D<Au>) -> Au {
|
||||||
|
macro_rules! to_unit {
|
||||||
|
($viewport_dimension:expr) => {
|
||||||
|
$viewport_dimension.to_f64().unwrap() / 100.0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let value = match self {
|
||||||
|
&ViewportPercentageLength::Vw(length) =>
|
||||||
|
length * to_unit!(viewport_size.width),
|
||||||
|
&ViewportPercentageLength::Vh(length) =>
|
||||||
|
length * to_unit!(viewport_size.height),
|
||||||
|
&ViewportPercentageLength::Vmin(length) =>
|
||||||
|
length * to_unit!(cmp::min(viewport_size.width, viewport_size.height)),
|
||||||
|
&ViewportPercentageLength::Vmax(length) =>
|
||||||
|
length * to_unit!(cmp::max(viewport_size.width, viewport_size.height)),
|
||||||
|
};
|
||||||
|
NumCast::from(value).unwrap()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Clone, PartialEq, Copy)]
|
#[derive(Clone, PartialEq, Copy)]
|
||||||
pub struct CharacterWidth(pub i32);
|
pub struct CharacterWidth(pub i32);
|
||||||
|
|
||||||
|
@ -173,6 +221,8 @@ pub mod specified {
|
||||||
pub enum Length {
|
pub enum Length {
|
||||||
Absolute(Au), // application units
|
Absolute(Au), // application units
|
||||||
FontRelative(FontRelativeLength),
|
FontRelative(FontRelativeLength),
|
||||||
|
ViewportPercentage(ViewportPercentageLength),
|
||||||
|
|
||||||
/// HTML5 "character width", as defined in HTML5 § 14.5.4.
|
/// HTML5 "character width", as defined in HTML5 § 14.5.4.
|
||||||
///
|
///
|
||||||
/// This cannot be specified by the user directly and is only generated by
|
/// This cannot be specified by the user directly and is only generated by
|
||||||
|
@ -189,6 +239,7 @@ pub mod specified {
|
||||||
match self {
|
match self {
|
||||||
&Length::Absolute(length) => write!(dest, "{}px", length.to_subpx()),
|
&Length::Absolute(length) => write!(dest, "{}px", length.to_subpx()),
|
||||||
&Length::FontRelative(length) => length.to_css(dest),
|
&Length::FontRelative(length) => length.to_css(dest),
|
||||||
|
&Length::ViewportPercentage(length) => length.to_css(dest),
|
||||||
&Length::ServoCharacterWidth(_)
|
&Length::ServoCharacterWidth(_)
|
||||||
=> panic!("internal CSS values should never be serialized"),
|
=> panic!("internal CSS values should never be serialized"),
|
||||||
}
|
}
|
||||||
|
@ -232,6 +283,11 @@ pub mod specified {
|
||||||
"ex" => Ok(Length::FontRelative(FontRelativeLength::Ex(value))),
|
"ex" => Ok(Length::FontRelative(FontRelativeLength::Ex(value))),
|
||||||
"ch" => Err(()),
|
"ch" => Err(()),
|
||||||
"rem" => Ok(Length::FontRelative(FontRelativeLength::Rem(value))),
|
"rem" => Ok(Length::FontRelative(FontRelativeLength::Rem(value))),
|
||||||
|
// viewport percentages
|
||||||
|
"vw" => Ok(Length::ViewportPercentage(ViewportPercentageLength::Vw(value))),
|
||||||
|
"vh" => Ok(Length::ViewportPercentage(ViewportPercentageLength::Vh(value))),
|
||||||
|
"vmin" => Ok(Length::ViewportPercentage(ViewportPercentageLength::Vmin(value))),
|
||||||
|
"vmax" => Ok(Length::ViewportPercentage(ViewportPercentageLength::Vmax(value)))
|
||||||
_ => Err(())
|
_ => Err(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -701,6 +757,7 @@ pub mod computed {
|
||||||
use super::specified::{AngleOrCorner};
|
use super::specified::{AngleOrCorner};
|
||||||
use super::{specified, CSSFloat};
|
use super::{specified, CSSFloat};
|
||||||
pub use cssparser::Color as CSSColor;
|
pub use cssparser::Color as CSSColor;
|
||||||
|
use geom::size::Size2D;
|
||||||
use properties::longhands;
|
use properties::longhands;
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
use url::Url;
|
use url::Url;
|
||||||
|
@ -727,6 +784,7 @@ pub mod computed {
|
||||||
pub border_bottom_present: bool,
|
pub border_bottom_present: bool,
|
||||||
pub border_left_present: bool,
|
pub border_left_present: bool,
|
||||||
pub is_root_element: bool,
|
pub is_root_element: bool,
|
||||||
|
pub viewport_size: Size2D<Au>
|
||||||
// TODO, as needed: viewport size, etc.
|
// TODO, as needed: viewport size, etc.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -768,6 +826,8 @@ pub mod computed {
|
||||||
&specified::Length::Absolute(length) => length,
|
&specified::Length::Absolute(length) => length,
|
||||||
&specified::Length::FontRelative(length) =>
|
&specified::Length::FontRelative(length) =>
|
||||||
length.to_computed_value(context.font_size, context.root_font_size),
|
length.to_computed_value(context.font_size, context.root_font_size),
|
||||||
|
&specified::Length::ViewportPercentage(length) =>
|
||||||
|
length.to_computed_value(context.viewport_size),
|
||||||
&specified::Length::ServoCharacterWidth(length) =>
|
&specified::Length::ServoCharacterWidth(length) =>
|
||||||
length.to_computed_value(context.font_size)
|
length.to_computed_value(context.font_size)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue