/* * Copyright (c) 2026, Tim Ledbetter * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include namespace Web::CSS { struct MissingComponents { Array components { false, false, false }; bool alpha { false }; constexpr MissingComponents() = default; constexpr MissingComponents(bool first, bool second, bool third, bool alpha_value = false) : components { first, second, third } , alpha(alpha_value) { } bool& component(size_t index) { return components[index]; } bool component(size_t index) const { return components[index]; } }; enum class ComponentCategory : u8 { Red, Green, Blue, Lightness, Colorfulness, Hue, OpponentA, OpponentB, NotAnalogous, }; struct ComponentCategories { Array components { ComponentCategory::NotAnalogous, ComponentCategory::NotAnalogous, ComponentCategory::NotAnalogous }; constexpr ComponentCategories() = default; constexpr ComponentCategories(ComponentCategory first, ComponentCategory second, ComponentCategory third) : components { first, second, third } { } ComponentCategory component(size_t index) const { return components[index]; } bool operator==(ComponentCategories const&) const = default; }; struct InterpolationPolicy { bool use_legacy_output; ColorInterpolationMethodStyleValue::ColorInterpolationMethod color_interpolation_method; }; struct InterpolationSpaceState { Gfx::ColorComponents from_components; Gfx::ColorComponents to_components; MissingComponents from_missing; MissingComponents to_missing; size_t hue_index { 0 }; HueInterpolationMethod hue_interpolation_method { HueInterpolationMethod::Shorter }; PolarColorSpace polar_color_space { PolarColorSpace::Hsl }; RectangularColorSpace rectangular_color_space { RectangularColorSpace::Srgb }; bool is_polar { false }; ComponentCategories polar_target_categories {}; }; struct InterpolatedColor { Gfx::ColorComponents components; MissingComponents missing; InterpolationPolicy policy; InterpolationSpaceState state; }; Optional perform_color_interpolation( StyleValue const& from, StyleValue const& to, float delta, Optional color_interpolation_method, ColorResolutionContext const& color_resolution_context); RefPtr style_value_for_interpolated_color(InterpolatedColor const&); }