Create RGBAColor for colors compute to RGBA.

This commit is contained in:
Xidorn Quan 2017-06-08 10:42:26 +10:00
parent d0d170767d
commit bf77f81ed6
12 changed files with 135 additions and 91 deletions

View file

@ -422,8 +422,7 @@ pub trait FragmentDisplayListBuilding {
bounds: &Rect<Au>, bounds: &Rect<Au>,
stops: &[GradientItem], stops: &[GradientItem],
direction: &LineDirection, direction: &LineDirection,
repeating: bool, repeating: bool)
style: &ServoComputedValues)
-> display_list::Gradient; -> display_list::Gradient;
fn convert_radial_gradient(&self, fn convert_radial_gradient(&self,
@ -431,8 +430,7 @@ pub trait FragmentDisplayListBuilding {
stops: &[GradientItem], stops: &[GradientItem],
shape: &EndingShape, shape: &EndingShape,
center: &Position, center: &Position,
repeating: bool, repeating: bool)
style: &ServoComputedValues)
-> display_list::RadialGradient; -> display_list::RadialGradient;
/// Adds the display items necessary to paint the background linear gradient of this fragment /// Adds the display items necessary to paint the background linear gradient of this fragment
@ -634,8 +632,7 @@ fn build_border_radius_for_inner_rect(outer_rect: &Rect<Au>,
} }
fn convert_gradient_stops(gradient_items: &[GradientItem], fn convert_gradient_stops(gradient_items: &[GradientItem],
total_length: Au, total_length: Au) -> Vec<GradientStop> {
style: &ServoComputedValues) -> Vec<GradientStop> {
// Determine the position of each stop per CSS-IMAGES § 3.4. // Determine the position of each stop per CSS-IMAGES § 3.4.
// Only keep the color stops, discard the color interpolation hints. // Only keep the color stops, discard the color interpolation hints.
@ -722,7 +719,7 @@ fn convert_gradient_stops(gradient_items: &[GradientItem],
}; };
stops.push(GradientStop { stops.push(GradientStop {
offset: offset, offset: offset,
color: style.resolve_color(stop.color).to_gfx_color() color: stop.color.to_gfx_color()
}) })
} }
stops stops
@ -1192,8 +1189,7 @@ impl FragmentDisplayListBuilding for Fragment {
bounds: &Rect<Au>, bounds: &Rect<Au>,
stops: &[GradientItem], stops: &[GradientItem],
direction: &LineDirection, direction: &LineDirection,
repeating: bool, repeating: bool)
style: &ServoComputedValues)
-> display_list::Gradient { -> display_list::Gradient {
let angle = match *direction { let angle = match *direction {
LineDirection::Angle(angle) => angle.radians(), LineDirection::Angle(angle) => angle.radians(),
@ -1234,7 +1230,7 @@ impl FragmentDisplayListBuilding for Fragment {
let length = Au::from_f32_px( let length = Au::from_f32_px(
(delta.x.to_f32_px() * 2.0).hypot(delta.y.to_f32_px() * 2.0)); (delta.x.to_f32_px() * 2.0).hypot(delta.y.to_f32_px() * 2.0));
let mut stops = convert_gradient_stops(stops, length, style); let mut stops = convert_gradient_stops(stops, length);
// Only clamped gradients need to be fixed because in repeating gradients // Only clamped gradients need to be fixed because in repeating gradients
// there is no "first" or "last" stop because they repeat infinitly in // there is no "first" or "last" stop because they repeat infinitly in
@ -1258,8 +1254,7 @@ impl FragmentDisplayListBuilding for Fragment {
stops: &[GradientItem], stops: &[GradientItem],
shape: &EndingShape, shape: &EndingShape,
center: &Position, center: &Position,
repeating: bool, repeating: bool)
style: &ServoComputedValues)
-> display_list::RadialGradient { -> display_list::RadialGradient {
let center = Point2D::new(center.horizontal.to_used_value(bounds.size.width), let center = Point2D::new(center.horizontal.to_used_value(bounds.size.width),
center.vertical.to_used_value(bounds.size.height)); center.vertical.to_used_value(bounds.size.height));
@ -1278,7 +1273,7 @@ impl FragmentDisplayListBuilding for Fragment {
}, },
}; };
let mut stops = convert_gradient_stops(stops, radius.width, style); let mut stops = convert_gradient_stops(stops, radius.width);
// Repeating gradients have no last stops that can be ignored. So // Repeating gradients have no last stops that can be ignored. So
// fixup is not necessary but may actually break the gradient. // fixup is not necessary but may actually break the gradient.
if !repeating { if !repeating {
@ -1322,8 +1317,7 @@ impl FragmentDisplayListBuilding for Fragment {
let gradient = self.convert_linear_gradient(&bounds, let gradient = self.convert_linear_gradient(&bounds,
&gradient.items[..], &gradient.items[..],
angle_or_corner, angle_or_corner,
gradient.repeating, gradient.repeating);
style);
DisplayItem::Gradient(box GradientDisplayItem { DisplayItem::Gradient(box GradientDisplayItem {
base: base, base: base,
gradient: gradient, gradient: gradient,
@ -1334,8 +1328,7 @@ impl FragmentDisplayListBuilding for Fragment {
&gradient.items[..], &gradient.items[..],
shape, shape,
center, center,
gradient.repeating, gradient.repeating);
style);
DisplayItem::RadialGradient(box RadialGradientDisplayItem { DisplayItem::RadialGradient(box RadialGradientDisplayItem {
base: base, base: base,
gradient: gradient, gradient: gradient,
@ -1459,8 +1452,7 @@ impl FragmentDisplayListBuilding for Fragment {
let grad = self.convert_linear_gradient(&bounds, let grad = self.convert_linear_gradient(&bounds,
&gradient.items[..], &gradient.items[..],
&angle_or_corner, &angle_or_corner,
gradient.repeating, gradient.repeating);
style);
state.add_display_item(DisplayItem::Border(box BorderDisplayItem { state.add_display_item(DisplayItem::Border(box BorderDisplayItem {
base: base, base: base,
@ -1478,8 +1470,7 @@ impl FragmentDisplayListBuilding for Fragment {
&gradient.items[..], &gradient.items[..],
shape, shape,
center, center,
gradient.repeating, gradient.repeating);
style);
state.add_display_item(DisplayItem::Border(box BorderDisplayItem { state.add_display_item(DisplayItem::Border(box BorderDisplayItem {
base: base, base: base,
border_widths: border.to_physical(style.writing_mode), border_widths: border.to_physical(style.writing_mode),

View file

@ -183,7 +183,6 @@ impl nsStyleImage {
} }
fn set_gradient(&mut self, gradient: Gradient) { fn set_gradient(&mut self, gradient: Gradient) {
use cssparser::Color as CSSColor;
use gecko_bindings::structs::{NS_STYLE_GRADIENT_SHAPE_CIRCULAR, NS_STYLE_GRADIENT_SHAPE_ELLIPTICAL}; use gecko_bindings::structs::{NS_STYLE_GRADIENT_SHAPE_CIRCULAR, NS_STYLE_GRADIENT_SHAPE_ELLIPTICAL};
use gecko_bindings::structs::{NS_STYLE_GRADIENT_SHAPE_LINEAR, NS_STYLE_GRADIENT_SIZE_CLOSEST_CORNER}; use gecko_bindings::structs::{NS_STYLE_GRADIENT_SHAPE_LINEAR, NS_STYLE_GRADIENT_SIZE_CLOSEST_CORNER};
use gecko_bindings::structs::{NS_STYLE_GRADIENT_SIZE_CLOSEST_SIDE, NS_STYLE_GRADIENT_SIZE_EXPLICIT_SIZE}; use gecko_bindings::structs::{NS_STYLE_GRADIENT_SIZE_CLOSEST_SIDE, NS_STYLE_GRADIENT_SIZE_EXPLICIT_SIZE};
@ -321,19 +320,7 @@ impl nsStyleImage {
match *item { match *item {
GradientItem::ColorStop(ref stop) => { GradientItem::ColorStop(ref stop) => {
gecko_stop.mColor = match stop.color { gecko_stop.mColor = convert_rgba_to_nscolor(&stop.color);
CSSColor::CurrentColor => {
// TODO(emilio): gecko just stores an nscolor,
// and it doesn't seem to support currentColor
// as value in a gradient.
//
// Double-check it and either remove
// currentColor for servo or see how gecko
// handles this.
0
},
CSSColor::RGBA(ref rgba) => convert_rgba_to_nscolor(rgba),
};
gecko_stop.mIsInterpolationHint = false; gecko_stop.mIsInterpolationHint = false;
coord.set(stop.position); coord.set(stop.position);
}, },

View file

@ -11,7 +11,6 @@
<%namespace name="helpers" file="/helpers.mako.rs" /> <%namespace name="helpers" file="/helpers.mako.rs" />
use app_units::Au; use app_units::Au;
use cssparser::Color;
use custom_properties::ComputedValuesMap; use custom_properties::ComputedValuesMap;
use gecko_bindings::bindings; use gecko_bindings::bindings;
% for style_struct in data.style_structs: % for style_struct in data.style_structs:
@ -316,18 +315,6 @@ def set_gecko_property(ffi_name, expr):
} }
</%def> </%def>
/// Convert a Servo color into an nscolor; with currentColor as 0
///
/// Call sites will need to be updated after https://bugzilla.mozilla.org/show_bug.cgi?id=760345
fn color_to_nscolor_zero_currentcolor(color: Color) -> structs::nscolor {
match color {
Color::RGBA(rgba) => {
convert_rgba_to_nscolor(&rgba)
},
Color::CurrentColor => 0,
}
}
<%def name="impl_color_setter(ident, gecko_ffi_name, complex_color=True)"> <%def name="impl_color_setter(ident, gecko_ffi_name, complex_color=True)">
#[allow(unreachable_code)] #[allow(unreachable_code)]
#[allow(non_snake_case)] #[allow(non_snake_case)]
@ -335,7 +322,11 @@ fn color_to_nscolor_zero_currentcolor(color: Color) -> structs::nscolor {
% if complex_color: % if complex_color:
let result = v.into(); let result = v.into();
% else: % else:
let result = color_to_nscolor_zero_currentcolor(v); let result = match color {
Color::RGBA(rgba) => convert_rgba_to_nscolor(&rgba),
// FIXME handle currentcolor
Color::CurrentColor => 0,
};
% endif % endif
${set_gecko_property(gecko_ffi_name, "result")} ${set_gecko_property(gecko_ffi_name, "result")}
} }
@ -416,6 +407,20 @@ fn color_to_nscolor_zero_currentcolor(color: Color) -> structs::nscolor {
% endif % endif
</%def> </%def>
<%def name="impl_rgba_color(ident, gecko_ffi_name, need_clone=False)">
#[allow(non_snake_case)]
pub fn set_${ident}(&mut self, v: longhands::${ident}::computed_value::T) {
${set_gecko_property(gecko_ffi_name, "convert_rgba_to_nscolor(&v)")}
}
<%call expr="impl_simple_copy(ident, gecko_ffi_name)"></%call>
% if need_clone:
#[allow(non_snake_case)]
pub fn clone_${ident}(&self) -> longhands::${ident}::computed_value::T {
convert_nscolor_to_rgba(${get_gecko_property(gecko_ffi_name)})
}
% endif
</%def>
<%def name="impl_svg_paint(ident, gecko_ffi_name, need_clone=False, complex_color=True)"> <%def name="impl_svg_paint(ident, gecko_ffi_name, need_clone=False, complex_color=True)">
#[allow(non_snake_case)] #[allow(non_snake_case)]
pub fn set_${ident}(&mut self, mut v: longhands::${ident}::computed_value::T) { pub fn set_${ident}(&mut self, mut v: longhands::${ident}::computed_value::T) {
@ -444,14 +449,14 @@ fn color_to_nscolor_zero_currentcolor(color: Color) -> structs::nscolor {
SVGPaintKind::Color(color) => { SVGPaintKind::Color(color) => {
paint.mType = nsStyleSVGPaintType::eStyleSVGPaintType_Color; paint.mType = nsStyleSVGPaintType::eStyleSVGPaintType_Color;
unsafe { unsafe {
*paint.mPaint.mColor.as_mut() = color_to_nscolor_zero_currentcolor(color); *paint.mPaint.mColor.as_mut() = convert_rgba_to_nscolor(&color);
} }
} }
} }
if let Some(fallback) = fallback { if let Some(fallback) = fallback {
paint.mFallbackType = nsStyleSVGFallbackType::eStyleSVGFallbackType_Color; paint.mFallbackType = nsStyleSVGFallbackType::eStyleSVGFallbackType_Color;
paint.mFallbackColor = color_to_nscolor_zero_currentcolor(fallback); paint.mFallbackColor = convert_rgba_to_nscolor(&fallback);
} }
} }
@ -472,7 +477,7 @@ fn color_to_nscolor_zero_currentcolor(color: Color) -> structs::nscolor {
use self::structs::nsStyleSVGFallbackType; use self::structs::nsStyleSVGFallbackType;
let ref paint = ${get_gecko_property(gecko_ffi_name)}; let ref paint = ${get_gecko_property(gecko_ffi_name)};
let fallback = if let nsStyleSVGFallbackType::eStyleSVGFallbackType_Color = paint.mFallbackType { let fallback = if let nsStyleSVGFallbackType::eStyleSVGFallbackType_Color = paint.mFallbackType {
Some(Color::RGBA(convert_nscolor_to_rgba(paint.mFallbackColor))) Some(convert_nscolor_to_rgba(paint.mFallbackColor))
} else { } else {
None None
}; };
@ -485,7 +490,7 @@ fn color_to_nscolor_zero_currentcolor(color: Color) -> structs::nscolor {
SVGPaintKind::None SVGPaintKind::None
} }
nsStyleSVGPaintType::eStyleSVGPaintType_Color => { nsStyleSVGPaintType::eStyleSVGPaintType_Color => {
unsafe { SVGPaintKind::Color(Color::RGBA(convert_nscolor_to_rgba(*paint.mPaint.mColor.as_ref()))) } unsafe { SVGPaintKind::Color(convert_nscolor_to_rgba(*paint.mPaint.mColor.as_ref())) }
} }
}; };
SVGPaint { SVGPaint {
@ -717,6 +722,7 @@ impl Debug for ${style_struct.gecko_struct_name} {
"Integer": impl_simple, "Integer": impl_simple,
"Opacity": impl_simple, "Opacity": impl_simple,
"CSSColor": impl_color, "CSSColor": impl_color,
"RGBAColor": impl_rgba_color,
"SVGPaint": impl_svg_paint, "SVGPaint": impl_svg_paint,
"UrlOrNone": impl_css_url, "UrlOrNone": impl_css_url,
} }
@ -948,7 +954,7 @@ fn static_assert() {
structs::Side::eSide${to_camel_case(side.ident)}); structs::Side::eSide${to_camel_case(side.ident)});
} }
for color in colors { for color in colors {
let c = color_to_nscolor_zero_currentcolor(*color); let c = convert_rgba_to_nscolor(color);
unsafe { unsafe {
bindings::Gecko_AppendMozBorderColors(&mut self.gecko, bindings::Gecko_AppendMozBorderColors(&mut self.gecko,
structs::Side::eSide${to_camel_case(side.ident)}, structs::Side::eSide${to_camel_case(side.ident)},

View file

@ -2823,9 +2823,9 @@ impl From<IntermediateColor> for CSSParserColor {
} }
/// Animatable SVGPaint /// Animatable SVGPaint
pub type IntermediateSVGPaint = SVGPaint<IntermediateColor>; pub type IntermediateSVGPaint = SVGPaint<IntermediateRGBA>;
/// Animatable SVGPaintKind /// Animatable SVGPaintKind
pub type IntermediateSVGPaintKind = SVGPaintKind<IntermediateColor>; pub type IntermediateSVGPaintKind = SVGPaintKind<IntermediateRGBA>;
impl From<::values::computed::SVGPaint> for IntermediateSVGPaint { impl From<::values::computed::SVGPaint> for IntermediateSVGPaint {
fn from(paint: ::values::computed::SVGPaint) -> IntermediateSVGPaint { fn from(paint: ::values::computed::SVGPaint) -> IntermediateSVGPaint {

View file

@ -66,21 +66,21 @@ ${helpers.gecko_keyword_conversion(Keyword('border-style',
ignored_when_colors_disabled="True"> ignored_when_colors_disabled="True">
use std::fmt; use std::fmt;
use style_traits::ToCss; use style_traits::ToCss;
use values::specified::CSSColor; use values::specified::RGBAColor;
no_viewport_percentage!(SpecifiedValue); no_viewport_percentage!(SpecifiedValue);
pub mod computed_value { pub mod computed_value {
use values::computed::CSSColor; use cssparser::RGBA;
#[derive(Debug, Clone, PartialEq)] #[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "servo", derive(HeapSizeOf))] #[cfg_attr(feature = "servo", derive(HeapSizeOf))]
pub struct T(pub Option<Vec<CSSColor>>); pub struct T(pub Option<Vec<RGBA>>);
} }
#[derive(Debug, Clone, PartialEq)] #[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "servo", derive(HeapSizeOf))] #[cfg_attr(feature = "servo", derive(HeapSizeOf))]
pub enum SpecifiedValue { pub enum SpecifiedValue {
None, None,
Colors(Vec<CSSColor>), Colors(Vec<RGBAColor>),
} }
impl ToCss for computed_value::T { impl ToCss for computed_value::T {
@ -168,7 +168,7 @@ ${helpers.gecko_keyword_conversion(Keyword('border-style',
} }
let mut result = Vec::new(); let mut result = Vec::new();
while let Ok(value) = input.try(|i| CSSColor::parse(context, i)) { while let Ok(value) = input.try(|i| RGBAColor::parse(context, i)) {
result.push(value); result.push(value);
} }

View file

@ -20,8 +20,8 @@ ${helpers.single_keyword("vector-effect", "none non-scaling-stroke",
// Section 13 - Gradients and Patterns // Section 13 - Gradients and Patterns
${helpers.predefined_type( ${helpers.predefined_type(
"stop-color", "CSSColor", "stop-color", "RGBAColor",
"CSSParserColor::RGBA(RGBA::new(0, 0, 0, 255))", "RGBA::new(0, 0, 0, 255)",
products="gecko", products="gecko",
animation_value_type="none", animation_value_type="none",
spec="https://www.w3.org/TR/SVGTiny12/painting.html#StopColorProperty")} spec="https://www.w3.org/TR/SVGTiny12/painting.html#StopColorProperty")}
@ -34,8 +34,8 @@ ${helpers.predefined_type("stop-opacity", "Opacity", "1.0",
// Section 15 - Filter Effects // Section 15 - Filter Effects
${helpers.predefined_type( ${helpers.predefined_type(
"flood-color", "CSSColor", "flood-color", "RGBAColor",
"CSSParserColor::RGBA(RGBA::new(0, 0, 0, 255))", "RGBA::new(0, 0, 0, 255)",
products="gecko", products="gecko",
animation_value_type="none", animation_value_type="none",
spec="https://www.w3.org/TR/SVG/filters.html#FloodColorProperty")} spec="https://www.w3.org/TR/SVG/filters.html#FloodColorProperty")}
@ -45,8 +45,8 @@ ${helpers.predefined_type("flood-opacity", "Opacity",
spec="https://www.w3.org/TR/SVG/filters.html#FloodOpacityProperty")} spec="https://www.w3.org/TR/SVG/filters.html#FloodOpacityProperty")}
${helpers.predefined_type( ${helpers.predefined_type(
"lighting-color", "CSSColor", "lighting-color", "RGBAColor",
"CSSParserColor::RGBA(RGBA::new(255, 255, 255, 255))", "RGBA::new(255, 255, 255, 255)",
products="gecko", products="gecko",
animation_value_type="none", animation_value_type="none",
spec="https://www.w3.org/TR/SVG/filters.html#LightingColorProperty")} spec="https://www.w3.org/TR/SVG/filters.html#LightingColorProperty")}

View file

@ -0,0 +1,10 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
//! Computed color values.
use cssparser::RGBA;
/// Computed value type for the specified RGBAColor.
pub type RGBAColor = RGBA;

View file

@ -7,7 +7,7 @@
//! //!
//! [image]: https://drafts.csswg.org/css-images/#image-values //! [image]: https://drafts.csswg.org/css-images/#image-values
use cssparser::Color as CSSColor; use cssparser::RGBA;
use std::f32::consts::PI; use std::f32::consts::PI;
use std::fmt; use std::fmt;
use style_traits::ToCss; use style_traits::ToCss;
@ -35,7 +35,7 @@ pub type Gradient = GenericGradient<
Length, Length,
LengthOrPercentage, LengthOrPercentage,
Position, Position,
CSSColor, RGBA,
>; >;
/// A computed gradient kind. /// A computed gradient kind.
@ -60,10 +60,10 @@ pub enum LineDirection {
pub type EndingShape = GenericEndingShape<Length, LengthOrPercentage>; pub type EndingShape = GenericEndingShape<Length, LengthOrPercentage>;
/// A computed gradient item. /// A computed gradient item.
pub type GradientItem = GenericGradientItem<CSSColor, LengthOrPercentage>; pub type GradientItem = GenericGradientItem<RGBA, LengthOrPercentage>;
/// A computed color stop. /// A computed color stop.
pub type ColorStop = GenericColorStop<CSSColor, LengthOrPercentage>; pub type ColorStop = GenericColorStop<RGBA, LengthOrPercentage>;
/// Computed values for ImageRect. /// Computed values for ImageRect.
pub type ImageRect = GenericImageRect<NumberOrPercentage>; pub type ImageRect = GenericImageRect<NumberOrPercentage>;

View file

@ -28,6 +28,7 @@ pub use properties::animated_properties::TransitionProperty;
pub use self::background::BackgroundSize; pub use self::background::BackgroundSize;
pub use self::border::{BorderImageSlice, BorderImageWidth, BorderImageSideWidth}; pub use self::border::{BorderImageSlice, BorderImageWidth, BorderImageSideWidth};
pub use self::border::{BorderRadius, BorderCornerRadius}; pub use self::border::{BorderRadius, BorderCornerRadius};
pub use self::color::RGBAColor;
pub use self::image::{Gradient, GradientItem, ImageLayer, LineDirection, Image, ImageRect}; pub use self::image::{Gradient, GradientItem, ImageLayer, LineDirection, Image, ImageRect};
#[cfg(feature = "gecko")] #[cfg(feature = "gecko")]
pub use self::gecko::ScrollSnapPoint; pub use self::gecko::ScrollSnapPoint;
@ -48,6 +49,7 @@ pub use self::transform::{TimingFunction, TransformOrigin};
pub mod background; pub mod background;
pub mod basic_shape; pub mod basic_shape;
pub mod border; pub mod border;
pub mod color;
pub mod image; pub mod image;
#[cfg(feature = "gecko")] #[cfg(feature = "gecko")]
pub mod gecko; pub mod gecko;
@ -479,9 +481,9 @@ impl IntegerOrAuto {
} }
/// Computed SVG Paint value /// Computed SVG Paint value
pub type SVGPaint = ::values::generics::SVGPaint<CSSColor>; pub type SVGPaint = ::values::generics::SVGPaint<RGBA>;
/// Computed SVG Paint Kind value /// Computed SVG Paint Kind value
pub type SVGPaintKind = ::values::generics::SVGPaintKind<CSSColor>; pub type SVGPaintKind = ::values::generics::SVGPaintKind<RGBA>;
impl Default for SVGPaint { impl Default for SVGPaint {
fn default() -> Self { fn default() -> Self {
@ -497,7 +499,7 @@ impl SVGPaint {
pub fn black() -> Self { pub fn black() -> Self {
let rgba = RGBA::from_floats(0., 0., 0., 1.); let rgba = RGBA::from_floats(0., 0., 0., 1.);
SVGPaint { SVGPaint {
kind: ::values::generics::SVGPaintKind::Color(CSSColor::RGBA(rgba)), kind: ::values::generics::SVGPaintKind::Color(rgba),
fallback: None, fallback: None,
} }
} }

View file

@ -313,3 +313,56 @@ impl ToComputedValue for CSSColor {
}).into() }).into()
} }
} }
/// Specified color value, but resolved to just RGBA for computed value
/// with value from color property at the same context.
#[derive(Clone, PartialEq, Debug)]
#[cfg_attr(feature = "servo", derive(HeapSizeOf))]
pub struct RGBAColor(pub CSSColor);
no_viewport_percentage!(RGBAColor);
impl Parse for RGBAColor {
fn parse(context: &ParserContext, input: &mut Parser) -> Result<Self, ()> {
CSSColor::parse(context, input).map(RGBAColor)
}
}
impl ToCss for RGBAColor {
fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
self.0.to_css(dest)
}
}
impl ToComputedValue for RGBAColor {
type ComputedValue = RGBA;
fn to_computed_value(&self, context: &Context) -> RGBA {
match self.0.to_computed_value(context) {
CSSParserColor::RGBA(rgba) => rgba,
CSSParserColor::CurrentColor => context.style.get_color().clone_color(),
}
}
fn from_computed_value(computed: &RGBA) -> Self {
RGBAColor(CSSColor {
parsed: Color::RGBA(*computed),
authored: None,
})
}
}
impl From<Color> for RGBAColor {
fn from(color: Color) -> RGBAColor {
RGBAColor(CSSColor {
parsed: color,
authored: None,
})
}
}
impl From<CSSColor> for RGBAColor {
fn from(color: CSSColor) -> RGBAColor {
RGBAColor(color)
}
}

View file

@ -25,7 +25,7 @@ use values::generics::image::{LineDirection as GenericsLineDirection, ShapeExten
use values::generics::image::PaintWorklet; use values::generics::image::PaintWorklet;
use values::generics::position::Position as GenericPosition; use values::generics::position::Position as GenericPosition;
use values::specified::{Angle, CSSColor, Color, Length, LengthOrPercentage}; use values::specified::{Angle, CSSColor, Color, Length, LengthOrPercentage};
use values::specified::{Number, NumberOrPercentage, Percentage}; use values::specified::{Number, NumberOrPercentage, Percentage, RGBAColor};
use values::specified::position::{Position, PositionComponent, Side, X, Y}; use values::specified::position::{Position, PositionComponent, Side, X, Y};
use values::specified::url::SpecifiedUrl; use values::specified::url::SpecifiedUrl;
@ -43,7 +43,7 @@ pub type Gradient = GenericGradient<
Length, Length,
LengthOrPercentage, LengthOrPercentage,
Position, Position,
CSSColor, RGBAColor,
>; >;
/// A specified gradient kind. /// A specified gradient kind.
@ -72,10 +72,10 @@ pub enum LineDirection {
pub type EndingShape = GenericEndingShape<Length, LengthOrPercentage>; pub type EndingShape = GenericEndingShape<Length, LengthOrPercentage>;
/// A specified gradient item. /// A specified gradient item.
pub type GradientItem = GenericGradientItem<CSSColor, LengthOrPercentage>; pub type GradientItem = GenericGradientItem<RGBAColor, LengthOrPercentage>;
/// A computed color stop. /// A computed color stop.
pub type ColorStop = GenericColorStop<CSSColor, LengthOrPercentage>; pub type ColorStop = GenericColorStop<RGBAColor, LengthOrPercentage>;
/// Specified values for `moz-image-rect` /// Specified values for `moz-image-rect`
/// -moz-image-rect(<uri>, top, right, bottom, left); /// -moz-image-rect(<uri>, top, right, bottom, left);
@ -390,7 +390,7 @@ impl Gradient {
if color.parsed == Color::CurrentColor { if color.parsed == Color::CurrentColor {
return Err(()); return Err(());
} }
Ok((color, p)) Ok((color.into(), p))
})?; })?;
if reverse_stops { if reverse_stops {
p = 1. - p; p = 1. - p;
@ -405,11 +405,11 @@ impl Gradient {
if items.is_empty() { if items.is_empty() {
items = vec![ items = vec![
GenericGradientItem::ColorStop(GenericColorStop { GenericGradientItem::ColorStop(GenericColorStop {
color: CSSColor::transparent(), color: CSSColor::transparent().into(),
position: Some(Percentage(0.).into()), position: Some(Percentage(0.).into()),
}), }),
GenericGradientItem::ColorStop(GenericColorStop { GenericGradientItem::ColorStop(GenericColorStop {
color: CSSColor::transparent(), color: CSSColor::transparent().into(),
position: Some(Percentage(1.).into()), position: Some(Percentage(1.).into()),
}), }),
]; ];
@ -674,7 +674,7 @@ impl GradientItem {
impl Parse for ColorStop { impl Parse for ColorStop {
fn parse(context: &ParserContext, input: &mut Parser) -> Result<Self, ()> { fn parse(context: &ParserContext, input: &mut Parser) -> Result<Self, ()> {
Ok(ColorStop { Ok(ColorStop {
color: try!(CSSColor::parse(context, input)), color: try!(RGBAColor::parse(context, input)),
position: input.try(|i| LengthOrPercentage::parse(context, i)).ok(), position: input.try(|i| LengthOrPercentage::parse(context, i)).ok(),
}) })
} }

View file

@ -31,7 +31,7 @@ pub use self::align::{AlignItems, AlignJustifyContent, AlignJustifySelf, Justify
pub use self::background::BackgroundSize; pub use self::background::BackgroundSize;
pub use self::border::{BorderCornerRadius, BorderImageSlice, BorderImageWidth}; pub use self::border::{BorderCornerRadius, BorderImageSlice, BorderImageWidth};
pub use self::border::{BorderImageSideWidth, BorderRadius, BorderSideWidth}; pub use self::border::{BorderImageSideWidth, BorderRadius, BorderSideWidth};
pub use self::color::{CSSColor, Color}; pub use self::color::{CSSColor, Color, RGBAColor};
pub use self::rect::LengthOrNumberRect; pub use self::rect::LengthOrNumberRect;
#[cfg(feature = "gecko")] #[cfg(feature = "gecko")]
pub use self::gecko::ScrollSnapPoint; pub use self::gecko::ScrollSnapPoint;
@ -799,10 +799,10 @@ impl Shadow {
no_viewport_percentage!(SVGPaint); no_viewport_percentage!(SVGPaint);
/// Specified SVG Paint value /// Specified SVG Paint value
pub type SVGPaint = ::values::generics::SVGPaint<CSSColor>; pub type SVGPaint = ::values::generics::SVGPaint<RGBAColor>;
/// Specified SVG Paint Kind value /// Specified SVG Paint Kind value
pub type SVGPaintKind = ::values::generics::SVGPaintKind<CSSColor>; pub type SVGPaintKind = ::values::generics::SVGPaintKind<RGBAColor>;
impl ToComputedValue for SVGPaint { impl ToComputedValue for SVGPaint {
type ComputedValue = super::computed::SVGPaint; type ComputedValue = super::computed::SVGPaint;
@ -829,12 +829,7 @@ impl ToComputedValue for SVGPaintKind {
#[inline] #[inline]
fn to_computed_value(&self, context: &Context) -> Self::ComputedValue { fn to_computed_value(&self, context: &Context) -> Self::ComputedValue {
self.convert(|color| { self.convert(|color| color.to_computed_value(context))
match color.parsed {
Color::CurrentColor => cssparser::Color::RGBA(context.style().get_color().clone_color()),
_ => color.to_computed_value(context),
}
})
} }
#[inline] #[inline]