diff --git a/Userland/Libraries/LibWeb/Painting/Command.h b/Userland/Libraries/LibWeb/Painting/Command.h index f75d00bdc9..3175e7f126 100644 --- a/Userland/Libraries/LibWeb/Painting/Command.h +++ b/Userland/Libraries/LibWeb/Painting/Command.h @@ -41,6 +41,7 @@ struct DrawGlyphRun { Vector glyph_run; Color color; Gfx::IntRect rect; + Gfx::FloatPoint translation; [[nodiscard]] Gfx::IntRect bounding_rect() const { return rect; } diff --git a/Userland/Libraries/LibWeb/Painting/CommandExecutorCPU.cpp b/Userland/Libraries/LibWeb/Painting/CommandExecutorCPU.cpp index 888e5f42b4..fa774b5cd1 100644 --- a/Userland/Libraries/LibWeb/Painting/CommandExecutorCPU.cpp +++ b/Userland/Libraries/LibWeb/Painting/CommandExecutorCPU.cpp @@ -24,15 +24,17 @@ CommandExecutorCPU::CommandExecutorCPU(Gfx::Bitmap& bitmap) .scaling_mode = {} }); } -CommandResult CommandExecutorCPU::draw_glyph_run(Vector const& glyph_run, Color const& color) +CommandResult CommandExecutorCPU::draw_glyph_run(Vector const& glyph_run, Color const& color, Gfx::FloatPoint translation) { auto& painter = this->painter(); for (auto& glyph_or_emoji : glyph_run) { + auto transformed_glyph = glyph_or_emoji; + transformed_glyph.visit([&](auto& glyph) { glyph.position.translate_by(translation); }); if (glyph_or_emoji.has()) { - auto& glyph = glyph_or_emoji.get(); + auto& glyph = transformed_glyph.get(); painter.draw_glyph(glyph.position, glyph.code_point, *glyph.font, color); } else { - auto& emoji = glyph_or_emoji.get(); + auto& emoji = transformed_glyph.get(); painter.draw_emoji(emoji.position.to_type(), *emoji.emoji, *emoji.font); } } diff --git a/Userland/Libraries/LibWeb/Painting/CommandExecutorCPU.h b/Userland/Libraries/LibWeb/Painting/CommandExecutorCPU.h index f59f557581..a6806d7f3a 100644 --- a/Userland/Libraries/LibWeb/Painting/CommandExecutorCPU.h +++ b/Userland/Libraries/LibWeb/Painting/CommandExecutorCPU.h @@ -13,7 +13,7 @@ namespace Web::Painting { class CommandExecutorCPU : public CommandExecutor { public: - CommandResult draw_glyph_run(Vector const& glyph_run, Color const&) override; + CommandResult draw_glyph_run(Vector const& glyph_run, Color const&, Gfx::FloatPoint translation) override; CommandResult draw_text(Gfx::IntRect const& rect, String const& raw_text, Gfx::TextAlignment alignment, Color const&, Gfx::TextElision, Gfx::TextWrapping, Optional> const&) override; CommandResult fill_rect(Gfx::IntRect const& rect, Color const&) override; CommandResult draw_scaled_bitmap(Gfx::IntRect const& dst_rect, Gfx::Bitmap const& bitmap, Gfx::IntRect const& src_rect, Gfx::Painter::ScalingMode scaling_mode) override; diff --git a/Userland/Libraries/LibWeb/Painting/CommandExecutorGPU.cpp b/Userland/Libraries/LibWeb/Painting/CommandExecutorGPU.cpp index d62ac40c2d..d1ca02f10f 100644 --- a/Userland/Libraries/LibWeb/Painting/CommandExecutorGPU.cpp +++ b/Userland/Libraries/LibWeb/Painting/CommandExecutorGPU.cpp @@ -31,9 +31,16 @@ CommandExecutorGPU::~CommandExecutorGPU() painter().flush(m_target_bitmap); } -CommandResult CommandExecutorGPU::draw_glyph_run(Vector const& glyph_run, Color const& color) +CommandResult CommandExecutorGPU::draw_glyph_run(Vector const& glyph_run, Color const& color, Gfx::FloatPoint translation) { - painter().draw_glyph_run(glyph_run, color); + Vector transformed_glyph_run; + transformed_glyph_run.ensure_capacity(glyph_run.size()); + for (auto& glyph : glyph_run) { + auto transformed_glyph = glyph; + transformed_glyph.visit([&](auto& glyph) { glyph.position.translate_by(translation); }); + transformed_glyph_run.append(transformed_glyph); + } + painter().draw_glyph_run(transformed_glyph_run, color); return CommandResult::Continue; } diff --git a/Userland/Libraries/LibWeb/Painting/CommandExecutorGPU.h b/Userland/Libraries/LibWeb/Painting/CommandExecutorGPU.h index dcc610212a..a2a938d2f3 100644 --- a/Userland/Libraries/LibWeb/Painting/CommandExecutorGPU.h +++ b/Userland/Libraries/LibWeb/Painting/CommandExecutorGPU.h @@ -14,7 +14,7 @@ namespace Web::Painting { class CommandExecutorGPU : public CommandExecutor { public: - CommandResult draw_glyph_run(Vector const& glyph_run, Color const&) override; + CommandResult draw_glyph_run(Vector const& glyph_run, Color const&, Gfx::FloatPoint translation) override; CommandResult draw_text(Gfx::IntRect const& rect, String const& raw_text, Gfx::TextAlignment alignment, Color const&, Gfx::TextElision, Gfx::TextWrapping, Optional> const&) override; CommandResult fill_rect(Gfx::IntRect const& rect, Color const&) override; CommandResult draw_scaled_bitmap(Gfx::IntRect const& dst_rect, Gfx::Bitmap const& bitmap, Gfx::IntRect const& src_rect, Gfx::Painter::ScalingMode scaling_mode) override; diff --git a/Userland/Libraries/LibWeb/Painting/CommandList.cpp b/Userland/Libraries/LibWeb/Painting/CommandList.cpp index bee31bf902..e9779ba650 100644 --- a/Userland/Libraries/LibWeb/Painting/CommandList.cpp +++ b/Userland/Libraries/LibWeb/Painting/CommandList.cpp @@ -87,7 +87,7 @@ void CommandList::execute(CommandExecutor& executor) auto result = command.visit( [&](DrawGlyphRun const& command) { - return executor.draw_glyph_run(command.glyph_run, command.color); + return executor.draw_glyph_run(command.glyph_run, command.color, command.translation); }, [&](DrawText const& command) { return executor.draw_text(command.rect, command.raw_text, command.alignment, command.color, diff --git a/Userland/Libraries/LibWeb/Painting/CommandList.h b/Userland/Libraries/LibWeb/Painting/CommandList.h index 01c6803244..06dd915520 100644 --- a/Userland/Libraries/LibWeb/Painting/CommandList.h +++ b/Userland/Libraries/LibWeb/Painting/CommandList.h @@ -47,7 +47,7 @@ class CommandExecutor { public: virtual ~CommandExecutor() = default; - virtual CommandResult draw_glyph_run(Vector const& glyph_run, Color const&) = 0; + virtual CommandResult draw_glyph_run(Vector const& glyph_run, Color const&, Gfx::FloatPoint translation) = 0; virtual CommandResult draw_text(Gfx::IntRect const&, String const&, Gfx::TextAlignment alignment, Color const&, Gfx::TextElision, Gfx::TextWrapping, Optional> const&) = 0; virtual CommandResult fill_rect(Gfx::IntRect const&, Color const&) = 0; virtual CommandResult draw_scaled_bitmap(Gfx::IntRect const& dst_rect, Gfx::Bitmap const& bitmap, Gfx::IntRect const& src_rect, Gfx::Painter::ScalingMode scaling_mode) = 0; diff --git a/Userland/Libraries/LibWeb/Painting/RecordingPainter.cpp b/Userland/Libraries/LibWeb/Painting/RecordingPainter.cpp index 3faa2a4a38..a0757da515 100644 --- a/Userland/Libraries/LibWeb/Painting/RecordingPainter.cpp +++ b/Userland/Libraries/LibWeb/Painting/RecordingPainter.cpp @@ -209,16 +209,11 @@ void RecordingPainter::draw_signed_distance_field(Gfx::IntRect const& dst_rect, void RecordingPainter::draw_text_run(Gfx::IntPoint baseline_start, Span glyph_run, Color color, Gfx::IntRect const& rect) { auto transformed_baseline_start = state().translation.map(baseline_start).to_type(); - Vector translated_glyph_run; - translated_glyph_run.ensure_capacity(glyph_run.size()); - for (auto glyph : glyph_run) { - glyph.visit([&](auto& glyph) { glyph.position.translate_by(transformed_baseline_start); }); - translated_glyph_run.append(glyph); - } append(DrawGlyphRun { - .glyph_run = move(translated_glyph_run), + .glyph_run = Vector { glyph_run }, .color = color, .rect = state().translation.map(rect), + .translation = transformed_baseline_start, }); }