Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Factor out CSS length to Au conversion #663

Merged
merged 1 commit into from Aug 2, 2013
Merged
Changes from all commits
Commits
File filter...
Filter file types
Jump to…
Jump to file
Failed to load files.

Always

Just for now

Factor out CSS length to Au conversion

  • Loading branch information
sanxiyn committed Aug 2, 2013
commit 018e2204956bd0778280372ef33d215f1a9cd036
@@ -8,7 +8,7 @@ use std::num::Zero;
use geom::side_offsets::SideOffsets2D;
use gfx::geometry::Au;
use newcss::complete::CompleteStyle;
use newcss::units::{Em, Pt, Px};
use newcss::units::{Length, Em, Pt, Px};
use newcss::values::{CSSBorderWidth, CSSBorderWidthLength, CSSBorderWidthMedium};
use newcss::values::{CSSBorderWidthThick, CSSBorderWidthThin, CSSFontSize, CSSFontSizeLength};
use newcss::values::{CSSWidth, CSSWidthLength, CSSWidthPercentage, CSSWidthAuto};
@@ -24,6 +24,20 @@ pub struct BoxModel {
content_box_width: Au,
}

fn from_length(length: Length, font_size: CSSFontSize) -> Au {
match length {
Px(v) => Au::from_frac_px(v),
Pt(v) => Au::from_pt(v),
Em(em) => {
match font_size {
CSSFontSizeLength(Px(v)) => Au::from_frac_px(em * v),
CSSFontSizeLength(Pt(v)) => Au::from_pt(em * v),
_ => fail!("expected non-relative font size")
}
}
}
}

/// Useful helper data type when computing values for blocks and positioned elements.
pub enum MaybeAuto {
Auto,
@@ -35,48 +49,23 @@ impl MaybeAuto {
match margin {
CSSMarginAuto => Auto,
CSSMarginPercentage(percent) => Specified(containing_width.scale_by(percent/100.0)),
CSSMarginLength(Px(v)) => Specified(Au::from_frac_px(v)),
CSSMarginLength(Pt(v)) => Specified(Au::from_pt(v)),
CSSMarginLength(Em(em)) => {
match font_size {
CSSFontSizeLength(Px(v)) => Specified(Au::from_frac_px(em * v)),
CSSFontSizeLength(Pt(v)) => Specified(Au::from_pt(em * v)),
_ => fail!(~"expected non-relative font size"),
}
}
CSSMarginLength(length) => Specified(from_length(length, font_size))
}
}

pub fn from_width(width: CSSWidth, containing_width: Au, font_size: CSSFontSize) -> MaybeAuto {
match width {
CSSWidthAuto => Auto,
CSSWidthPercentage(percent) => Specified(containing_width.scale_by(percent/100.0)),
CSSWidthLength(Px(v)) => Specified(Au::from_frac_px(v)),
CSSWidthLength(Pt(v)) => Specified(Au::from_pt(v)),
CSSWidthLength(Em(em)) => {
match font_size {
CSSFontSizeLength(Px(v)) => Specified(Au::from_frac_px(em * v)),
CSSFontSizeLength(Pt(v)) => Specified(Au::from_pt(em * v)),
_ => fail!(~"expected non-relative font size"),
}
}
CSSWidthLength(length) => Specified(from_length(length, font_size))
}
}

pub fn from_height(height: CSSHeight, cb_height: Au, font_size: CSSFontSize) -> MaybeAuto {
match height {
CSSHeightAuto => Auto,
CSSHeightPercentage(percent) => Specified(cb_height.scale_by(percent/100.0)),
CSSHeightLength(Px(v)) => Specified(Au::from_frac_px(v)),
CSSHeightLength(Pt(v)) => Specified(Au::from_pt(v)),
CSSHeightLength(Em(em)) => {
match font_size {
CSSFontSizeLength(Px(v)) => Specified(Au::from_frac_px(em * v)),
CSSFontSizeLength(Pt(v)) => Specified(Au::from_pt(em * v)),
_ => fail!(~"expected non-relative font size"),
}
}

CSSHeightLength(length) => Specified(from_length(length, font_size))
}
}

@@ -137,15 +126,7 @@ impl BoxModel {
/// Helper function to compute the border width in app units from the CSS border width.
pub fn compute_border_width(&self, width: CSSBorderWidth, font_size: CSSFontSize) -> Au {
match width {
CSSBorderWidthLength(Px(v)) => Au::from_frac_px(v),
CSSBorderWidthLength(Pt(v)) => Au::from_pt(v),
CSSBorderWidthLength(Em(em)) => {
match font_size {
CSSFontSizeLength(Px(v)) => Au::from_frac_px(em * v),
CSSFontSizeLength(Pt(v)) => Au::from_pt(em * v),
_ => fail!(~"expected non-relative font size"),
}
},
CSSBorderWidthLength(length) => from_length(length, font_size),
CSSBorderWidthThin => Au::from_px(1),
CSSBorderWidthMedium => Au::from_px(5),
CSSBorderWidthThick => Au::from_px(10),
@@ -154,15 +135,7 @@ impl BoxModel {

pub fn compute_padding_length(&self, padding: CSSPadding, content_box_width: Au, font_size: CSSFontSize) -> Au {
match padding {
CSSPaddingLength(Px(v)) => Au::from_frac_px(v),
CSSPaddingLength(Pt(v)) => Au::from_pt(v),
CSSPaddingLength(Em(em)) => {
match font_size {
CSSFontSizeLength(Px(v)) => Au::from_frac_px(em * v),
CSSFontSizeLength(Pt(v)) => Au::from_pt(em * v),
_ => fail!(~"expected non-relative font size"),
}
},
CSSPaddingLength(length) => from_length(length, font_size),
CSSPaddingPercentage(p) => content_box_width.scale_by(p/100.0)
}
}
ProTip! Use n and p to navigate between commits in a pull request.
You can’t perform that action at this time.