mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-01-24 02:03:06 -05:00
5f2f780662
This makes it possible to do arithmetic on them without having to resolve to their canonical unit, which often requires context information that is not available until the last minute. For example, a Length cannot be resolved to px without knowing the font size, parent element's size, etc. Only Length currently requires such context, but treating all these types the same means that code that manipulates them does not need to know or care if a new unit gets added that does require contextual information.
56 lines
1.1 KiB
C++
56 lines
1.1 KiB
C++
/*
|
|
* Copyright (c) 2022-2023, Sam Atkins <atkinssj@serenityos.org>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <AK/String.h>
|
|
#include <LibWeb/Forward.h>
|
|
|
|
namespace Web::CSS {
|
|
|
|
class Angle {
|
|
public:
|
|
enum class Type {
|
|
Deg,
|
|
Grad,
|
|
Rad,
|
|
Turn,
|
|
};
|
|
|
|
static Optional<Type> unit_from_name(StringView);
|
|
|
|
Angle(int value, Type type);
|
|
Angle(float value, Type type);
|
|
static Angle make_degrees(float);
|
|
Angle percentage_of(Percentage const&) const;
|
|
|
|
ErrorOr<String> to_string() const;
|
|
float to_degrees() const;
|
|
|
|
Type type() const { return m_type; }
|
|
float raw_value() const { return m_value; }
|
|
|
|
bool operator==(Angle const& other) const
|
|
{
|
|
return m_type == other.m_type && m_value == other.m_value;
|
|
}
|
|
|
|
private:
|
|
StringView unit_name() const;
|
|
|
|
Type m_type;
|
|
float m_value { 0 };
|
|
};
|
|
|
|
}
|
|
|
|
template<>
|
|
struct AK::Formatter<Web::CSS::Angle> : Formatter<StringView> {
|
|
ErrorOr<void> format(FormatBuilder& builder, Web::CSS::Angle const& angle)
|
|
{
|
|
return Formatter<StringView>::format(builder, TRY(angle.to_string()));
|
|
}
|
|
};
|