mirror of
https://github.com/servo/servo.git
synced 2025-08-03 12:40:06 +01:00
Use array instead of linked list for -moz-border-*-colors
This commit is contained in:
parent
a5282cabe0
commit
18a555eaeb
4 changed files with 176 additions and 102 deletions
|
@ -1272,6 +1272,34 @@ fn static_assert() {
|
|||
border-image-repeat border-image-width border-image-slice
|
||||
${skip_moz_border_color_longhands}">
|
||||
|
||||
fn set_moz_border_colors(&mut self, side: structs::Side, v: Option<Vec<::cssparser::RGBA>>) {
|
||||
match v {
|
||||
None => {
|
||||
let ptr = self.gecko.mBorderColors.mPtr;
|
||||
if let Some(colors) = unsafe { ptr.as_mut() } {
|
||||
unsafe { colors.mColors[side as usize].clear() };
|
||||
}
|
||||
}
|
||||
Some(ref colors) => {
|
||||
unsafe { bindings::Gecko_EnsureMozBorderColors(&mut self.gecko) };
|
||||
let border_colors = unsafe { self.gecko.mBorderColors.mPtr.as_mut().unwrap() };
|
||||
let dest_colors = &mut border_colors.mColors[side as usize];
|
||||
unsafe { dest_colors.set_len_pod(colors.len() as u32) };
|
||||
for (dst, src) in dest_colors.iter_mut().zip(colors.into_iter()) {
|
||||
*dst = convert_rgba_to_nscolor(src);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn clone_moz_border_colors(&self, side: structs::Side) -> Option<Vec<::cssparser::RGBA>> {
|
||||
unsafe { self.gecko.mBorderColors.mPtr.as_ref() }.map(|colors| {
|
||||
colors.mColors[side as usize].iter()
|
||||
.map(|color| convert_nscolor_to_rgba(*color))
|
||||
.collect()
|
||||
})
|
||||
}
|
||||
|
||||
% for side in SIDES:
|
||||
<% impl_keyword("border_%s_style" % side.ident,
|
||||
"mBorderStyle[%s]" % side.index,
|
||||
|
@ -1322,29 +1350,7 @@ fn static_assert() {
|
|||
#[allow(non_snake_case)]
|
||||
pub fn set__moz_border_${side.ident}_colors(&mut self,
|
||||
v: longhands::_moz_border_${side.ident}_colors::computed_value::T) {
|
||||
match v.0 {
|
||||
None => {
|
||||
unsafe {
|
||||
bindings::Gecko_ClearMozBorderColors(&mut self.gecko,
|
||||
structs::Side::eSide${to_camel_case(side.ident)});
|
||||
}
|
||||
},
|
||||
Some(ref colors) => {
|
||||
unsafe {
|
||||
bindings::Gecko_EnsureMozBorderColors(&mut self.gecko);
|
||||
bindings::Gecko_ClearMozBorderColors(&mut self.gecko,
|
||||
structs::Side::eSide${to_camel_case(side.ident)});
|
||||
}
|
||||
for color in colors {
|
||||
let c = convert_rgba_to_nscolor(color);
|
||||
unsafe {
|
||||
bindings::Gecko_AppendMozBorderColors(&mut self.gecko,
|
||||
structs::Side::eSide${to_camel_case(side.ident)},
|
||||
c);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
self.set_moz_border_colors(structs::Side::eSide${to_camel_case(side.ident)}, v.0);
|
||||
}
|
||||
|
||||
#[allow(non_snake_case)]
|
||||
|
@ -1364,24 +1370,7 @@ fn static_assert() {
|
|||
pub fn clone__moz_border_${side.ident}_colors(&self)
|
||||
-> longhands::_moz_border_${side.ident}_colors::computed_value::T {
|
||||
use self::longhands::_moz_border_${side.ident}_colors::computed_value::T;
|
||||
|
||||
let mut gecko_colors =
|
||||
unsafe { bindings::Gecko_GetMozBorderColors(&self.gecko,
|
||||
structs::Side::eSide${to_camel_case(side.ident)}) };
|
||||
|
||||
if gecko_colors.is_null() {
|
||||
return T(None);
|
||||
}
|
||||
|
||||
let mut colors = Vec::new();
|
||||
loop {
|
||||
unsafe {
|
||||
colors.push(convert_nscolor_to_rgba((*gecko_colors).mColor));
|
||||
if (*gecko_colors).mNext.is_null() { break; }
|
||||
gecko_colors = (*gecko_colors).mNext;
|
||||
}
|
||||
}
|
||||
T(Some(colors))
|
||||
T(self.clone_moz_border_colors(structs::Side::eSide${to_camel_case(side.ident)}))
|
||||
}
|
||||
% endfor
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue