diff options
author | Sam Atkins <atkinssj@serenityos.org> | 2022-02-16 15:17:50 +0000 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2022-02-16 21:47:53 +0100 |
commit | aba8774c9c34a890f1fb421bd3766d40827cc3ae (patch) | |
tree | 5aa1ee030884da8e682ef2788b2dbaaa31dbe2fd /Userland | |
parent | ae93aeb414334e5bb58517279783c01b95c74ca9 (diff) | |
download | serenity-aba8774c9c34a890f1fb421bd3766d40827cc3ae.zip |
LibWeb: Give SVG geometry elements a position
This makes the selected-in-the-inspector outline appear in the right
place. We take the stroke-width into account when producing the
bounding box, which makes the fit nice and snug. :^)
Diffstat (limited to 'Userland')
4 files changed, 16 insertions, 4 deletions
diff --git a/Userland/Libraries/LibWeb/Layout/SVGFormattingContext.cpp b/Userland/Libraries/LibWeb/Layout/SVGFormattingContext.cpp index 9f8becb24f..af4fb3fe83 100644 --- a/Userland/Libraries/LibWeb/Layout/SVGFormattingContext.cpp +++ b/Userland/Libraries/LibWeb/Layout/SVGFormattingContext.cpp @@ -32,7 +32,14 @@ void SVGFormattingContext::run(Box& box, LayoutMode) if (is<SVGGeometryBox>(descendant)) { auto& geometry_box = static_cast<SVGGeometryBox&>(descendant); auto& path = geometry_box.dom_node().get_path(); - geometry_box.set_content_size(path.bounding_box().size()); + auto bounding_box = path.bounding_box(); + + // Stroke increases the path's size by stroke_width/2 per side. + auto stroke_width = geometry_box.dom_node().stroke_width().value_or(0); + bounding_box.inflate(stroke_width, stroke_width); + + geometry_box.set_offset(bounding_box.top_left()); + geometry_box.set_content_size(bounding_box.size()); total_bounding_box = total_bounding_box.united(path.bounding_box()); } diff --git a/Userland/Libraries/LibWeb/Layout/SVGGeometryBox.cpp b/Userland/Libraries/LibWeb/Layout/SVGGeometryBox.cpp index 756016361f..0f6c4a774f 100644 --- a/Userland/Libraries/LibWeb/Layout/SVGGeometryBox.cpp +++ b/Userland/Libraries/LibWeb/Layout/SVGGeometryBox.cpp @@ -32,7 +32,7 @@ void SVGGeometryBox::paint(PaintContext& context, PaintPhase phase) Gfx::AntiAliasingPainter painter { context.painter() }; auto& svg_context = context.svg_context(); - auto offset = absolute_position(); + auto offset = svg_context.svg_element_position(); painter.translate(offset); if (auto fill_color = geometry_element.fill_color().value_or(svg_context.fill_color()); fill_color.alpha() > 0) { diff --git a/Userland/Libraries/LibWeb/Layout/SVGSVGBox.cpp b/Userland/Libraries/LibWeb/Layout/SVGSVGBox.cpp index ce051bb9b7..5c941bfed1 100644 --- a/Userland/Libraries/LibWeb/Layout/SVGSVGBox.cpp +++ b/Userland/Libraries/LibWeb/Layout/SVGSVGBox.cpp @@ -19,7 +19,7 @@ void SVGSVGBox::before_children_paint(PaintContext& context, PaintPhase phase) return; if (!context.has_svg_context()) - context.set_svg_context(SVGContext()); + context.set_svg_context(SVGContext(absolute_rect())); SVGGraphicsBox::before_children_paint(context, phase); } diff --git a/Userland/Libraries/LibWeb/SVG/SVGContext.h b/Userland/Libraries/LibWeb/SVG/SVGContext.h index 884a1e62df..2e073a5cce 100644 --- a/Userland/Libraries/LibWeb/SVG/SVGContext.h +++ b/Userland/Libraries/LibWeb/SVG/SVGContext.h @@ -8,12 +8,14 @@ #include <AK/Vector.h> #include <LibGfx/Color.h> +#include <LibGfx/Rect.h> namespace Web { class SVGContext { public: - SVGContext() + SVGContext(Gfx::FloatRect svg_element_bounds) + : m_svg_element_bounds(svg_element_bounds) { m_states.append(State()); } @@ -26,6 +28,8 @@ public: void set_stroke_color(Gfx::Color color) { state().stroke_color = color; } void set_stroke_width(float width) { state().stroke_width = width; } + Gfx::FloatPoint svg_element_position() const { return m_svg_element_bounds.top_left(); } + void save() { m_states.append(m_states.last()); } void restore() { m_states.take_last(); } @@ -39,6 +43,7 @@ private: const State& state() const { return m_states.last(); } State& state() { return m_states.last(); } + Gfx::FloatRect m_svg_element_bounds; Vector<State> m_states; }; |