
The implementation of painting for SVG text follows the same pattern as the implementation of painting for SVG geometries. However, instead of reusing the existing PaintableWithLines to draw text, a new class called SVGTextPaintable is introduced. because everything that is painted inside an SVG is expected to inherit from SVGGraphicsPaintable. Therefore reusing the text painting from regular text nodes would require significant refactoring.
56 lines
1.7 KiB
C++
56 lines
1.7 KiB
C++
/*
|
|
* Copyright (c) 2023, Aliaksandr Kalenik <kalenik.aliaksandr@gmail.com>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#include <LibWeb/Painting/SVGTextPaintable.h>
|
|
#include <LibWeb/SVG/SVGSVGElement.h>
|
|
|
|
namespace Web::Painting {
|
|
|
|
JS::NonnullGCPtr<SVGTextPaintable> SVGTextPaintable::create(Layout::SVGTextBox const& layout_box)
|
|
{
|
|
return layout_box.heap().allocate_without_realm<SVGTextPaintable>(layout_box);
|
|
}
|
|
|
|
SVGTextPaintable::SVGTextPaintable(Layout::SVGTextBox const& layout_box)
|
|
: SVGGraphicsPaintable(layout_box)
|
|
{
|
|
}
|
|
|
|
Optional<HitTestResult> SVGTextPaintable::hit_test(CSSPixelPoint position, HitTestType type) const
|
|
{
|
|
(void)position;
|
|
(void)type;
|
|
return {};
|
|
}
|
|
|
|
void SVGTextPaintable::paint(PaintContext& context, PaintPhase phase) const
|
|
{
|
|
if (!is_visible())
|
|
return;
|
|
|
|
SVGGraphicsPaintable::paint(context, phase);
|
|
|
|
if (phase != PaintPhase::Foreground)
|
|
return;
|
|
|
|
auto& painter = context.painter();
|
|
|
|
Gfx::PainterStateSaver save_painter { painter };
|
|
auto& svg_context = context.svg_context();
|
|
auto svg_context_offset = context.floored_device_point(svg_context.svg_element_position()).to_type<int>();
|
|
painter.translate(svg_context_offset);
|
|
|
|
auto const& dom_node = layout_box().dom_node();
|
|
|
|
auto child_text_content = dom_node.child_text_content();
|
|
|
|
auto transform = layout_box().layout_transform();
|
|
auto& scaled_font = layout_node().scaled_font(context);
|
|
auto text_offset = context.floored_device_point(dom_node.get_offset().transformed(*transform).to_type<CSSPixels>());
|
|
painter.draw_text_run(text_offset.to_type<int>(), Utf8View { child_text_content }, scaled_font, layout_node().computed_values().fill()->as_color());
|
|
}
|
|
|
|
}
|