diff --git a/Userland/Libraries/LibGfx/TextLayout.cpp b/Userland/Libraries/LibGfx/TextLayout.cpp index 8f4fba48ccd..b9f90351410 100644 --- a/Userland/Libraries/LibGfx/TextLayout.cpp +++ b/Userland/Libraries/LibGfx/TextLayout.cpp @@ -14,15 +14,7 @@ namespace Gfx { -static DrawGlyphOrEmoji construct_glyph_or_emoji(size_t index, FloatPoint const& position, Gfx::Font const&, Span glyph_info, Span) -{ - return DrawGlyph { - .position = position, - .glyph_id = glyph_info[index].codepoint, - }; -} - -void for_each_glyph_position(FloatPoint baseline_start, Utf8View string, Gfx::Font const& font, Function callback, Optional width) +void for_each_glyph_position(FloatPoint baseline_start, Utf8View string, Gfx::Font const& font, Function callback, Optional width) { hb_buffer_t* buffer = hb_buffer_create(); ScopeGuard destroy_buffer = [&]() { hb_buffer_destroy(buffer); }; @@ -46,7 +38,10 @@ void for_each_glyph_position(FloatPoint baseline_start, Utf8View string, Gfx::Fo auto position = point - FloatPoint { 0, font.pixel_metrics().ascent } + FloatPoint { positions[i].x_offset, positions[i].y_offset } / text_shaping_resolution; - callback(construct_glyph_or_emoji(i, position, font, { glyph_info, glyph_count }, input_glyph_info.span())); + callback(DrawGlyph { + .position = position, + .glyph_id = glyph_info[i].codepoint, + }); point += FloatPoint { positions[i].x_advance, positions[i].y_advance } / text_shaping_resolution; } @@ -57,7 +52,7 @@ void for_each_glyph_position(FloatPoint baseline_start, Utf8View string, Gfx::Fo float measure_text_width(Utf8View const& string, Gfx::Font const& font) { float width = 0; - for_each_glyph_position({}, string, font, [&](DrawGlyphOrEmoji const&) {}, width); + for_each_glyph_position({}, string, font, [&](DrawGlyph const&) {}, width); return width; } diff --git a/Userland/Libraries/LibGfx/TextLayout.h b/Userland/Libraries/LibGfx/TextLayout.h index 4c2eb6a1611..29725f1b5b4 100644 --- a/Userland/Libraries/LibGfx/TextLayout.h +++ b/Userland/Libraries/LibGfx/TextLayout.h @@ -30,18 +30,6 @@ struct DrawGlyph { } }; -struct DrawEmoji { - FloatPoint position; - Gfx::Bitmap const* emoji; - - void translate_by(FloatPoint const& delta) - { - position.translate_by(delta); - } -}; - -using DrawGlyphOrEmoji = Variant; - class GlyphRun : public RefCounted { public: enum class TextType { @@ -52,7 +40,7 @@ public: Rtl, }; - GlyphRun(Vector&& glyphs, NonnullRefPtr font, TextType text_type) + GlyphRun(Vector&& glyphs, NonnullRefPtr font, TextType text_type) : m_glyphs(move(glyphs)) , m_font(move(font)) , m_text_type(text_type) @@ -61,19 +49,19 @@ public: [[nodiscard]] Font const& font() const { return m_font; } [[nodiscard]] TextType text_type() const { return m_text_type; } - [[nodiscard]] Vector const& glyphs() const { return m_glyphs; } - [[nodiscard]] Vector& glyphs() { return m_glyphs; } + [[nodiscard]] Vector const& glyphs() const { return m_glyphs; } + [[nodiscard]] Vector& glyphs() { return m_glyphs; } [[nodiscard]] bool is_empty() const { return m_glyphs.is_empty(); } - void append(Gfx::DrawGlyphOrEmoji glyph) { m_glyphs.append(glyph); } + void append(DrawGlyph glyph) { m_glyphs.append(glyph); } private: - Vector m_glyphs; + Vector m_glyphs; NonnullRefPtr m_font; TextType m_text_type; }; -void for_each_glyph_position(FloatPoint baseline_start, Utf8View string, Gfx::Font const& font, Function callback, Optional width = {}); +void for_each_glyph_position(FloatPoint baseline_start, Utf8View string, Gfx::Font const& font, Function callback, Optional width = {}); float measure_text_width(Utf8View const& string, Gfx::Font const& font); } diff --git a/Userland/Libraries/LibWeb/HTML/CanvasRenderingContext2D.cpp b/Userland/Libraries/LibWeb/HTML/CanvasRenderingContext2D.cpp index cbd4354daf0..2254a6cd6ab 100644 --- a/Userland/Libraries/LibWeb/HTML/CanvasRenderingContext2D.cpp +++ b/Userland/Libraries/LibWeb/HTML/CanvasRenderingContext2D.cpp @@ -516,8 +516,8 @@ CanvasRenderingContext2D::PreparedText CanvasRenderingContext2D::prepare_text(By auto glyph_run = adopt_ref(*new Gfx::GlyphRun({}, *font, Gfx::GlyphRun::TextType::Ltr)); float glyph_run_width = 0; Gfx::for_each_glyph_position( - anchor, replaced_text.code_points(), *font, [&](Gfx::DrawGlyphOrEmoji const& glyph_or_emoji) { - glyph_run->append(glyph_or_emoji); + anchor, replaced_text.code_points(), *font, [&](Gfx::DrawGlyph const& glyph) { + glyph_run->append(glyph); }, glyph_run_width); diff --git a/Userland/Libraries/LibWeb/Layout/InlineFormattingContext.cpp b/Userland/Libraries/LibWeb/Layout/InlineFormattingContext.cpp index 64514cfaea5..bf8777be189 100644 --- a/Userland/Libraries/LibWeb/Layout/InlineFormattingContext.cpp +++ b/Userland/Libraries/LibWeb/Layout/InlineFormattingContext.cpp @@ -356,20 +356,11 @@ void InlineFormattingContext::generate_line_boxes(LayoutMode layout_mode) size_t last_glyph_index = 0; auto last_glyph_position = Gfx::FloatPoint(); - for (auto const& glyph_or_emoji : glyphs) { - auto this_position = Gfx::FloatPoint(); - glyph_or_emoji.visit( - [&](Gfx::DrawGlyph glyph) { - this_position = glyph.position; - }, - [&](Gfx::DrawEmoji emoji) { - this_position = emoji.position; - }); - if (this_position.x() > max_text_width) + for (auto const& glyph : glyphs) { + if (glyph.position.x() > max_text_width) break; - last_glyph_index++; - last_glyph_position = this_position; + last_glyph_position = glyph.position; } if (last_glyph_index > 1) { diff --git a/Userland/Libraries/LibWeb/Layout/InlineLevelIterator.cpp b/Userland/Libraries/LibWeb/Layout/InlineLevelIterator.cpp index 29d6438474d..71488343df0 100644 --- a/Userland/Libraries/LibWeb/Layout/InlineLevelIterator.cpp +++ b/Userland/Libraries/LibWeb/Layout/InlineLevelIterator.cpp @@ -239,11 +239,11 @@ Optional InlineLevelIterator::next_without_lookahead( }; } - Vector glyph_run; + Vector glyph_run; float glyph_run_width = 0; Gfx::for_each_glyph_position( - { 0, 0 }, chunk.view, chunk.font, [&](Gfx::DrawGlyphOrEmoji const& glyph_or_emoji) { - glyph_run.append(glyph_or_emoji); + { 0, 0 }, chunk.view, chunk.font, [&](Gfx::DrawGlyph const& glyph) { + glyph_run.append(glyph); }, glyph_run_width); diff --git a/Userland/Libraries/LibWeb/Layout/LineBoxFragment.cpp b/Userland/Libraries/LibWeb/Layout/LineBoxFragment.cpp index 52a1272054e..43b1c8db954 100644 --- a/Userland/Libraries/LibWeb/Layout/LineBoxFragment.cpp +++ b/Userland/Libraries/LibWeb/Layout/LineBoxFragment.cpp @@ -103,19 +103,17 @@ void LineBoxFragment::append_glyph_run_ltr(RefPtr const& glyph_ru switch (run_direction) { case CSS::Direction::Ltr: for (auto& glyph : glyph_run->glyphs()) { - glyph.visit([&](auto& glyph) { glyph.position.translate_by(width().to_float(), 0); }); + glyph.position.translate_by(width().to_float(), 0); m_glyph_run->append(glyph); } break; case CSS::Direction::Rtl: for (auto& glyph : m_glyph_run->glyphs()) { - glyph.visit([&](auto& glyph) { - if (glyph.position.x() >= m_insert_position) - glyph.position.translate_by(run_width.to_float(), 0); - }); + if (glyph.position.x() >= m_insert_position) + glyph.position.translate_by(run_width.to_float(), 0); } for (auto& glyph : glyph_run->glyphs()) { - glyph.visit([&](auto& glyph) { glyph.position.translate_by(m_insert_position, 0); }); + glyph.position.translate_by(m_insert_position, 0); m_glyph_run->append(glyph); } break; @@ -137,20 +135,18 @@ void LineBoxFragment::append_glyph_run_rtl(RefPtr const& glyph_ru switch (run_direction) { case CSS::Direction::Ltr: for (auto& glyph : m_glyph_run->glyphs()) { - glyph.visit([&](auto& glyph) { - if (glyph.position.x() >= m_insert_position) - glyph.position.translate_by(run_width.to_float(), 0); - }); + if (glyph.position.x() >= m_insert_position) + glyph.position.translate_by(run_width.to_float(), 0); } for (auto& glyph : glyph_run->glyphs()) { - glyph.visit([&](auto& glyph) { glyph.position.translate_by(m_insert_position, 0); }); + glyph.position.translate_by(m_insert_position, 0); m_glyph_run->append(glyph); } break; case CSS::Direction::Rtl: if (glyph_run->text_type() != Gfx::GlyphRun::TextType::EndPadding) { for (auto& glyph : m_glyph_run->glyphs()) { - glyph.visit([&](auto& glyph) { glyph.position.translate_by(run_width.to_float(), 0); }); + glyph.position.translate_by(run_width.to_float(), 0); } } for (auto& glyph : glyph_run->glyphs()) { diff --git a/Userland/Libraries/LibWeb/Painting/DisplayListPlayerSkia.cpp b/Userland/Libraries/LibWeb/Painting/DisplayListPlayerSkia.cpp index e379a10a811..809fb0aee0d 100644 --- a/Userland/Libraries/LibWeb/Painting/DisplayListPlayerSkia.cpp +++ b/Userland/Libraries/LibWeb/Painting/DisplayListPlayerSkia.cpp @@ -344,18 +344,13 @@ void DisplayListPlayerSkia::draw_glyph_run(DrawGlyphRun const& command) Vector positions; positions.ensure_capacity(glyph_count); auto font_ascent = gfx_font.pixel_metrics().ascent; - for (auto const& glyph_or_emoji : command.glyph_run->glyphs()) { - auto transformed_glyph = glyph_or_emoji; - transformed_glyph.visit([&](auto& glyph) { - glyph.position.set_y(glyph.position.y() + font_ascent); - glyph.position = glyph.position.scaled(command.scale); - }); - if (transformed_glyph.has()) { - auto& glyph = transformed_glyph.get(); - auto const& point = glyph.position; - glyphs.append(glyph.glyph_id); - positions.append(to_skia_point(point)); - } + for (auto const& glyph : command.glyph_run->glyphs()) { + auto transformed_glyph = glyph; + transformed_glyph.position.set_y(glyph.position.y() + font_ascent); + transformed_glyph.position = transformed_glyph.position.scaled(command.scale); + auto const& point = transformed_glyph.position; + glyphs.append(transformed_glyph.glyph_id); + positions.append(to_skia_point(point)); } SkPaint paint; diff --git a/Userland/Libraries/LibWeb/Painting/DisplayListRecorder.cpp b/Userland/Libraries/LibWeb/Painting/DisplayListRecorder.cpp index c139b6c47f9..381e6f6320e 100644 --- a/Userland/Libraries/LibWeb/Painting/DisplayListRecorder.cpp +++ b/Userland/Libraries/LibWeb/Painting/DisplayListRecorder.cpp @@ -236,8 +236,8 @@ void DisplayListRecorder::draw_text(Gfx::IntRect const& rect, String raw_text, G auto glyph_run = adopt_ref(*new Gfx::GlyphRun({}, font, Gfx::GlyphRun::TextType::Ltr)); float glyph_run_width = 0; Gfx::for_each_glyph_position( - { 0, 0 }, raw_text.code_points(), font, [&](Gfx::DrawGlyphOrEmoji const& glyph_or_emoji) { - glyph_run->append(glyph_or_emoji); + { 0, 0 }, raw_text.code_points(), font, [&](Gfx::DrawGlyph const& glyph) { + glyph_run->append(glyph); }, glyph_run_width);