Build a hit-test display list while recording paint output. Use it as source of truth for point hit testing instead of recursively walking the paintable tree in reverse paint order. The retained list records target paintables, visual context indices, border radii, caret rects, and line metadata needed by hit testing. It also keeps a spatial index so point queries inspect nearby items before checking containment in paint order. Refresh scroll state before hit testing so visual context transforms use current scroll offsets. Add text tests for rounded hit regions and selection across non-text content.
49 lines
1.5 KiB
C++
49 lines
1.5 KiB
C++
/*
|
|
* Copyright (c) 2022, Andreas Kling <andreas@ladybird.org>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <LibGfx/Path.h>
|
|
#include <LibWeb/Export.h>
|
|
#include <LibWeb/Layout/SVGGraphicsBox.h>
|
|
#include <LibWeb/Painting/SVGGraphicsPaintable.h>
|
|
|
|
namespace Web::Painting {
|
|
|
|
class WEB_API SVGPathPaintable final : public SVGGraphicsPaintable {
|
|
public:
|
|
static NonnullRefPtr<SVGPathPaintable> create(Layout::SVGGraphicsBox const&);
|
|
virtual StringView class_name() const override { return "SVGPathPaintable"sv; }
|
|
|
|
virtual Optional<CSSPixelRect> clip_path_geometry_bounds(Gfx::AffineTransform const& additional_transform) const override;
|
|
|
|
virtual void paint(DisplayListRecordingContext&, PaintPhase) const override;
|
|
virtual void record_hit_test_items(DisplayListRecordingContext&, PaintPhase) const override;
|
|
|
|
SVG::SVGGraphicsElement const& dom_node() const { return as<SVG::SVGGraphicsElement>(*Paintable::dom_node()); }
|
|
|
|
void set_computed_path(Gfx::Path path)
|
|
{
|
|
m_computed_path = move(path);
|
|
}
|
|
|
|
Optional<Gfx::Path> const& computed_path() const { return m_computed_path; }
|
|
|
|
virtual void reset_for_relayout() override;
|
|
|
|
protected:
|
|
SVGPathPaintable(Layout::SVGGraphicsBox const&);
|
|
|
|
Optional<Gfx::Path> m_computed_path = {};
|
|
|
|
private:
|
|
virtual bool is_svg_path_paintable() const final { return true; }
|
|
};
|
|
|
|
template<>
|
|
inline bool Paintable::fast_is<SVGPathPaintable>() const { return is_svg_path_paintable(); }
|
|
|
|
}
|