auto merge of #978 : ryanhc/servo/renderbox-cache, r=metajack

This commit is contained in:
bors-servo 2013-09-25 20:06:42 -07:00
commit a3bad43e8a
2 changed files with 92 additions and 38 deletions

View file

@ -114,6 +114,11 @@ impl TextRenderBox {
pub struct UnscannedTextRenderBox {
base: RenderBoxBase,
text: ~str,
// Cache font-style and text-decoration to check whether
// this box can merge with another render box.
font_style: Option<FontStyle>,
text_decoration: Option<CSSTextDecoration>,
}
impl UnscannedTextRenderBox {
@ -128,6 +133,8 @@ impl UnscannedTextRenderBox {
UnscannedTextRenderBox {
base: base,
text: text_node.element.data.to_str(),
font_style: None,
text_decoration: None,
}
}
}
@ -824,9 +831,10 @@ impl RenderBox {
/// Converts this node's computed style to a font style used for rendering.
pub fn font_style(&self) -> FontStyle {
let my_style = self.nearest_ancestor_element().style();
fn get_font_style(element: AbstractNode<LayoutView>) -> FontStyle {
let my_style = element.style();
debug!("(font style) start: %?", self.nearest_ancestor_element().type_id());
debug!("(font style) start: %?", element.type_id());
// FIXME: Too much allocation here.
let font_families = do my_style.font_family().map |family| {
@ -865,6 +873,30 @@ impl RenderBox {
}
}
let font_style_cached = match *self {
UnscannedTextRenderBoxClass(ref box) => {
match box.font_style {
Some(ref style) => Some(style.clone()),
None => None
}
}
_ => None
};
if font_style_cached.is_some() {
return font_style_cached.unwrap();
} else {
let font_style = get_font_style(self.nearest_ancestor_element());
match *self {
UnscannedTextRenderBoxClass(ref box) => {
box.font_style = Some(font_style.clone());
}
_ => ()
}
return font_style;
}
}
/// Returns the text alignment of the computed style of the nearest ancestor-or-self `Element`
/// node.
pub fn text_align(&self) -> CSSTextAlign {
@ -916,7 +948,29 @@ impl RenderBox {
text_decoration
}
}
get_propagated_text_decoration(self.nearest_ancestor_element())
let text_decoration_cached = match *self {
UnscannedTextRenderBoxClass(ref box) => {
match box.text_decoration {
Some(ref decoration) => Some(decoration.clone()),
None => None
}
}
_ => None
};
if text_decoration_cached.is_some() {
return text_decoration_cached.unwrap();
} else {
let text_decoration = get_propagated_text_decoration(self.nearest_ancestor_element());
match *self {
UnscannedTextRenderBoxClass(ref box) => {
box.text_decoration = Some(text_decoration.clone());
}
_ => ()
}
return text_decoration;
}
}
/// Dumps this node, for debugging.

@ -1 +1 @@
Subproject commit 33df32548180b55cc96a22d1ff84aafe8e38503b
Subproject commit 6d44ce5cc97ccb3bfa9c06833b852921025d9b14