diff --git a/Userland/Libraries/LibWeb/Painting/PaintingCommandExecutorCPU.h b/Userland/Libraries/LibWeb/Painting/PaintingCommandExecutorCPU.h index 15f72b32a8..1758a2cefb 100644 --- a/Userland/Libraries/LibWeb/Painting/PaintingCommandExecutorCPU.h +++ b/Userland/Libraries/LibWeb/Painting/PaintingCommandExecutorCPU.h @@ -48,6 +48,9 @@ public: bool would_be_fully_clipped_by_painter(Gfx::IntRect) const override; + bool needs_prepare_glyphs_texture() const override { return false; } + void prepare_glyph_texture(HashMap> const&) override {}; + PaintingCommandExecutorCPU(Gfx::Bitmap& bitmap); private: diff --git a/Userland/Libraries/LibWeb/Painting/PaintingCommandExecutorGPU.cpp b/Userland/Libraries/LibWeb/Painting/PaintingCommandExecutorGPU.cpp index ff5d5e3afc..528a7c2db0 100644 --- a/Userland/Libraries/LibWeb/Painting/PaintingCommandExecutorGPU.cpp +++ b/Userland/Libraries/LibWeb/Painting/PaintingCommandExecutorGPU.cpp @@ -18,9 +18,9 @@ PaintingCommandExecutorGPU::~PaintingCommandExecutorGPU() m_painter.flush(); } -CommandResult PaintingCommandExecutorGPU::draw_glyph_run(Vector const&, Color const&) +CommandResult PaintingCommandExecutorGPU::draw_glyph_run(Vector const& glyph_run, Color const& color) { - // FIXME + painter().draw_glyph_run(glyph_run, color); return CommandResult::Continue; } @@ -238,4 +238,9 @@ bool PaintingCommandExecutorGPU::would_be_fully_clipped_by_painter(Gfx::IntRect) return false; } +void PaintingCommandExecutorGPU::prepare_glyph_texture(HashMap> const& unique_glyphs) +{ + m_painter.prepare_glyph_texture(unique_glyphs); +} + } diff --git a/Userland/Libraries/LibWeb/Painting/PaintingCommandExecutorGPU.h b/Userland/Libraries/LibWeb/Painting/PaintingCommandExecutorGPU.h index 3e6a0f03f4..706bfaf6cc 100644 --- a/Userland/Libraries/LibWeb/Painting/PaintingCommandExecutorGPU.h +++ b/Userland/Libraries/LibWeb/Painting/PaintingCommandExecutorGPU.h @@ -50,6 +50,9 @@ public: bool would_be_fully_clipped_by_painter(Gfx::IntRect) const override; + virtual bool needs_prepare_glyphs_texture() const override { return true; } + void prepare_glyph_texture(HashMap> const&) override; + PaintingCommandExecutorGPU(AccelGfx::Painter& painter); ~PaintingCommandExecutorGPU() override; diff --git a/Userland/Libraries/LibWeb/Painting/RecordingPainter.cpp b/Userland/Libraries/LibWeb/Painting/RecordingPainter.cpp index 17a1ee6844..f4acb1c9a9 100644 --- a/Userland/Libraries/LibWeb/Painting/RecordingPainter.cpp +++ b/Userland/Libraries/LibWeb/Painting/RecordingPainter.cpp @@ -417,6 +417,21 @@ static Optional command_bounding_rectangle(PaintingCommand const& void RecordingPainter::execute(PaintingCommandExecutor& executor) { + if (executor.needs_prepare_glyphs_texture()) { + HashMap> unique_glyphs; + for (auto& command : m_painting_commands) { + if (command.has()) { + for (auto const& glyph_or_emoji : command.get().glyph_run) { + if (glyph_or_emoji.has()) { + auto const& glyph = glyph_or_emoji.get(); + unique_glyphs.ensure(glyph.font, [] { return HashTable {}; }).set(glyph.code_point); + } + } + } + } + executor.prepare_glyph_texture(unique_glyphs); + } + size_t next_command_index = 0; while (next_command_index < m_painting_commands.size()) { auto& command = m_painting_commands[next_command_index++]; diff --git a/Userland/Libraries/LibWeb/Painting/RecordingPainter.h b/Userland/Libraries/LibWeb/Painting/RecordingPainter.h index 6597855531..4baab328ed 100644 --- a/Userland/Libraries/LibWeb/Painting/RecordingPainter.h +++ b/Userland/Libraries/LibWeb/Painting/RecordingPainter.h @@ -376,6 +376,9 @@ public: virtual CommandResult blit_corner_clipping(BorderRadiusCornerClipper&) = 0; virtual bool would_be_fully_clipped_by_painter(Gfx::IntRect) const = 0; + + virtual bool needs_prepare_glyphs_texture() const { return false; } + virtual void prepare_glyph_texture(HashMap> const& unique_glyphs) = 0; }; class RecordingPainter {