mirror of
https://github.com/servo/servo.git
synced 2025-08-05 05:30:08 +01:00
style: Remove the last usage of lossy currentcolor.
We don't have lossy currentcolor in the style system anymore, except for a single property -moz-font-smoothing-background-color. I could've converted it into a proper StyleColor and thread down all the necessary information to the font metrics code. But it doesn't really seem worth it given it's not exposed to the web, so I just did the simplest thing, which is making currentcolor compute to transparent to that specific property. This patch also removes the stores_complex_colors_lossily code and related, since now we always can cache computed colors. Differential Revision: https://phabricator.services.mozilla.com/D26187
This commit is contained in:
parent
681f861018
commit
5d2724994c
8 changed files with 24 additions and 78 deletions
|
@ -40,8 +40,6 @@ use crate::gecko_bindings::structs::nsCSSPropertyID;
|
||||||
use crate::gecko_bindings::structs::mozilla::PseudoStyleType;
|
use crate::gecko_bindings::structs::mozilla::PseudoStyleType;
|
||||||
use crate::gecko_bindings::sugar::ns_style_coord::{CoordDataValue, CoordData, CoordDataMut};
|
use crate::gecko_bindings::sugar::ns_style_coord::{CoordDataValue, CoordData, CoordDataMut};
|
||||||
use crate::gecko_bindings::sugar::refptr::RefPtr;
|
use crate::gecko_bindings::sugar::refptr::RefPtr;
|
||||||
use crate::gecko::values::convert_nscolor_to_rgba;
|
|
||||||
use crate::gecko::values::convert_rgba_to_nscolor;
|
|
||||||
use crate::gecko::values::GeckoStyleCoordConvertible;
|
use crate::gecko::values::GeckoStyleCoordConvertible;
|
||||||
use crate::gecko::values::round_border_to_device_pixels;
|
use crate::gecko::values::round_border_to_device_pixels;
|
||||||
use crate::logical_geometry::WritingMode;
|
use crate::logical_geometry::WritingMode;
|
||||||
|
@ -421,18 +419,6 @@ def set_gecko_property(ffi_name, expr):
|
||||||
}
|
}
|
||||||
</%def>
|
</%def>
|
||||||
|
|
||||||
<%def name="impl_rgba_color(ident, gecko_ffi_name)">
|
|
||||||
#[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>
|
|
||||||
#[allow(non_snake_case)]
|
|
||||||
pub fn clone_${ident}(&self) -> longhands::${ident}::computed_value::T {
|
|
||||||
convert_nscolor_to_rgba(${get_gecko_property(gecko_ffi_name)})
|
|
||||||
}
|
|
||||||
</%def>
|
|
||||||
|
|
||||||
<%def name="impl_svg_length(ident, gecko_ffi_name)">
|
<%def name="impl_svg_length(ident, gecko_ffi_name)">
|
||||||
// When context-value is used on an SVG length, the corresponding flag is
|
// When context-value is used on an SVG length, the corresponding flag is
|
||||||
// set on mContextFlags, and the length field is set to the initial value.
|
// set on mContextFlags, and the length field is set to the initial value.
|
||||||
|
@ -1206,7 +1192,6 @@ impl Clone for ${style_struct.gecko_struct_name} {
|
||||||
predefined_types = {
|
predefined_types = {
|
||||||
"length::NonNegativeLengthPercentageOrNormal": impl_style_coord,
|
"length::NonNegativeLengthPercentageOrNormal": impl_style_coord,
|
||||||
"MozScriptMinSize": impl_absolute_length,
|
"MozScriptMinSize": impl_absolute_length,
|
||||||
"RGBAColor": impl_rgba_color,
|
|
||||||
"SVGLength": impl_svg_length,
|
"SVGLength": impl_svg_length,
|
||||||
"SVGOpacity": impl_svg_opacity,
|
"SVGOpacity": impl_svg_opacity,
|
||||||
"SVGPaint": impl_svg_paint,
|
"SVGPaint": impl_svg_paint,
|
||||||
|
@ -4343,8 +4328,7 @@ clip-path
|
||||||
}
|
}
|
||||||
</%self:impl_trait>
|
</%self:impl_trait>
|
||||||
|
|
||||||
<%self:impl_trait style_struct_name="Color" skip_longhands="color">
|
<%self:impl_trait style_struct_name="Color">
|
||||||
${impl_rgba_color("color", "mColor")}
|
|
||||||
</%self:impl_trait>
|
</%self:impl_trait>
|
||||||
|
|
||||||
<%self:impl_trait style_struct_name="InheritedUI" skip_longhands="cursor">
|
<%self:impl_trait style_struct_name="InheritedUI" skip_longhands="cursor">
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
${helpers.predefined_type(
|
${helpers.predefined_type(
|
||||||
"background-color",
|
"background-color",
|
||||||
"Color",
|
"Color",
|
||||||
"computed_value::T::transparent()",
|
"computed::Color::transparent()",
|
||||||
initial_specified_value="SpecifiedValue::transparent()",
|
initial_specified_value="SpecifiedValue::transparent()",
|
||||||
spec="https://drafts.csswg.org/css-backgrounds/#background-color",
|
spec="https://drafts.csswg.org/css-backgrounds/#background-color",
|
||||||
animation_value_type="AnimatedColor",
|
animation_value_type="AnimatedColor",
|
||||||
|
|
|
@ -521,9 +521,9 @@ ${helpers.single_keyword(
|
||||||
|
|
||||||
${helpers.predefined_type(
|
${helpers.predefined_type(
|
||||||
"-moz-font-smoothing-background-color",
|
"-moz-font-smoothing-background-color",
|
||||||
"RGBAColor",
|
"color::MozFontSmoothingBackgroundColor",
|
||||||
"RGBA::transparent()",
|
"computed::color::MozFontSmoothingBackgroundColor::transparent()",
|
||||||
animation_value_type="AnimatedRGBA",
|
animation_value_type="none",
|
||||||
products="gecko",
|
products="gecko",
|
||||||
gecko_ffi_name="mFont.fontSmoothingBackgroundColor",
|
gecko_ffi_name="mFont.fontSmoothingBackgroundColor",
|
||||||
enabled_in="chrome",
|
enabled_in="chrome",
|
||||||
|
|
|
@ -1287,32 +1287,6 @@ impl LonghandId {
|
||||||
LonghandId::Direction
|
LonghandId::Direction
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Whether computed values of this property lossily convert any complex
|
|
||||||
/// colors into RGBA colors.
|
|
||||||
///
|
|
||||||
/// In Gecko, there are some properties still that compute currentcolor
|
|
||||||
/// down to an RGBA color at computed value time, instead of as
|
|
||||||
/// `StyleColor`s. For these properties, we must return `false`,
|
|
||||||
/// so that we correctly avoid caching style data in the rule tree.
|
|
||||||
pub fn stores_complex_colors_lossily(&self) -> bool {
|
|
||||||
% if product == "gecko":
|
|
||||||
matches!(*self,
|
|
||||||
% for property in data.longhands:
|
|
||||||
% if property.predefined_type == "RGBAColor":
|
|
||||||
LonghandId::${property.camel_case} |
|
|
||||||
% endif
|
|
||||||
% endfor
|
|
||||||
LonghandId::BackgroundImage |
|
|
||||||
LonghandId::BorderImageSource |
|
|
||||||
LonghandId::BoxShadow |
|
|
||||||
LonghandId::MaskImage |
|
|
||||||
LonghandId::TextShadow
|
|
||||||
)
|
|
||||||
% else:
|
|
||||||
false
|
|
||||||
% endif
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// An iterator over all the property ids that are enabled for a given
|
/// An iterator over all the property ids that are enabled for a given
|
||||||
|
|
|
@ -11,14 +11,14 @@ use cssparser::{Color as CSSParserColor, RGBA};
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
use style_traits::{CssWriter, ToCss};
|
use style_traits::{CssWriter, ToCss};
|
||||||
|
|
||||||
/// Computed value type for the specified RGBAColor.
|
|
||||||
pub type RGBAColor = RGBA;
|
|
||||||
|
|
||||||
/// The computed value of the `color` property.
|
/// The computed value of the `color` property.
|
||||||
pub type ColorPropertyValue = RGBA;
|
pub type ColorPropertyValue = RGBA;
|
||||||
|
|
||||||
|
/// The computed value of `-moz-font-smoothing-background-color`.
|
||||||
|
pub type MozFontSmoothingBackgroundColor = RGBA;
|
||||||
|
|
||||||
/// A computed value for `<color>`.
|
/// A computed value for `<color>`.
|
||||||
pub type Color = GenericColor<RGBAColor>;
|
pub type Color = GenericColor<RGBA>;
|
||||||
|
|
||||||
impl Color {
|
impl Color {
|
||||||
/// Returns a complex color value representing transparent.
|
/// Returns a complex color value representing transparent.
|
||||||
|
|
|
@ -43,7 +43,7 @@ pub use self::box_::{Appearance, BreakBetween, BreakWithin, Clear, Float};
|
||||||
pub use self::box_::{Display, Overflow, OverflowAnchor, TransitionProperty};
|
pub use self::box_::{Display, Overflow, OverflowAnchor, TransitionProperty};
|
||||||
pub use self::box_::{OverflowClipBox, OverscrollBehavior, Perspective, Resize};
|
pub use self::box_::{OverflowClipBox, OverscrollBehavior, Perspective, Resize};
|
||||||
pub use self::box_::{ScrollSnapAlign, ScrollSnapType, TouchAction, VerticalAlign, WillChange};
|
pub use self::box_::{ScrollSnapAlign, ScrollSnapType, TouchAction, VerticalAlign, WillChange};
|
||||||
pub use self::color::{Color, ColorOrAuto, ColorPropertyValue, RGBAColor};
|
pub use self::color::{Color, ColorOrAuto, ColorPropertyValue};
|
||||||
pub use self::column::ColumnCount;
|
pub use self::column::ColumnCount;
|
||||||
pub use self::counters::{Content, ContentItem, CounterIncrement, CounterSetOrReset};
|
pub use self::counters::{Content, ContentItem, CounterIncrement, CounterSetOrReset};
|
||||||
pub use self::easing::TimingFunction;
|
pub use self::easing::TimingFunction;
|
||||||
|
|
|
@ -373,15 +373,7 @@ impl ToComputedValue for Color {
|
||||||
type ComputedValue = ComputedColor;
|
type ComputedValue = ComputedColor;
|
||||||
|
|
||||||
fn to_computed_value(&self, context: &Context) -> ComputedColor {
|
fn to_computed_value(&self, context: &Context) -> ComputedColor {
|
||||||
let result = self.to_computed_color(Some(context)).unwrap();
|
self.to_computed_color(Some(context)).unwrap()
|
||||||
if !result.is_numeric() {
|
|
||||||
if let Some(longhand) = context.for_non_inherited_property {
|
|
||||||
if longhand.stores_complex_colors_lossily() {
|
|
||||||
context.rule_cache_conditions.borrow_mut().set_uncacheable();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
result
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn from_computed_value(computed: &ComputedColor) -> Self {
|
fn from_computed_value(computed: &ComputedColor) -> Self {
|
||||||
|
@ -393,37 +385,33 @@ impl ToComputedValue for Color {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Specified color value, but resolved to just RGBA for computed value
|
/// Specified color value for `-moz-font-smoothing-background-color`.
|
||||||
/// with value from color property at the same context.
|
///
|
||||||
|
/// This property does not support `currentcolor`. We could drop it at
|
||||||
|
/// parse-time, but it's not exposed to the web so it doesn't really matter.
|
||||||
|
///
|
||||||
|
/// We resolve it to `transparent` instead.
|
||||||
#[derive(Clone, Debug, MallocSizeOf, PartialEq, SpecifiedValueInfo, ToCss, ToShmem)]
|
#[derive(Clone, Debug, MallocSizeOf, PartialEq, SpecifiedValueInfo, ToCss, ToShmem)]
|
||||||
pub struct RGBAColor(pub Color);
|
pub struct MozFontSmoothingBackgroundColor(pub Color);
|
||||||
|
|
||||||
impl Parse for RGBAColor {
|
impl Parse for MozFontSmoothingBackgroundColor {
|
||||||
fn parse<'i, 't>(
|
fn parse<'i, 't>(
|
||||||
context: &ParserContext,
|
context: &ParserContext,
|
||||||
input: &mut Parser<'i, 't>,
|
input: &mut Parser<'i, 't>,
|
||||||
) -> Result<Self, ParseError<'i>> {
|
) -> Result<Self, ParseError<'i>> {
|
||||||
Color::parse(context, input).map(RGBAColor)
|
Color::parse(context, input).map(MozFontSmoothingBackgroundColor)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ToComputedValue for RGBAColor {
|
impl ToComputedValue for MozFontSmoothingBackgroundColor {
|
||||||
type ComputedValue = RGBA;
|
type ComputedValue = RGBA;
|
||||||
|
|
||||||
fn to_computed_value(&self, context: &Context) -> RGBA {
|
fn to_computed_value(&self, context: &Context) -> RGBA {
|
||||||
self.0
|
self.0.to_computed_value(context).to_rgba(RGBA::transparent())
|
||||||
.to_computed_value(context)
|
|
||||||
.to_rgba(context.style().get_color().clone_color())
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn from_computed_value(computed: &RGBA) -> Self {
|
fn from_computed_value(computed: &RGBA) -> Self {
|
||||||
RGBAColor(Color::rgba(*computed))
|
MozFontSmoothingBackgroundColor(Color::rgba(*computed))
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<Color> for RGBAColor {
|
|
||||||
fn from(color: Color) -> RGBAColor {
|
|
||||||
RGBAColor(color)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -42,7 +42,7 @@ pub use self::box_::{Clear, Float, Overflow, OverflowAnchor};
|
||||||
pub use self::box_::{OverflowClipBox, OverscrollBehavior, Perspective, Resize};
|
pub use self::box_::{OverflowClipBox, OverscrollBehavior, Perspective, Resize};
|
||||||
pub use self::box_::{ScrollSnapAlign, ScrollSnapType};
|
pub use self::box_::{ScrollSnapAlign, ScrollSnapType};
|
||||||
pub use self::box_::{TouchAction, TransitionProperty, VerticalAlign, WillChange};
|
pub use self::box_::{TouchAction, TransitionProperty, VerticalAlign, WillChange};
|
||||||
pub use self::color::{Color, ColorOrAuto, ColorPropertyValue, RGBAColor};
|
pub use self::color::{Color, ColorOrAuto, ColorPropertyValue};
|
||||||
pub use self::column::ColumnCount;
|
pub use self::column::ColumnCount;
|
||||||
pub use self::counters::{Content, ContentItem, CounterIncrement, CounterSetOrReset};
|
pub use self::counters::{Content, ContentItem, CounterIncrement, CounterSetOrReset};
|
||||||
pub use self::easing::TimingFunction;
|
pub use self::easing::TimingFunction;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue