mirror of
https://github.com/servo/servo.git
synced 2025-08-03 04:30:10 +01:00
style: Avoid allocating a unique nsStyleSVG and nsStyleBackground per element.
Should also help with https://bugzilla.mozilla.org/show_bug.cgi?id=1360881
This commit is contained in:
parent
3b857f1c4e
commit
54f33a6bfd
2 changed files with 23 additions and 9 deletions
|
@ -2774,10 +2774,6 @@ fn static_assert() {
|
|||
% for member in fill_fields.split():
|
||||
max_len = cmp::max(max_len, self.gecko.${image_layers_field}.${member}Count);
|
||||
% endfor
|
||||
|
||||
// XXXManishearth Gecko does an optimization here where it only
|
||||
// fills things in if any of the properties have been set
|
||||
|
||||
unsafe {
|
||||
// While we could do this manually, we'd need to also manually
|
||||
// run all the copy constructors, so we just delegate to gecko
|
||||
|
|
|
@ -2044,6 +2044,15 @@ impl<'a, T: 'a> StyleStructRef<'a, T>
|
|||
}
|
||||
}
|
||||
|
||||
/// Get a mutable reference to the owned struct, or `None` if the struct
|
||||
/// hasn't been mutated.
|
||||
pub fn get_if_mutated(&mut self) -> Option<<&mut T> {
|
||||
match *self {
|
||||
StyleStructRef::Owned(ref mut v) => Some(v),
|
||||
StyleStructRef::Borrowed(..) => None,
|
||||
}
|
||||
}
|
||||
|
||||
/// Returns an `Arc` to the internal struct, constructing one if
|
||||
/// appropriate.
|
||||
pub fn build(self) -> Arc<T> {
|
||||
|
@ -2141,6 +2150,13 @@ impl<'a> StyleBuilder<'a> {
|
|||
pub fn mutate_${style_struct.name_lower}(&mut self) -> &mut style_structs::${style_struct.name} {
|
||||
self.${style_struct.ident}.mutate()
|
||||
}
|
||||
|
||||
/// Gets a mutable view of the current `${style_struct.name}` style,
|
||||
/// only if it's been mutated before.
|
||||
pub fn get_${style_struct.name_lower}_if_mutated(&mut self)
|
||||
-> Option<<&mut style_structs::${style_struct.name}> {
|
||||
self.${style_struct.ident}.get_if_mutated()
|
||||
}
|
||||
% endfor
|
||||
|
||||
/// Returns whether this computed style represents a floated object.
|
||||
|
@ -2546,11 +2562,13 @@ pub fn apply_declarations<'a, F, I>(device: &Device,
|
|||
}
|
||||
|
||||
% if product == "gecko":
|
||||
// FIXME(emilio): This is effectively creating a new nsStyleBackground
|
||||
// and nsStyleSVG per element. We should only do this when necessary
|
||||
// using the `seen` bitfield!
|
||||
style.mutate_background().fill_arrays();
|
||||
style.mutate_svg().fill_arrays();
|
||||
if let Some(ref mut bg) = style.get_background_if_mutated() {
|
||||
bg.fill_arrays();
|
||||
}
|
||||
|
||||
if let Some(ref mut svg) = style.get_svg_if_mutated() {
|
||||
svg.fill_arrays();
|
||||
}
|
||||
% endif
|
||||
|
||||
if is_root_element {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue