summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Kling <kling@serenityos.org>2021-09-15 01:06:57 +0200
committerAndreas Kling <kling@serenityos.org>2021-09-15 11:56:26 +0200
commit63c4fcdc69b374bc0ba8f9069c133557ecadd9d3 (patch)
tree5775ecaf1a73924a9926780de0d1b85f7545f8b1
parent8949b0def6e509223eaba495612742d1a7e0147d (diff)
downloadserenity-63c4fcdc69b374bc0ba8f9069c133557ecadd9d3.zip
LibWeb: Add SVG::ViewBox to represent SVG view boxes
This also comes with a simple little parsing helper. :^)
-rw-r--r--Userland/Libraries/LibWeb/CMakeLists.txt1
-rw-r--r--Userland/Libraries/LibWeb/SVG/ViewBox.cpp58
-rw-r--r--Userland/Libraries/LibWeb/SVG/ViewBox.h23
3 files changed, 82 insertions, 0 deletions
diff --git a/Userland/Libraries/LibWeb/CMakeLists.txt b/Userland/Libraries/LibWeb/CMakeLists.txt
index e38790964d..01dff8d70c 100644
--- a/Userland/Libraries/LibWeb/CMakeLists.txt
+++ b/Userland/Libraries/LibWeb/CMakeLists.txt
@@ -228,6 +228,7 @@ set(SOURCES
SVG/SVGPathElement.cpp
SVG/SVGSVGElement.cpp
SVG/TagNames.cpp
+ SVG/ViewBox.cpp
StylePropertiesModel.cpp
UIEvents/EventNames.cpp
UIEvents/MouseEvent.cpp
diff --git a/Userland/Libraries/LibWeb/SVG/ViewBox.cpp b/Userland/Libraries/LibWeb/SVG/ViewBox.cpp
new file mode 100644
index 0000000000..844f4ae07b
--- /dev/null
+++ b/Userland/Libraries/LibWeb/SVG/ViewBox.cpp
@@ -0,0 +1,58 @@
+/*
+ * Copyright (c) 2021, Andreas Kling <kling@serenityos.org>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#include <AK/CharacterTypes.h>
+#include <AK/GenericLexer.h>
+#include <AK/Optional.h>
+#include <AK/StringView.h>
+#include <LibWeb/SVG/ViewBox.h>
+
+namespace Web::SVG {
+
+Optional<ViewBox> try_parse_view_box(StringView string)
+{
+ // FIXME: This should handle all valid viewBox values.
+
+ GenericLexer lexer(string);
+
+ enum State {
+ MinX,
+ MinY,
+ Width,
+ Height,
+ };
+ int state { State::MinX };
+ ViewBox view_box;
+
+ while (!lexer.is_eof()) {
+ lexer.consume_while([](auto ch) { return is_ascii_space(ch); });
+ auto token = lexer.consume_until([](auto ch) { return is_ascii_space(ch) && ch != ','; });
+ auto maybe_number = token.to_int();
+ if (!maybe_number.has_value())
+ return {};
+ switch (state) {
+ case State::MinX:
+ view_box.min_x = maybe_number.value();
+ break;
+ case State::MinY:
+ view_box.min_y = maybe_number.value();
+ break;
+ case State::Width:
+ view_box.width = maybe_number.value();
+ break;
+ case State::Height:
+ view_box.height = maybe_number.value();
+ break;
+ default:
+ return {};
+ }
+ state += 1;
+ }
+
+ return view_box;
+}
+
+}
diff --git a/Userland/Libraries/LibWeb/SVG/ViewBox.h b/Userland/Libraries/LibWeb/SVG/ViewBox.h
new file mode 100644
index 0000000000..8c1be55ec8
--- /dev/null
+++ b/Userland/Libraries/LibWeb/SVG/ViewBox.h
@@ -0,0 +1,23 @@
+/*
+ * Copyright (c) 2021, Andreas Kling <kling@serenityos.org>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#pragma once
+
+#include <AK/Forward.h>
+#include <LibWeb/Forward.h>
+
+namespace Web::SVG {
+
+struct ViewBox {
+ float min_x { 0 };
+ float min_y { 0 };
+ float width { 0 };
+ float height { 0 };
+};
+
+Optional<ViewBox> try_parse_view_box(StringView);
+
+}