summaryrefslogtreecommitdiff
path: root/Userland/Libraries/LibWeb/CSS/Frequency.cpp
diff options
context:
space:
mode:
authorSam Atkins <atkinssj@serenityos.org>2022-02-21 17:49:47 +0000
committerAndreas Kling <kling@serenityos.org>2022-02-24 08:04:25 +0100
commitbd79c303f6733f93c840423a2bc5f9bdd9168c2d (patch)
treee773e456c7c2ee3da5fca2c481ac781b53291d1e /Userland/Libraries/LibWeb/CSS/Frequency.cpp
parent355d1936f22bd3e8b9d41388e739938c9bfa1509 (diff)
downloadserenity-bd79c303f6733f93c840423a2bc5f9bdd9168c2d.zip
LibWeb: Implement CSS Frequency class
This corresponds to `<frequency>` in the grammar.
Diffstat (limited to 'Userland/Libraries/LibWeb/CSS/Frequency.cpp')
-rw-r--r--Userland/Libraries/LibWeb/CSS/Frequency.cpp86
1 files changed, 86 insertions, 0 deletions
diff --git a/Userland/Libraries/LibWeb/CSS/Frequency.cpp b/Userland/Libraries/LibWeb/CSS/Frequency.cpp
new file mode 100644
index 0000000000..31d1eb3ab4
--- /dev/null
+++ b/Userland/Libraries/LibWeb/CSS/Frequency.cpp
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 2022, Sam Atkins <atkinssj@serenityos.org>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#include "Frequency.h"
+#include <LibWeb/CSS/StyleValue.h>
+
+namespace Web::CSS {
+
+Frequency::Frequency(int value, Type type)
+ : m_type(type)
+ , m_value(value)
+{
+}
+
+Frequency::Frequency(float value, Type type)
+ : m_type(type)
+ , m_value(value)
+{
+}
+
+Frequency Frequency::make_calculated(NonnullRefPtr<CalculatedStyleValue> calculated_style_value)
+{
+ Frequency frequency { 0, Type::Calculated };
+ frequency.m_calculated_style = move(calculated_style_value);
+ return frequency;
+}
+
+Frequency Frequency::make_hertz(float value)
+{
+ return { value, Type::Hz };
+}
+
+Frequency Frequency::percentage_of(Percentage const& percentage) const
+{
+ VERIFY(!is_calculated());
+
+ return Frequency { percentage.as_fraction() * m_value, m_type };
+}
+
+String Frequency::to_string() const
+{
+ if (is_calculated())
+ return m_calculated_style->to_string();
+ return String::formatted("{}{}", m_value, unit_name());
+}
+
+float Frequency::to_hertz() const
+{
+ switch (m_type) {
+ case Type::Calculated:
+ return m_calculated_style->resolve_frequency()->to_hertz();
+ case Type::Hz:
+ return m_value;
+ case Type::kHz:
+ return m_value * 1000;
+ }
+ VERIFY_NOT_REACHED();
+}
+
+StringView Frequency::unit_name() const
+{
+ switch (m_type) {
+ case Type::Calculated:
+ return "calculated"sv;
+ case Type::Hz:
+ return "hz"sv;
+ case Type::kHz:
+ return "khz"sv;
+ }
+ VERIFY_NOT_REACHED();
+}
+
+Optional<Frequency::Type> Frequency::unit_from_name(StringView name)
+{
+ if (name.equals_ignoring_case("hz"sv)) {
+ return Type::Hz;
+ } else if (name.equals_ignoring_case("khz"sv)) {
+ return Type::kHz;
+ }
+ return {};
+}
+
+}