mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-07-26 10:49:29 +00:00
`CSSColorValue`s which have unresolved `calc` components should be able to be resolved. Previously we would always resolve them but with incorrect values. This is useful as we will now be able to now whether we should serialize colors in their normalized form or not. Slight regression in that we now serialize (RGB, HSL and HWB) colors with components that rely on compute-time information as an empty string, but that will be fixed in the next commit.
61 lines
2.1 KiB
C++
61 lines
2.1 KiB
C++
/*
|
|
* Copyright (c) 2024, Sam Atkins <sam@ladybird.org>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#include "CSSHWB.h"
|
|
#include <AK/TypeCasts.h>
|
|
#include <LibWeb/CSS/Serialize.h>
|
|
#include <LibWeb/CSS/StyleValues/CalculatedStyleValue.h>
|
|
|
|
namespace Web::CSS {
|
|
|
|
Optional<Color> CSSHWB::to_color(Optional<Layout::NodeWithStyle const&>, CalculationResolutionContext const& resolution_context) const
|
|
{
|
|
auto h_val = resolve_hue(m_properties.h, resolution_context);
|
|
auto raw_w_value = resolve_with_reference_value(m_properties.w, 100.0, resolution_context);
|
|
auto raw_b_value = resolve_with_reference_value(m_properties.b, 100.0, resolution_context);
|
|
auto alpha_val = resolve_alpha(m_properties.alpha, resolution_context);
|
|
|
|
if (!h_val.has_value() || !raw_w_value.has_value() || !raw_b_value.has_value() || !alpha_val.has_value())
|
|
return {};
|
|
|
|
auto w_val = clamp(raw_w_value.value(), 0, 100) / 100.0f;
|
|
auto b_val = clamp(raw_b_value.value(), 0, 100) / 100.0f;
|
|
|
|
if (w_val + b_val >= 1.0f) {
|
|
auto to_byte = [](float value) {
|
|
return round_to<u8>(clamp(value * 255.0f, 0.0f, 255.0f));
|
|
};
|
|
u8 gray = to_byte(w_val / (w_val + b_val));
|
|
return Color(gray, gray, gray, to_byte(alpha_val.value()));
|
|
}
|
|
|
|
auto value = 1 - b_val;
|
|
auto saturation = 1 - (w_val / value);
|
|
return Color::from_hsv(h_val.value(), saturation, value).with_opacity(alpha_val.value());
|
|
}
|
|
|
|
bool CSSHWB::equals(CSSStyleValue const& other) const
|
|
{
|
|
if (type() != other.type())
|
|
return false;
|
|
auto const& other_color = other.as_color();
|
|
if (color_type() != other_color.color_type())
|
|
return false;
|
|
auto const& other_hwb = as<CSSHWB>(other_color);
|
|
return m_properties == other_hwb.m_properties;
|
|
}
|
|
|
|
// https://www.w3.org/TR/css-color-4/#serializing-sRGB-values
|
|
String CSSHWB::to_string(SerializationMode) const
|
|
{
|
|
if (auto color = to_color({}, {}); color.has_value())
|
|
return serialize_a_srgb_value(color.value());
|
|
|
|
// FIXME: Do this properly, taking unresolved calculated values into account.
|
|
return ""_string;
|
|
}
|
|
|
|
}
|