diff --git a/Meta/Lagom/CMakeLists.txt b/Meta/Lagom/CMakeLists.txt index 7c54d280dd..1d2e7f926e 100644 --- a/Meta/Lagom/CMakeLists.txt +++ b/Meta/Lagom/CMakeLists.txt @@ -405,6 +405,7 @@ endif() if (BUILD_LAGOM) # Lagom Libraries set(lagom_standard_libraries + AccelGfx Archive Audio Compress diff --git a/Userland/Libraries/LibWeb/CMakeLists.txt b/Userland/Libraries/LibWeb/CMakeLists.txt index e7ceae5796..7d5891a0a6 100644 --- a/Userland/Libraries/LibWeb/CMakeLists.txt +++ b/Userland/Libraries/LibWeb/CMakeLists.txt @@ -626,6 +626,10 @@ set(SOURCES XML/XMLDocumentBuilder.cpp ) +if (LINUX) + list(APPEND SOURCES Painting/PaintingCommandExecutorGPU.cpp) +endif() + invoke_generator( "AriaRoles.cpp" Lagom::GenerateAriaRoles @@ -659,6 +663,10 @@ serenity_lib(LibWeb web) target_link_libraries(LibWeb PRIVATE LibCore LibCrypto LibJS LibMarkdown LibHTTP LibGemini LibGL LibGUI LibGfx LibIPC LibLocale LibRegex LibSoftGPU LibSyntax LibTextCodec LibUnicode LibAudio LibVideo LibWasm LibXML LibIDL) link_with_locale_data(LibWeb) +if (LINUX) + target_link_libraries(LibWeb PRIVATE LibAccelGfx) +endif() + generate_js_bindings(LibWeb) # Note: If you're looking for the calls to "libweb_js_bindings()", diff --git a/Userland/Libraries/LibWeb/Painting/PaintingCommandExecutorGPU.cpp b/Userland/Libraries/LibWeb/Painting/PaintingCommandExecutorGPU.cpp new file mode 100644 index 0000000000..525003c031 --- /dev/null +++ b/Userland/Libraries/LibWeb/Painting/PaintingCommandExecutorGPU.cpp @@ -0,0 +1,227 @@ +/* + * Copyright (c) 2023, Aliaksandr Kalenik + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include + +namespace Web::Painting { + +PaintingCommandExecutorGPU::PaintingCommandExecutorGPU(Gfx::Bitmap& bitmap) + : m_target_bitmap(bitmap) + , m_canvas(AccelGfx::Canvas::create(AccelGfx::Context::the(), bitmap)) + , m_painter(m_canvas) +{ +} + +PaintingCommandExecutorGPU::~PaintingCommandExecutorGPU() +{ + m_canvas.flush(); +} + +CommandResult PaintingCommandExecutorGPU::draw_text_run(Color const&, Gfx::IntPoint const&, String const&, Gfx::Font const&) +{ + // FIXME + return CommandResult::Continue; +} + +CommandResult PaintingCommandExecutorGPU::draw_text(Gfx::IntRect const&, String const&, Gfx::TextAlignment, Color const&, Gfx::TextElision, Gfx::TextWrapping, Optional> const&) +{ + // FIXME + return CommandResult::Continue; +} + +CommandResult PaintingCommandExecutorGPU::fill_rect(Gfx::IntRect const& rect, Color const& color) +{ + painter().fill_rect(rect, color); + return CommandResult::Continue; +} + +CommandResult PaintingCommandExecutorGPU::draw_scaled_bitmap(Gfx::IntRect const&, Gfx::Bitmap const&, Gfx::IntRect const&, float, Gfx::Painter::ScalingMode) +{ + // FIXME + return CommandResult::Continue; +} + +CommandResult PaintingCommandExecutorGPU::set_clip_rect(Gfx::IntRect const&) +{ + // FIXME + return CommandResult::Continue; +} + +CommandResult PaintingCommandExecutorGPU::clear_clip_rect() +{ + // FIXME + return CommandResult::Continue; +} + +CommandResult PaintingCommandExecutorGPU::set_font(Gfx::Font const&) +{ + // FIXME + return CommandResult::Continue; +} + +CommandResult PaintingCommandExecutorGPU::push_stacking_context(bool, float, Gfx::FloatRect const&, Gfx::FloatRect const&, Gfx::IntPoint const&) +{ + // FIXME + return CommandResult::Continue; +} + +CommandResult PaintingCommandExecutorGPU::pop_stacking_context(bool, Gfx::Painter::ScalingMode) +{ + // FIXME + return CommandResult::Continue; +} + +CommandResult PaintingCommandExecutorGPU::push_stacking_context_with_mask(Gfx::IntRect const&) +{ + // FIXME + return CommandResult::Continue; +} + +CommandResult PaintingCommandExecutorGPU::pop_stacking_context_with_mask(Gfx::IntRect const&, RefPtr const&, Gfx::Bitmap::MaskKind, float) +{ + // FIXME + return CommandResult::Continue; +} + +CommandResult PaintingCommandExecutorGPU::paint_linear_gradient(Gfx::IntRect const&, Web::Painting::LinearGradientData const&) +{ + // FIXME + return CommandResult::Continue; +} + +CommandResult PaintingCommandExecutorGPU::paint_outer_box_shadow(PaintOuterBoxShadowParams const&) +{ + // FIXME + return CommandResult::Continue; +} + +CommandResult PaintingCommandExecutorGPU::paint_inner_box_shadow(PaintOuterBoxShadowParams const&) +{ + // FIXME + return CommandResult::Continue; +} + +CommandResult PaintingCommandExecutorGPU::paint_text_shadow(int, Gfx::IntRect const&, Gfx::IntRect const&, String const&, Gfx::Font const&, Color const&, int, Gfx::IntPoint const&) +{ + // FIXME + return CommandResult::Continue; +} + +CommandResult PaintingCommandExecutorGPU::fill_rect_with_rounded_corners(Gfx::IntRect const&, Color const&, Gfx::AntiAliasingPainter::CornerRadius const&, Gfx::AntiAliasingPainter::CornerRadius const&, Gfx::AntiAliasingPainter::CornerRadius const&, Gfx::AntiAliasingPainter::CornerRadius const&, Optional const&) +{ + // FIXME + return CommandResult::Continue; +} + +CommandResult PaintingCommandExecutorGPU::fill_path_using_color(Gfx::Path const&, Color const&, Gfx::Painter::WindingRule, Optional const&) +{ + // FIXME + return CommandResult::Continue; +} + +CommandResult PaintingCommandExecutorGPU::fill_path_using_paint_style(Gfx::Path const&, Gfx::PaintStyle const&, Gfx::Painter::WindingRule, float, Optional const&) +{ + // FIXME + return CommandResult::Continue; +} + +CommandResult PaintingCommandExecutorGPU::stroke_path_using_color(Gfx::Path const&, Color const&, float, Optional const&) +{ + // FIXME + return CommandResult::Continue; +} + +CommandResult PaintingCommandExecutorGPU::stroke_path_using_paint_style(Gfx::Path const&, Gfx::PaintStyle const&, float, float, Optional const&) +{ + // FIXME + return CommandResult::Continue; +} + +CommandResult PaintingCommandExecutorGPU::draw_ellipse(Gfx::IntRect const&, Color const&, int) +{ + // FIXME + return CommandResult::Continue; +} + +CommandResult PaintingCommandExecutorGPU::fill_ellipse(Gfx::IntRect const&, Color const&, Gfx::AntiAliasingPainter::BlendMode) +{ + // FIXME + return CommandResult::Continue; +} + +CommandResult PaintingCommandExecutorGPU::draw_line(Color const&, Gfx::IntPoint const&, Gfx::IntPoint const&, int, Gfx::Painter::LineStyle, Color const&) +{ + // FIXME + return CommandResult::Continue; +} + +CommandResult PaintingCommandExecutorGPU::draw_signed_distance_field(Gfx::IntRect const&, Color const&, Gfx::GrayscaleBitmap const&, float) +{ + // FIXME + return CommandResult::Continue; +} + +CommandResult PaintingCommandExecutorGPU::paint_progressbar(Gfx::IntRect const&, Gfx::IntRect const&, Palette const&, int, int, int, StringView const&) +{ + // FIXME + return CommandResult::Continue; +} + +CommandResult PaintingCommandExecutorGPU::paint_frame(Gfx::IntRect const&, Palette const&, Gfx::FrameStyle) +{ + // FIXME + return CommandResult::Continue; +} + +CommandResult PaintingCommandExecutorGPU::apply_backdrop_filter(Gfx::IntRect const&, Web::CSS::ResolvedBackdropFilter const&) +{ + // FIXME + return CommandResult::Continue; +} + +CommandResult PaintingCommandExecutorGPU::draw_rect(Gfx::IntRect const&, Color const&, bool) +{ + // FIXME + return CommandResult::Continue; +} + +CommandResult PaintingCommandExecutorGPU::paint_radial_gradient(Gfx::IntRect const&, Web::Painting::RadialGradientData const&, Gfx::IntPoint const&, Gfx::IntSize const&) +{ + // FIXME + return CommandResult::Continue; +} + +CommandResult PaintingCommandExecutorGPU::paint_conic_gradient(Gfx::IntRect const&, Web::Painting::ConicGradientData const&, Gfx::IntPoint const&) +{ + // FIXME + return CommandResult::Continue; +} + +CommandResult PaintingCommandExecutorGPU::draw_triangle_wave(Gfx::IntPoint const&, Gfx::IntPoint const&, Color const&, int, int) +{ + // FIXME + return CommandResult::Continue; +} + +CommandResult PaintingCommandExecutorGPU::sample_under_corners(BorderRadiusCornerClipper&) +{ + // FIXME + return CommandResult::Continue; +} + +CommandResult PaintingCommandExecutorGPU::blit_corner_clipping(BorderRadiusCornerClipper&) +{ + // FIXME + return CommandResult::Continue; +} + +bool PaintingCommandExecutorGPU::would_be_fully_clipped_by_painter(Gfx::IntRect) const +{ + // FIXME + return false; +} + +} diff --git a/Userland/Libraries/LibWeb/Painting/PaintingCommandExecutorGPU.h b/Userland/Libraries/LibWeb/Painting/PaintingCommandExecutorGPU.h new file mode 100644 index 0000000000..89473cc137 --- /dev/null +++ b/Userland/Libraries/LibWeb/Painting/PaintingCommandExecutorGPU.h @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2023, Aliaksandr Kalenik + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include +#include +#include + +namespace Web::Painting { + +class PaintingCommandExecutorGPU : public PaintingCommandExecutor { +public: + CommandResult draw_text_run(Color const&, Gfx::IntPoint const& baseline_start, String const& string, Gfx::Font const& font) 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, float opacity, Gfx::Painter::ScalingMode scaling_mode) override; + CommandResult set_clip_rect(Gfx::IntRect const& rect) override; + CommandResult clear_clip_rect() override; + CommandResult set_font(Gfx::Font const&) override; + CommandResult push_stacking_context(bool semitransparent_or_has_non_identity_transform, float opacity, Gfx::FloatRect const& source_rect, Gfx::FloatRect const& transformed_destination_rect, Gfx::IntPoint const& painter_location) override; + CommandResult pop_stacking_context(bool semitransparent_or_has_non_identity_transform, Gfx::Painter::ScalingMode scaling_mode) override; + CommandResult push_stacking_context_with_mask(Gfx::IntRect const&) override; + CommandResult pop_stacking_context_with_mask(Gfx::IntRect const&, RefPtr const& mask_bitmap, Gfx::Bitmap::MaskKind mask_kind, float opacity) override; + CommandResult paint_linear_gradient(Gfx::IntRect const&, Web::Painting::LinearGradientData const&) override; + CommandResult paint_outer_box_shadow(PaintOuterBoxShadowParams const&) override; + CommandResult paint_inner_box_shadow(PaintOuterBoxShadowParams const&) override; + CommandResult paint_text_shadow(int blur_radius, Gfx::IntRect const& shadow_bounding_rect, Gfx::IntRect const& text_rect, String const& text, Gfx::Font const&, Color const&, int fragment_baseline, Gfx::IntPoint const& draw_location) override; + CommandResult fill_rect_with_rounded_corners(Gfx::IntRect const&, Color const&, Gfx::AntiAliasingPainter::CornerRadius const& top_left_radius, Gfx::AntiAliasingPainter::CornerRadius const& top_right_radius, Gfx::AntiAliasingPainter::CornerRadius const& bottom_left_radius, Gfx::AntiAliasingPainter::CornerRadius const& bottom_right_radius, Optional const& aa_translation) override; + CommandResult fill_path_using_color(Gfx::Path const&, Color const&, Gfx::Painter::WindingRule winding_rule, Optional const& aa_translation) override; + CommandResult fill_path_using_paint_style(Gfx::Path const&, Gfx::PaintStyle const& paint_style, Gfx::Painter::WindingRule winding_rule, float opacity, Optional const& aa_translation) override; + CommandResult stroke_path_using_color(Gfx::Path const&, Color const& color, float thickness, Optional const& aa_translation) override; + CommandResult stroke_path_using_paint_style(Gfx::Path const& path, Gfx::PaintStyle const& paint_style, float thickness, float opacity, Optional const& aa_translation) override; + CommandResult draw_ellipse(Gfx::IntRect const& rect, Color const& color, int thickness) override; + CommandResult fill_ellipse(Gfx::IntRect const& rect, Color const& color, Gfx::AntiAliasingPainter::BlendMode blend_mode) override; + CommandResult draw_line(Color const&, Gfx::IntPoint const& from, Gfx::IntPoint const& to, int thickness, Gfx::Painter::LineStyle style, Color const& alternate_color) override; + CommandResult draw_signed_distance_field(Gfx::IntRect const& rect, Color const&, Gfx::GrayscaleBitmap const& sdf, float smoothing) override; + CommandResult paint_progressbar(Gfx::IntRect const& frame_rect, Gfx::IntRect const& progress_rect, Palette const& palette, int min, int max, int value, StringView const& text) override; + CommandResult paint_frame(Gfx::IntRect const& rect, Palette const&, Gfx::FrameStyle) override; + CommandResult apply_backdrop_filter(Gfx::IntRect const& backdrop_region, Web::CSS::ResolvedBackdropFilter const& backdrop_filter) override; + CommandResult draw_rect(Gfx::IntRect const& rect, Color const&, bool rough) override; + CommandResult paint_radial_gradient(Gfx::IntRect const& rect, Web::Painting::RadialGradientData const& radial_gradient_data, Gfx::IntPoint const& center, Gfx::IntSize const& size) override; + CommandResult paint_conic_gradient(Gfx::IntRect const& rect, Web::Painting::ConicGradientData const& conic_gradient_data, Gfx::IntPoint const& position) override; + CommandResult draw_triangle_wave(Gfx::IntPoint const& p1, Gfx::IntPoint const& p2, Color const&, int amplitude, int thickness) override; + CommandResult sample_under_corners(BorderRadiusCornerClipper&) override; + CommandResult blit_corner_clipping(BorderRadiusCornerClipper&) override; + + bool would_be_fully_clipped_by_painter(Gfx::IntRect) const override; + + PaintingCommandExecutorGPU(Gfx::Bitmap& bitmap); + ~PaintingCommandExecutorGPU() override; + +private: + AccelGfx::Painter& painter() { return m_painter; } + + Gfx::Bitmap& m_target_bitmap; + AccelGfx::Canvas m_canvas; + AccelGfx::Painter m_painter; +}; + +}