From da42c19cb66656e3b2531c29542b4bb27b21ec94 Mon Sep 17 00:00:00 2001 From: Kostya Farber Date: Fri, 18 Oct 2024 21:00:28 +0100 Subject: [PATCH] LibWeb: Apply the word-spacing css property to Node This will let us start to begin applying this during text shaping. --- Userland/Libraries/LibWeb/CSS/ComputedValues.h | 4 ++++ .../Libraries/LibWeb/CSS/StyleProperties.cpp | 16 ++++++++++++++++ Userland/Libraries/LibWeb/CSS/StyleProperties.h | 1 + Userland/Libraries/LibWeb/Layout/Node.cpp | 4 ++++ 4 files changed, 25 insertions(+) diff --git a/Userland/Libraries/LibWeb/CSS/ComputedValues.h b/Userland/Libraries/LibWeb/CSS/ComputedValues.h index 96e443b01d9..f72f4a8439e 100644 --- a/Userland/Libraries/LibWeb/CSS/ComputedValues.h +++ b/Userland/Libraries/LibWeb/CSS/ComputedValues.h @@ -105,6 +105,7 @@ public: static CSS::ContentVisibility content_visibility() { return CSS::ContentVisibility::Visible; } static CSS::Cursor cursor() { return CSS::Cursor::Auto; } static CSS::WhiteSpace white_space() { return CSS::WhiteSpace::Normal; } + static CSS::LengthOrCalculated word_spacing() { return CSS::Length::make_px(0); } static Variant tab_size() { return NumberOrCalculated(8.0f); } static CSS::TextAlign text_align() { return CSS::TextAlign::Start; } static CSS::TextJustify text_justify() { return CSS::TextJustify::Auto; } @@ -387,6 +388,7 @@ public: Vector const& text_shadow() const { return m_inherited.text_shadow; } CSS::Positioning position() const { return m_noninherited.position; } CSS::WhiteSpace white_space() const { return m_inherited.white_space; } + CSS::LengthOrCalculated word_spacing() const { return m_inherited.word_spacing; } CSS::FlexDirection flex_direction() const { return m_noninherited.flex_direction; } CSS::FlexWrap flex_wrap() const { return m_noninherited.flex_wrap; } FlexBasis const& flex_basis() const { return m_noninherited.flex_basis; } @@ -547,6 +549,7 @@ protected: CSS::TextTransform text_transform { InitialValues::text_transform() }; CSS::LengthPercentage text_indent { InitialValues::text_indent() }; CSS::WhiteSpace white_space { InitialValues::white_space() }; + CSS::LengthOrCalculated word_spacing { InitialValues::word_spacing() }; CSS::ListStyleType list_style_type { InitialValues::list_style_type() }; CSS::ListStylePosition list_style_position { InitialValues::list_style_position() }; CSS::Visibility visibility { InitialValues::visibility() }; @@ -721,6 +724,7 @@ public: void set_webkit_text_fill_color(Color value) { m_inherited.webkit_text_fill_color = value; } void set_position(CSS::Positioning position) { m_noninherited.position = position; } void set_white_space(CSS::WhiteSpace value) { m_inherited.white_space = value; } + void set_word_spacing(CSS::LengthOrCalculated value) { m_inherited.word_spacing = value; } void set_width(CSS::Size const& width) { m_noninherited.width = width; } void set_min_width(CSS::Size const& width) { m_noninherited.min_width = width; } void set_max_width(CSS::Size const& width) { m_noninherited.max_width = width; } diff --git a/Userland/Libraries/LibWeb/CSS/StyleProperties.cpp b/Userland/Libraries/LibWeb/CSS/StyleProperties.cpp index 5f435bf7db0..c3153ec192e 100644 --- a/Userland/Libraries/LibWeb/CSS/StyleProperties.cpp +++ b/Userland/Libraries/LibWeb/CSS/StyleProperties.cpp @@ -702,6 +702,22 @@ Variant StyleProperties::tab_size() cons return NumberOrCalculated { value->as_number().number() }; } +Optional StyleProperties::word_spacing() const +{ + auto value = property(CSS::PropertyID::WordSpacing); + if (value->is_math()) { + auto& math_value = value->as_math(); + if (math_value.resolves_to_length()) { + return LengthOrCalculated { math_value }; + } + } + + if (value->is_length()) + return LengthOrCalculated { value->as_length().length() }; + + return {}; +} + Optional StyleProperties::white_space() const { auto value = property(CSS::PropertyID::WhiteSpace); diff --git a/Userland/Libraries/LibWeb/CSS/StyleProperties.h b/Userland/Libraries/LibWeb/CSS/StyleProperties.h index 68438564141..37a55e37448 100644 --- a/Userland/Libraries/LibWeb/CSS/StyleProperties.h +++ b/Userland/Libraries/LibWeb/CSS/StyleProperties.h @@ -115,6 +115,7 @@ public: Optional cursor() const; Variant tab_size() const; Optional white_space() const; + Optional word_spacing() const; Optional line_style(CSS::PropertyID) const; Optional outline_style() const; Vector text_decoration_line() const; diff --git a/Userland/Libraries/LibWeb/Layout/Node.cpp b/Userland/Libraries/LibWeb/Layout/Node.cpp index 3426ff55979..657badca4a0 100644 --- a/Userland/Libraries/LibWeb/Layout/Node.cpp +++ b/Userland/Libraries/LibWeb/Layout/Node.cpp @@ -598,6 +598,10 @@ void NodeWithStyle::apply_style(const CSS::StyleProperties& computed_style) if (white_space.has_value()) computed_values.set_white_space(white_space.value()); + auto word_spacing = computed_style.word_spacing(); + if (word_spacing.has_value()) + computed_values.set_word_spacing(word_spacing.value()); + auto float_ = computed_style.float_(); if (float_.has_value()) computed_values.set_float(float_.value());