diff options
author | Andreas Kling <kling@serenityos.org> | 2021-09-15 01:06:57 +0200 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2021-09-15 11:56:26 +0200 |
commit | 63c4fcdc69b374bc0ba8f9069c133557ecadd9d3 (patch) | |
tree | 5775ecaf1a73924a9926780de0d1b85f7545f8b1 | |
parent | 8949b0def6e509223eaba495612742d1a7e0147d (diff) | |
download | serenity-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.txt | 1 | ||||
-rw-r--r-- | Userland/Libraries/LibWeb/SVG/ViewBox.cpp | 58 | ||||
-rw-r--r-- | Userland/Libraries/LibWeb/SVG/ViewBox.h | 23 |
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); + +} |