mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-12-05 01:10:24 +00:00
LibWeb: Share a ColorResolutionContext in apply_style
There is no need to recreate this each time we need it when we can instead create it once and then reuse it. This is stop-gap since we should resolve colors to their computed forms as part of StyleComputer::compute_properties Reduces time spent in ColorResolutionContext::for_layout_node from ~1.1% to ~0.1% when loading https://en.wikipedia.org/wiki/2023_in_American_television
This commit is contained in:
committed by
Andreas Kling
parent
dd9d6d22ee
commit
9d515ec666
Notes:
github-actions[bot]
2025-11-10 11:12:49 +00:00
Author: https://github.com/Calme1709 Commit: https://github.com/LadybirdBrowser/ladybird/commit/9d515ec666d Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/6773
@@ -388,6 +388,10 @@ void NodeWithStyle::apply_style(CSS::ComputedProperties const& computed_style)
|
||||
// NOTE: color must be set after font_size as `CalculatedStyleValue`s can rely on it being set for resolving lengths.
|
||||
computed_values.set_color(computed_style.color_or_fallback(CSS::PropertyID::Color, CSS::ColorResolutionContext::for_layout_node_with_style(*this), CSS::InitialValues::color()));
|
||||
|
||||
// NOTE: This color resolution context must be created after we set color above so that currentColor resolves correctly
|
||||
// FIXME: We should resolve colors to their absolute forms at compute time (i.e. by implementing the relevant absolutized methods)
|
||||
auto color_resolution_context = CSS::ColorResolutionContext::for_layout_node_with_style(*this);
|
||||
|
||||
computed_values.set_vertical_align(computed_style.vertical_align());
|
||||
|
||||
{
|
||||
@@ -521,7 +525,7 @@ void NodeWithStyle::apply_style(CSS::ComputedProperties const& computed_style)
|
||||
|
||||
computed_values.set_background_layers(move(layers));
|
||||
}
|
||||
computed_values.set_background_color(computed_style.color_or_fallback(CSS::PropertyID::BackgroundColor, CSS::ColorResolutionContext::for_layout_node_with_style(*this), CSS::InitialValues::background_color()));
|
||||
computed_values.set_background_color(computed_style.color_or_fallback(CSS::PropertyID::BackgroundColor, color_resolution_context, CSS::InitialValues::background_color()));
|
||||
|
||||
computed_values.set_box_sizing(computed_style.box_sizing());
|
||||
|
||||
@@ -575,7 +579,7 @@ void NodeWithStyle::apply_style(CSS::ComputedProperties const& computed_style)
|
||||
if (computed_style.filter().has_filters())
|
||||
computed_values.set_filter(computed_style.filter());
|
||||
|
||||
computed_values.set_flood_color(computed_style.color_or_fallback(CSS::PropertyID::FloodColor, CSS::ColorResolutionContext::for_layout_node_with_style(*this), CSS::InitialValues::flood_color()));
|
||||
computed_values.set_flood_color(computed_style.color_or_fallback(CSS::PropertyID::FloodColor, color_resolution_context, CSS::InitialValues::flood_color()));
|
||||
computed_values.set_flood_opacity(computed_style.flood_opacity());
|
||||
|
||||
computed_values.set_justify_content(computed_style.justify_content());
|
||||
@@ -640,10 +644,10 @@ void NodeWithStyle::apply_style(CSS::ComputedProperties const& computed_style)
|
||||
// FIXME: The default text decoration color value is `currentcolor`, but since we can't resolve that easily,
|
||||
// we just manually grab the value from `color`. This makes it dependent on `color` being
|
||||
// specified first, so it's far from ideal.
|
||||
computed_values.set_text_decoration_color(computed_style.color_or_fallback(CSS::PropertyID::TextDecorationColor, CSS::ColorResolutionContext::for_layout_node_with_style(*this), computed_values.color()));
|
||||
computed_values.set_text_decoration_color(computed_style.color_or_fallback(CSS::PropertyID::TextDecorationColor, color_resolution_context, computed_values.color()));
|
||||
computed_values.set_text_decoration_thickness(computed_style.text_decoration_thickness());
|
||||
|
||||
computed_values.set_webkit_text_fill_color(computed_style.color_or_fallback(CSS::PropertyID::WebkitTextFillColor, CSS::ColorResolutionContext::for_layout_node_with_style(*this), computed_values.color()));
|
||||
computed_values.set_webkit_text_fill_color(computed_style.color_or_fallback(CSS::PropertyID::WebkitTextFillColor, color_resolution_context, computed_values.color()));
|
||||
|
||||
computed_values.set_text_shadow(computed_style.text_shadow(*this));
|
||||
|
||||
@@ -692,7 +696,7 @@ void NodeWithStyle::apply_style(CSS::ComputedProperties const& computed_style)
|
||||
// FIXME: The default border color value is `currentcolor`, but since we can't resolve that easily,
|
||||
// we just manually grab the value from `color`. This makes it dependent on `color` being
|
||||
// specified first, so it's far from ideal.
|
||||
border.color = computed_style.color_or_fallback(color_property, CSS::ColorResolutionContext::for_layout_node_with_style(*this), computed_values.color());
|
||||
border.color = computed_style.color_or_fallback(color_property, color_resolution_context, computed_values.color());
|
||||
border.line_style = computed_style.line_style(style_property);
|
||||
|
||||
// FIXME: Interpolation can cause negative values - we clamp here but should instead clamp as part of interpolation
|
||||
@@ -705,7 +709,7 @@ void NodeWithStyle::apply_style(CSS::ComputedProperties const& computed_style)
|
||||
do_border_style(computed_values.border_bottom(), CSS::PropertyID::BorderBottomWidth, CSS::PropertyID::BorderBottomColor, CSS::PropertyID::BorderBottomStyle);
|
||||
|
||||
if (auto const& outline_color = computed_style.property(CSS::PropertyID::OutlineColor); outline_color.has_color())
|
||||
computed_values.set_outline_color(outline_color.to_color(CSS::ColorResolutionContext::for_layout_node_with_style(*this)).value());
|
||||
computed_values.set_outline_color(outline_color.to_color(color_resolution_context).value());
|
||||
if (auto const& outline_offset = computed_style.property(CSS::PropertyID::OutlineOffset); outline_offset.is_length())
|
||||
computed_values.set_outline_offset(outline_offset.as_length().length());
|
||||
computed_values.set_outline_style(computed_style.outline_style());
|
||||
@@ -741,16 +745,16 @@ void NodeWithStyle::apply_style(CSS::ComputedProperties const& computed_style)
|
||||
|
||||
auto const& fill = computed_style.property(CSS::PropertyID::Fill);
|
||||
if (fill.has_color())
|
||||
computed_values.set_fill(fill.to_color(CSS::ColorResolutionContext::for_layout_node_with_style(*this)).value());
|
||||
computed_values.set_fill(fill.to_color(color_resolution_context).value());
|
||||
else if (fill.is_url())
|
||||
computed_values.set_fill(fill.as_url().url());
|
||||
auto const& stroke = computed_style.property(CSS::PropertyID::Stroke);
|
||||
if (stroke.has_color())
|
||||
computed_values.set_stroke(stroke.to_color(CSS::ColorResolutionContext::for_layout_node_with_style(*this)).value());
|
||||
computed_values.set_stroke(stroke.to_color(color_resolution_context).value());
|
||||
else if (stroke.is_url())
|
||||
computed_values.set_stroke(stroke.as_url().url());
|
||||
|
||||
computed_values.set_stop_color(computed_style.color_or_fallback(CSS::PropertyID::StopColor, CSS::ColorResolutionContext::for_layout_node_with_style(*this), CSS::InitialValues::stop_color()));
|
||||
computed_values.set_stop_color(computed_style.color_or_fallback(CSS::PropertyID::StopColor, color_resolution_context, CSS::InitialValues::stop_color()));
|
||||
|
||||
auto const& stroke_width = computed_style.property(CSS::PropertyID::StrokeWidth);
|
||||
// FIXME: Converting to pixels isn't really correct - values should be in "user units"
|
||||
|
||||
Reference in New Issue
Block a user