diff --git a/Libraries/LibWeb/Painting/Command.h b/Libraries/LibWeb/Painting/Command.h index 637ad1e82d5..ac0fd887d6d 100644 --- a/Libraries/LibWeb/Painting/Command.h +++ b/Libraries/LibWeb/Painting/Command.h @@ -100,6 +100,7 @@ struct DrawRepeatedImmutableBitmap { }; struct Save { }; +struct SaveLayer { }; struct Restore { }; struct Translate { @@ -453,6 +454,7 @@ using Command = Variant< DrawScaledImmutableBitmap, DrawRepeatedImmutableBitmap, Save, + SaveLayer, Restore, Translate, AddClipRect, diff --git a/Libraries/LibWeb/Painting/DisplayList.cpp b/Libraries/LibWeb/Painting/DisplayList.cpp index b5644dcb769..f06f6523311 100644 --- a/Libraries/LibWeb/Painting/DisplayList.cpp +++ b/Libraries/LibWeb/Painting/DisplayList.cpp @@ -97,6 +97,7 @@ void DisplayListPlayer::execute(DisplayList& display_list) else HANDLE_COMMAND(DrawRepeatedImmutableBitmap, draw_repeated_immutable_bitmap) else HANDLE_COMMAND(AddClipRect, add_clip_rect) else HANDLE_COMMAND(Save, save) + else HANDLE_COMMAND(SaveLayer, save_layer) else HANDLE_COMMAND(Restore, restore) else HANDLE_COMMAND(Translate, translate) else HANDLE_COMMAND(PushStackingContext, push_stacking_context) diff --git a/Libraries/LibWeb/Painting/DisplayList.h b/Libraries/LibWeb/Painting/DisplayList.h index 048e5a03264..465a9a1c684 100644 --- a/Libraries/LibWeb/Painting/DisplayList.h +++ b/Libraries/LibWeb/Painting/DisplayList.h @@ -40,6 +40,7 @@ private: 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 save_layer(SaveLayer const&) = 0; virtual void restore(Restore const&) = 0; virtual void translate(Translate const&) = 0; virtual void add_clip_rect(AddClipRect const&) = 0; diff --git a/Libraries/LibWeb/Painting/DisplayListPlayerSkia.cpp b/Libraries/LibWeb/Painting/DisplayListPlayerSkia.cpp index 0be7022ba5a..a51dc3f370b 100644 --- a/Libraries/LibWeb/Painting/DisplayListPlayerSkia.cpp +++ b/Libraries/LibWeb/Painting/DisplayListPlayerSkia.cpp @@ -177,6 +177,12 @@ void DisplayListPlayerSkia::save(Save const&) canvas.save(); } +void DisplayListPlayerSkia::save_layer(SaveLayer const&) +{ + auto& canvas = surface().canvas(); + canvas.saveLayer(nullptr, nullptr); +} + void DisplayListPlayerSkia::restore(Restore const&) { auto& canvas = surface().canvas(); diff --git a/Libraries/LibWeb/Painting/DisplayListPlayerSkia.h b/Libraries/LibWeb/Painting/DisplayListPlayerSkia.h index a3ebbaa650a..b11642156f4 100644 --- a/Libraries/LibWeb/Painting/DisplayListPlayerSkia.h +++ b/Libraries/LibWeb/Painting/DisplayListPlayerSkia.h @@ -28,6 +28,7 @@ private: void draw_repeated_immutable_bitmap(DrawRepeatedImmutableBitmap const&) override; void add_clip_rect(AddClipRect const&) override; void save(Save const&) override; + void save_layer(SaveLayer const&) override; void restore(Restore const&) override; void translate(Translate const&) override; void push_stacking_context(PushStackingContext const&) override; diff --git a/Libraries/LibWeb/Painting/DisplayListRecorder.cpp b/Libraries/LibWeb/Painting/DisplayListRecorder.cpp index f17dedd13da..8e4c219c919 100644 --- a/Libraries/LibWeb/Painting/DisplayListRecorder.cpp +++ b/Libraries/LibWeb/Painting/DisplayListRecorder.cpp @@ -280,6 +280,11 @@ void DisplayListRecorder::save() append(Save {}); } +void DisplayListRecorder::save_layer() +{ + append(SaveLayer {}); +} + void DisplayListRecorder::restore() { append(Restore {}); diff --git a/Libraries/LibWeb/Painting/DisplayListRecorder.h b/Libraries/LibWeb/Painting/DisplayListRecorder.h index e3cbc7fa8a7..0da68e1ea24 100644 --- a/Libraries/LibWeb/Painting/DisplayListRecorder.h +++ b/Libraries/LibWeb/Painting/DisplayListRecorder.h @@ -114,6 +114,7 @@ public: void pop_scroll_frame_id(); void save(); + void save_layer(); void restore(); struct PushStackingContextParams {