From 7850628ff1029a4a6eeb0b4f1db3eb15e4e26f97 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Mon, 28 Mar 2022 13:40:48 +0200 Subject: [PATCH] LibGfx: Add Painter::draw_text_run(), a simplified text painting API This API does: - Take a Utf8View - Take the starting point on the baseline as its input coordinate This API does not: - Align the text - Wrap the text - Elide too-long text into "..." --- Userland/Libraries/LibGfx/Painter.cpp | 19 +++++++++++++++++++ Userland/Libraries/LibGfx/Painter.h | 3 +++ 2 files changed, 22 insertions(+) diff --git a/Userland/Libraries/LibGfx/Painter.cpp b/Userland/Libraries/LibGfx/Painter.cpp index 8b68f22741..05603ab0f3 100644 --- a/Userland/Libraries/LibGfx/Painter.cpp +++ b/Userland/Libraries/LibGfx/Painter.cpp @@ -2314,4 +2314,23 @@ void Gfx::Painter::draw_ui_text(Gfx::IntRect const& rect, StringView text, Gfx:: } } } + +void Painter::draw_text_run(FloatPoint const& baseline_start, Utf8View const& string, Font const& font, Color color) +{ + auto pixel_metrics = font.pixel_metrics(); + float x = baseline_start.x(); + int y = baseline_start.y() - pixel_metrics.ascent; + float space_width = font.glyph_or_emoji_width(' '); + + for (auto code_point : string) { + if (code_point == ' ') { + x += space_width; + continue; + } + float advance = font.glyph_or_emoji_width(code_point) + font.glyph_spacing(); + draw_glyph_or_emoji({ (int)roundf(x), y }, code_point, font, color); + x += advance; + } +} + } diff --git a/Userland/Libraries/LibGfx/Painter.h b/Userland/Libraries/LibGfx/Painter.h index fedb6433ca..744702745c 100644 --- a/Userland/Libraries/LibGfx/Painter.h +++ b/Userland/Libraries/LibGfx/Painter.h @@ -87,6 +87,9 @@ public: void draw_glyph_or_emoji(IntPoint const&, Utf8CodePointIterator&, Font const&, Color); void draw_circle_arc_intersecting(IntRect const&, IntPoint const&, int radius, Color, int thickness); + // Streamlined text drawing routine that does no wrapping/elision/alignment. + void draw_text_run(FloatPoint const& baseline_start, Utf8View const&, Font const&, Color); + enum class CornerOrientation { TopLeft, TopRight,