Skip to content

Commit

Permalink
LibWeb: Remove stacking context painting failure handling
Browse files Browse the repository at this point in the history
CommandResult was needed by LibGfx display list player that could have
failed to allocate a temporary bitmap for painting a stacking context
with CSS transforms. This is no longer an issue with Skia painter, so
we can delete CommandResult::SkipStackingContext handling path.
  • Loading branch information
kalenikaliaksandr committed Jul 24, 2024
1 parent 70e053b commit 6ae9b54
Show file tree
Hide file tree
Showing 4 changed files with 94 additions and 153 deletions.
23 changes: 3 additions & 20 deletions Userland/Libraries/LibWeb/Painting/DisplayList.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -141,13 +141,12 @@ void DisplayList::execute(DisplayListPlayer& executor)
}
}

#define HANDLE_COMMAND(command_type, executor_method) \
if (command.has<command_type>()) { \
result = executor.executor_method(command.get<command_type>()); \
#define HANDLE_COMMAND(command_type, executor_method) \
if (command.has<command_type>()) { \
executor.executor_method(command.get<command_type>()); \
}

// clang-format off
CommandResult result;
HANDLE_COMMAND(DrawGlyphRun, draw_glyph_run)
else HANDLE_COMMAND(FillRect, fill_rect)
else HANDLE_COMMAND(DrawScaledBitmap, draw_scaled_bitmap)
Expand Down Expand Up @@ -179,22 +178,6 @@ void DisplayList::execute(DisplayListPlayer& executor)
else HANDLE_COMMAND(BlitCornerClipping, blit_corner_clipping)
else VERIFY_NOT_REACHED();
// clang-format on

if (result == CommandResult::SkipStackingContext) {
auto stacking_context_nesting_level = 1;
while (next_command_index < m_commands.size()) {
if (m_commands[next_command_index].command.has<PushStackingContext>()) {
stacking_context_nesting_level++;
} else if (m_commands[next_command_index].command.has<PopStackingContext>()) {
stacking_context_nesting_level--;
}

next_command_index++;

if (stacking_context_nesting_level == 0)
break;
}
}
}
}

Expand Down
63 changes: 29 additions & 34 deletions Userland/Libraries/LibWeb/Painting/DisplayList.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,44 +32,39 @@

namespace Web::Painting {

enum class CommandResult {
Continue,
SkipStackingContext,
};

class DisplayListPlayer {
public:
virtual ~DisplayListPlayer() = default;

virtual CommandResult draw_glyph_run(DrawGlyphRun const&) = 0;
virtual CommandResult fill_rect(FillRect const&) = 0;
virtual CommandResult draw_scaled_bitmap(DrawScaledBitmap const&) = 0;
virtual CommandResult draw_scaled_immutable_bitmap(DrawScaledImmutableBitmap const&) = 0;
virtual CommandResult draw_repeated_immutable_bitmap(DrawRepeatedImmutableBitmap const&) = 0;
virtual CommandResult save(Save const&) = 0;
virtual CommandResult restore(Restore const&) = 0;
virtual CommandResult add_clip_rect(AddClipRect const&) = 0;
virtual CommandResult push_stacking_context(PushStackingContext const&) = 0;
virtual CommandResult pop_stacking_context(PopStackingContext const&) = 0;
virtual CommandResult paint_linear_gradient(PaintLinearGradient const&) = 0;
virtual CommandResult paint_radial_gradient(PaintRadialGradient const&) = 0;
virtual CommandResult paint_conic_gradient(PaintConicGradient const&) = 0;
virtual CommandResult paint_outer_box_shadow(PaintOuterBoxShadow const&) = 0;
virtual CommandResult paint_inner_box_shadow(PaintInnerBoxShadow const&) = 0;
virtual CommandResult paint_text_shadow(PaintTextShadow const&) = 0;
virtual CommandResult fill_rect_with_rounded_corners(FillRectWithRoundedCorners const&) = 0;
virtual CommandResult fill_path_using_color(FillPathUsingColor const&) = 0;
virtual CommandResult fill_path_using_paint_style(FillPathUsingPaintStyle const&) = 0;
virtual CommandResult stroke_path_using_color(StrokePathUsingColor const&) = 0;
virtual CommandResult stroke_path_using_paint_style(StrokePathUsingPaintStyle const&) = 0;
virtual CommandResult draw_ellipse(DrawEllipse const&) = 0;
virtual CommandResult fill_ellipse(FillEllipse const&) = 0;
virtual CommandResult draw_line(DrawLine const&) = 0;
virtual CommandResult apply_backdrop_filter(ApplyBackdropFilter const&) = 0;
virtual CommandResult draw_rect(DrawRect const&) = 0;
virtual CommandResult draw_triangle_wave(DrawTriangleWave const&) = 0;
virtual CommandResult sample_under_corners(SampleUnderCorners const&) = 0;
virtual CommandResult blit_corner_clipping(BlitCornerClipping const&) = 0;
virtual void draw_glyph_run(DrawGlyphRun const&) = 0;
virtual void fill_rect(FillRect const&) = 0;
virtual void draw_scaled_bitmap(DrawScaledBitmap const&) = 0;
virtual void draw_scaled_immutable_bitmap(DrawScaledImmutableBitmap const&) = 0;
virtual void draw_repeated_immutable_bitmap(DrawRepeatedImmutableBitmap const&) = 0;
virtual void save(Save const&) = 0;
virtual void restore(Restore const&) = 0;
virtual void add_clip_rect(AddClipRect const&) = 0;
virtual void push_stacking_context(PushStackingContext const&) = 0;
virtual void pop_stacking_context(PopStackingContext const&) = 0;
virtual void paint_linear_gradient(PaintLinearGradient const&) = 0;
virtual void paint_radial_gradient(PaintRadialGradient const&) = 0;
virtual void paint_conic_gradient(PaintConicGradient const&) = 0;
virtual void paint_outer_box_shadow(PaintOuterBoxShadow const&) = 0;
virtual void paint_inner_box_shadow(PaintInnerBoxShadow const&) = 0;
virtual void paint_text_shadow(PaintTextShadow const&) = 0;
virtual void fill_rect_with_rounded_corners(FillRectWithRoundedCorners const&) = 0;
virtual void fill_path_using_color(FillPathUsingColor const&) = 0;
virtual void fill_path_using_paint_style(FillPathUsingPaintStyle const&) = 0;
virtual void stroke_path_using_color(StrokePathUsingColor const&) = 0;
virtual void stroke_path_using_paint_style(StrokePathUsingPaintStyle const&) = 0;
virtual void draw_ellipse(DrawEllipse const&) = 0;
virtual void fill_ellipse(FillEllipse const&) = 0;
virtual void draw_line(DrawLine const&) = 0;
virtual void apply_backdrop_filter(ApplyBackdropFilter const&) = 0;
virtual void draw_rect(DrawRect const&) = 0;
virtual void draw_triangle_wave(DrawTriangleWave const&) = 0;
virtual void sample_under_corners(SampleUnderCorners const&) = 0;
virtual void blit_corner_clipping(BlitCornerClipping const&) = 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<Gfx::Font const*, HashTable<u32>> const& unique_glyphs) = 0;
Expand Down
Loading

0 comments on commit 6ae9b54

Please sign in to comment.