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 + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include +#include +#include +#include + +namespace Web::SVG { + +Optional 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 + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include +#include + +namespace Web::SVG { + +struct ViewBox { + float min_x { 0 }; + float min_y { 0 }; + float width { 0 }; + float height { 0 }; +}; + +Optional try_parse_view_box(StringView); + +}