/* * 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 #include #include namespace Web::CSS { class PositionStyleValue final : public StyleValueWithDefaultOperators { public: static ValueComparingNonnullRefPtr create(ValueComparingNonnullRefPtr edge_x, ValueComparingNonnullRefPtr edge_y); static ValueComparingNonnullRefPtr create_center(); static ValueComparingNonnullRefPtr create_computed_center(); virtual ~PositionStyleValue() override = default; ValueComparingNonnullRefPtr edge_x() const { return m_properties.edge_x; } ValueComparingNonnullRefPtr edge_y() const { return m_properties.edge_y; } bool is_center(SerializationMode) const; CSSPixelPoint resolved(Layout::Node const&, CSSPixelRect const&) const; virtual ValueComparingNonnullRefPtr absolutized(ComputationContext const& computation_context) const override; virtual void serialize(StringBuilder&, SerializationMode) const override; bool properties_equal(PositionStyleValue const& other) const { return m_properties == other.m_properties; } virtual bool is_computationally_independent() const override { return m_properties.edge_x->is_computationally_independent() && m_properties.edge_y->is_computationally_independent(); } private: PositionStyleValue(ValueComparingNonnullRefPtr edge_x, ValueComparingNonnullRefPtr edge_y) : StyleValueWithDefaultOperators(Type::Position) , m_properties { .edge_x = move(edge_x), .edge_y = move(edge_y) } { } struct Properties { ValueComparingNonnullRefPtr edge_x; ValueComparingNonnullRefPtr edge_y; bool operator==(Properties const&) const = default; } m_properties; }; }