From 92a0d4c0af8cab52ef45a35c355c7f86f8680fc0 Mon Sep 17 00:00:00 2001 From: Sam Atkins Date: Thu, 23 Mar 2023 17:35:44 +0000 Subject: LibWeb: Split BackgroundStyleValue out of StyleValue.{h,cpp} --- Userland/Libraries/LibWeb/CMakeLists.txt | 1 + Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp | 1 + .../LibWeb/CSS/ResolvedCSSStyleDeclaration.cpp | 1 + Userland/Libraries/LibWeb/CSS/StyleComputer.cpp | 1 + Userland/Libraries/LibWeb/CSS/StyleValue.cpp | 64 +----------------- Userland/Libraries/LibWeb/CSS/StyleValue.h | 56 --------------- .../CSS/StyleValues/BackgroundStyleValue.cpp | 79 ++++++++++++++++++++++ .../LibWeb/CSS/StyleValues/BackgroundStyleValue.h | 72 ++++++++++++++++++++ 8 files changed, 156 insertions(+), 119 deletions(-) create mode 100644 Userland/Libraries/LibWeb/CSS/StyleValues/BackgroundStyleValue.cpp create mode 100644 Userland/Libraries/LibWeb/CSS/StyleValues/BackgroundStyleValue.h (limited to 'Userland') diff --git a/Userland/Libraries/LibWeb/CMakeLists.txt b/Userland/Libraries/LibWeb/CMakeLists.txt index 76ddc31a33..9f95467170 100644 --- a/Userland/Libraries/LibWeb/CMakeLists.txt +++ b/Userland/Libraries/LibWeb/CMakeLists.txt @@ -65,6 +65,7 @@ set(SOURCES CSS/StyleSheetList.cpp CSS/StyleValue.cpp CSS/StyleValues/AngleStyleValue.cpp + CSS/StyleValues/BackgroundStyleValue.cpp CSS/Supports.cpp CSS/SyntaxHighlighter/SyntaxHighlighter.cpp CSS/Time.cpp diff --git a/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp b/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp index 7362278f3d..bd13f458b6 100644 --- a/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp +++ b/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp @@ -30,6 +30,7 @@ #include #include #include +#include #include #include #include diff --git a/Userland/Libraries/LibWeb/CSS/ResolvedCSSStyleDeclaration.cpp b/Userland/Libraries/LibWeb/CSS/ResolvedCSSStyleDeclaration.cpp index 753b047003..0e25f087c9 100644 --- a/Userland/Libraries/LibWeb/CSS/ResolvedCSSStyleDeclaration.cpp +++ b/Userland/Libraries/LibWeb/CSS/ResolvedCSSStyleDeclaration.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include diff --git a/Userland/Libraries/LibWeb/CSS/StyleComputer.cpp b/Userland/Libraries/LibWeb/CSS/StyleComputer.cpp index e3f4ba0f5b..dec8344565 100644 --- a/Userland/Libraries/LibWeb/CSS/StyleComputer.cpp +++ b/Userland/Libraries/LibWeb/CSS/StyleComputer.cpp @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include diff --git a/Userland/Libraries/LibWeb/CSS/StyleValue.cpp b/Userland/Libraries/LibWeb/CSS/StyleValue.cpp index 77cc6dfa60..25f4ab33a2 100644 --- a/Userland/Libraries/LibWeb/CSS/StyleValue.cpp +++ b/Userland/Libraries/LibWeb/CSS/StyleValue.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -291,69 +292,6 @@ StyleValueList const& StyleValue::as_value_list() const return static_cast(*this); } -BackgroundStyleValue::BackgroundStyleValue( - ValueComparingNonnullRefPtr color, - ValueComparingNonnullRefPtr image, - ValueComparingNonnullRefPtr position, - ValueComparingNonnullRefPtr size, - ValueComparingNonnullRefPtr repeat, - ValueComparingNonnullRefPtr attachment, - ValueComparingNonnullRefPtr origin, - ValueComparingNonnullRefPtr clip) - : StyleValueWithDefaultOperators(Type::Background) - , m_properties { - .color = move(color), - .image = move(image), - .position = move(position), - .size = move(size), - .repeat = move(repeat), - .attachment = move(attachment), - .origin = move(origin), - .clip = move(clip), - .layer_count = 0 - } -{ - auto layer_count = [](auto style_value) -> size_t { - if (style_value->is_value_list()) - return style_value->as_value_list().size(); - else - return 1; - }; - - m_properties.layer_count = max(layer_count(m_properties.image), layer_count(m_properties.position)); - m_properties.layer_count = max(m_properties.layer_count, layer_count(m_properties.size)); - m_properties.layer_count = max(m_properties.layer_count, layer_count(m_properties.repeat)); - m_properties.layer_count = max(m_properties.layer_count, layer_count(m_properties.attachment)); - m_properties.layer_count = max(m_properties.layer_count, layer_count(m_properties.origin)); - m_properties.layer_count = max(m_properties.layer_count, layer_count(m_properties.clip)); - - VERIFY(!m_properties.color->is_value_list()); -} - -ErrorOr BackgroundStyleValue::to_string() const -{ - if (m_properties.layer_count == 1) { - return String::formatted("{} {} {} {} {} {} {} {}", TRY(m_properties.color->to_string()), TRY(m_properties.image->to_string()), TRY(m_properties.position->to_string()), TRY(m_properties.size->to_string()), TRY(m_properties.repeat->to_string()), TRY(m_properties.attachment->to_string()), TRY(m_properties.origin->to_string()), TRY(m_properties.clip->to_string())); - } - - auto get_layer_value_string = [](ValueComparingNonnullRefPtr const& style_value, size_t index) { - if (style_value->is_value_list()) - return style_value->as_value_list().value_at(index, true)->to_string(); - return style_value->to_string(); - }; - - StringBuilder builder; - for (size_t i = 0; i < m_properties.layer_count; i++) { - if (i) - TRY(builder.try_append(", "sv)); - if (i == m_properties.layer_count - 1) - TRY(builder.try_appendff("{} ", TRY(m_properties.color->to_string()))); - TRY(builder.try_appendff("{} {} {} {} {} {} {}", TRY(get_layer_value_string(m_properties.image, i)), TRY(get_layer_value_string(m_properties.position, i)), TRY(get_layer_value_string(m_properties.size, i)), TRY(get_layer_value_string(m_properties.repeat, i)), TRY(get_layer_value_string(m_properties.attachment, i)), TRY(get_layer_value_string(m_properties.origin, i)), TRY(get_layer_value_string(m_properties.clip, i)))); - } - - return builder.to_string(); -} - ErrorOr BackgroundRepeatStyleValue::to_string() const { return String::formatted("{} {}", CSS::to_string(m_properties.repeat_x), CSS::to_string(m_properties.repeat_y)); diff --git a/Userland/Libraries/LibWeb/CSS/StyleValue.h b/Userland/Libraries/LibWeb/CSS/StyleValue.h index 91587cbf35..7fe90724b2 100644 --- a/Userland/Libraries/LibWeb/CSS/StyleValue.h +++ b/Userland/Libraries/LibWeb/CSS/StyleValue.h @@ -502,62 +502,6 @@ struct StyleValueWithDefaultOperators : public StyleValue { } }; -class BackgroundStyleValue final : public StyleValueWithDefaultOperators { -public: - static ValueComparingNonnullRefPtr create( - ValueComparingNonnullRefPtr color, - ValueComparingNonnullRefPtr image, - ValueComparingNonnullRefPtr position, - ValueComparingNonnullRefPtr size, - ValueComparingNonnullRefPtr repeat, - ValueComparingNonnullRefPtr attachment, - ValueComparingNonnullRefPtr origin, - ValueComparingNonnullRefPtr clip) - { - return adopt_ref(*new BackgroundStyleValue(move(color), move(image), move(position), move(size), move(repeat), move(attachment), move(origin), move(clip))); - } - virtual ~BackgroundStyleValue() override = default; - - size_t layer_count() const { return m_properties.layer_count; } - - auto attachment() const { return m_properties.attachment; } - auto clip() const { return m_properties.clip; } - auto color() const { return m_properties.color; } - auto image() const { return m_properties.image; } - auto origin() const { return m_properties.origin; } - auto position() const { return m_properties.position; } - auto repeat() const { return m_properties.repeat; } - auto size() const { return m_properties.size; } - - virtual ErrorOr to_string() const override; - - bool properties_equal(BackgroundStyleValue const& other) const { return m_properties == other.m_properties; } - -private: - BackgroundStyleValue( - ValueComparingNonnullRefPtr color, - ValueComparingNonnullRefPtr image, - ValueComparingNonnullRefPtr position, - ValueComparingNonnullRefPtr size, - ValueComparingNonnullRefPtr repeat, - ValueComparingNonnullRefPtr attachment, - ValueComparingNonnullRefPtr origin, - ValueComparingNonnullRefPtr clip); - - struct Properties { - ValueComparingNonnullRefPtr color; - ValueComparingNonnullRefPtr image; - ValueComparingNonnullRefPtr position; - ValueComparingNonnullRefPtr size; - ValueComparingNonnullRefPtr repeat; - ValueComparingNonnullRefPtr attachment; - ValueComparingNonnullRefPtr origin; - ValueComparingNonnullRefPtr clip; - size_t layer_count; - bool operator==(Properties const&) const = default; - } m_properties; -}; - class BackgroundRepeatStyleValue final : public StyleValueWithDefaultOperators { public: static ValueComparingNonnullRefPtr create(Repeat repeat_x, Repeat repeat_y) diff --git a/Userland/Libraries/LibWeb/CSS/StyleValues/BackgroundStyleValue.cpp b/Userland/Libraries/LibWeb/CSS/StyleValues/BackgroundStyleValue.cpp new file mode 100644 index 0000000000..aa3a29fb3d --- /dev/null +++ b/Userland/Libraries/LibWeb/CSS/StyleValues/BackgroundStyleValue.cpp @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2018-2020, Andreas Kling + * Copyright (c) 2021-2023, Sam Atkins + * Copyright (c) 2021, Tobias Christiansen + * Copyright (c) 2022-2023, MacDue + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include "BackgroundStyleValue.h" + +namespace Web::CSS { + +BackgroundStyleValue::BackgroundStyleValue( + ValueComparingNonnullRefPtr color, + ValueComparingNonnullRefPtr image, + ValueComparingNonnullRefPtr position, + ValueComparingNonnullRefPtr size, + ValueComparingNonnullRefPtr repeat, + ValueComparingNonnullRefPtr attachment, + ValueComparingNonnullRefPtr origin, + ValueComparingNonnullRefPtr clip) + : StyleValueWithDefaultOperators(Type::Background) + , m_properties { + .color = move(color), + .image = move(image), + .position = move(position), + .size = move(size), + .repeat = move(repeat), + .attachment = move(attachment), + .origin = move(origin), + .clip = move(clip), + .layer_count = 0 + } +{ + auto layer_count = [](auto style_value) -> size_t { + if (style_value->is_value_list()) + return style_value->as_value_list().size(); + else + return 1; + }; + + m_properties.layer_count = max(layer_count(m_properties.image), layer_count(m_properties.position)); + m_properties.layer_count = max(m_properties.layer_count, layer_count(m_properties.size)); + m_properties.layer_count = max(m_properties.layer_count, layer_count(m_properties.repeat)); + m_properties.layer_count = max(m_properties.layer_count, layer_count(m_properties.attachment)); + m_properties.layer_count = max(m_properties.layer_count, layer_count(m_properties.origin)); + m_properties.layer_count = max(m_properties.layer_count, layer_count(m_properties.clip)); + + VERIFY(!m_properties.color->is_value_list()); +} + +BackgroundStyleValue::~BackgroundStyleValue() = default; + +ErrorOr BackgroundStyleValue::to_string() const +{ + if (m_properties.layer_count == 1) { + return String::formatted("{} {} {} {} {} {} {} {}", TRY(m_properties.color->to_string()), TRY(m_properties.image->to_string()), TRY(m_properties.position->to_string()), TRY(m_properties.size->to_string()), TRY(m_properties.repeat->to_string()), TRY(m_properties.attachment->to_string()), TRY(m_properties.origin->to_string()), TRY(m_properties.clip->to_string())); + } + + auto get_layer_value_string = [](ValueComparingNonnullRefPtr const& style_value, size_t index) { + if (style_value->is_value_list()) + return style_value->as_value_list().value_at(index, true)->to_string(); + return style_value->to_string(); + }; + + StringBuilder builder; + for (size_t i = 0; i < m_properties.layer_count; i++) { + if (i) + TRY(builder.try_append(", "sv)); + if (i == m_properties.layer_count - 1) + TRY(builder.try_appendff("{} ", TRY(m_properties.color->to_string()))); + TRY(builder.try_appendff("{} {} {} {} {} {} {}", TRY(get_layer_value_string(m_properties.image, i)), TRY(get_layer_value_string(m_properties.position, i)), TRY(get_layer_value_string(m_properties.size, i)), TRY(get_layer_value_string(m_properties.repeat, i)), TRY(get_layer_value_string(m_properties.attachment, i)), TRY(get_layer_value_string(m_properties.origin, i)), TRY(get_layer_value_string(m_properties.clip, i)))); + } + + return builder.to_string(); +} + +} diff --git a/Userland/Libraries/LibWeb/CSS/StyleValues/BackgroundStyleValue.h b/Userland/Libraries/LibWeb/CSS/StyleValues/BackgroundStyleValue.h new file mode 100644 index 0000000000..21e90f736c --- /dev/null +++ b/Userland/Libraries/LibWeb/CSS/StyleValues/BackgroundStyleValue.h @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2018-2020, Andreas Kling + * Copyright (c) 2021, Tobias Christiansen + * Copyright (c) 2021-2023, Sam Atkins + * Copyright (c) 2022-2023, MacDue + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include + +namespace Web::CSS { + +class BackgroundStyleValue final : public StyleValueWithDefaultOperators { +public: + static ValueComparingNonnullRefPtr create( + ValueComparingNonnullRefPtr color, + ValueComparingNonnullRefPtr image, + ValueComparingNonnullRefPtr position, + ValueComparingNonnullRefPtr size, + ValueComparingNonnullRefPtr repeat, + ValueComparingNonnullRefPtr attachment, + ValueComparingNonnullRefPtr origin, + ValueComparingNonnullRefPtr clip) + { + return adopt_ref(*new BackgroundStyleValue(move(color), move(image), move(position), move(size), move(repeat), move(attachment), move(origin), move(clip))); + } + virtual ~BackgroundStyleValue() override; + + size_t layer_count() const { return m_properties.layer_count; } + + auto attachment() const { return m_properties.attachment; } + auto clip() const { return m_properties.clip; } + auto color() const { return m_properties.color; } + auto image() const { return m_properties.image; } + auto origin() const { return m_properties.origin; } + auto position() const { return m_properties.position; } + auto repeat() const { return m_properties.repeat; } + auto size() const { return m_properties.size; } + + virtual ErrorOr to_string() const override; + + bool properties_equal(BackgroundStyleValue const& other) const { return m_properties == other.m_properties; } + +private: + BackgroundStyleValue( + ValueComparingNonnullRefPtr color, + ValueComparingNonnullRefPtr image, + ValueComparingNonnullRefPtr position, + ValueComparingNonnullRefPtr size, + ValueComparingNonnullRefPtr repeat, + ValueComparingNonnullRefPtr attachment, + ValueComparingNonnullRefPtr origin, + ValueComparingNonnullRefPtr clip); + + struct Properties { + ValueComparingNonnullRefPtr color; + ValueComparingNonnullRefPtr image; + ValueComparingNonnullRefPtr position; + ValueComparingNonnullRefPtr size; + ValueComparingNonnullRefPtr repeat; + ValueComparingNonnullRefPtr attachment; + ValueComparingNonnullRefPtr origin; + ValueComparingNonnullRefPtr clip; + size_t layer_count; + bool operator==(Properties const&) const = default; + } m_properties; +}; + +} -- cgit v1.2.3