From f7053059c96d4a84c237b4395fe0a0ba4f3dbafc Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Tue, 6 Jul 2021 20:35:19 +0200 Subject: [PATCH] PixelPaint: Allow partial invalidation of Layer and Image Let's give ourselves the tools needed to update less than the entire image every time we paint. This patch adds plumbing so that Layer invalidations have a modified rect that gets passed on to Image, and then on to ImageEditor. --- Userland/Applications/PixelPaint/Image.cpp | 9 +++++---- Userland/Applications/PixelPaint/Image.h | 6 +++--- Userland/Applications/PixelPaint/ImageEditor.cpp | 4 ++-- Userland/Applications/PixelPaint/ImageEditor.h | 2 +- Userland/Applications/PixelPaint/Layer.cpp | 4 ++-- Userland/Applications/PixelPaint/Layer.h | 2 +- 6 files changed, 14 insertions(+), 13 deletions(-) diff --git a/Userland/Applications/PixelPaint/Image.cpp b/Userland/Applications/PixelPaint/Image.cpp index 33ed9ff84a..a5435a29e2 100644 --- a/Userland/Applications/PixelPaint/Image.cpp +++ b/Userland/Applications/PixelPaint/Image.cpp @@ -384,13 +384,13 @@ void Image::remove_client(ImageClient& client) m_clients.remove(&client); } -void Image::layer_did_modify_bitmap(Badge, Layer const& layer) +void Image::layer_did_modify_bitmap(Badge, Layer const& layer, Gfx::IntRect const& modified_layer_rect) { auto layer_index = index_of(layer); for (auto* client : m_clients) client->image_did_modify_layer(layer_index); - did_change(); + did_change(modified_layer_rect.translated(layer.location())); } void Image::layer_did_modify_properties(Badge, Layer const& layer) @@ -402,10 +402,11 @@ void Image::layer_did_modify_properties(Badge, Layer const& layer) did_change(); } -void Image::did_change() +void Image::did_change(Gfx::IntRect const& a_modified_rect) { + auto modified_rect = a_modified_rect.is_empty() ? this->rect() : a_modified_rect; for (auto* client : m_clients) - client->image_did_change(); + client->image_did_change(modified_rect); } ImageUndoCommand::ImageUndoCommand(Image& image) diff --git a/Userland/Applications/PixelPaint/Image.h b/Userland/Applications/PixelPaint/Image.h index 65aad4726b..e42f9d8259 100644 --- a/Userland/Applications/PixelPaint/Image.h +++ b/Userland/Applications/PixelPaint/Image.h @@ -28,7 +28,7 @@ public: virtual void image_did_remove_layer(size_t) { } virtual void image_did_modify_layer(size_t) { } virtual void image_did_modify_layer_stack() { } - virtual void image_did_change() { } + virtual void image_did_change(Gfx::IntRect const&) { } virtual void image_select_layer(Layer*) { } virtual void image_did_change_title(String const&) { } @@ -72,7 +72,7 @@ public: void add_client(ImageClient&); void remove_client(ImageClient&); - void layer_did_modify_bitmap(Badge, Layer const&); + void layer_did_modify_bitmap(Badge, Layer const&, Gfx::IntRect const& modified_layer_rect); void layer_did_modify_properties(Badge, Layer const&); size_t index_of(Layer const&) const; @@ -88,7 +88,7 @@ private: static Result, String> try_create_from_pixel_paint_file(String const& file_path); - void did_change(); + void did_change(Gfx::IntRect const& modified_rect = {}); void did_modify_layer_stack(); String m_path; diff --git a/Userland/Applications/PixelPaint/ImageEditor.cpp b/Userland/Applications/PixelPaint/ImageEditor.cpp index c71b4685d5..5e525ed5e4 100644 --- a/Userland/Applications/PixelPaint/ImageEditor.cpp +++ b/Userland/Applications/PixelPaint/ImageEditor.cpp @@ -399,9 +399,9 @@ void ImageEditor::relayout() update(); } -void ImageEditor::image_did_change() +void ImageEditor::image_did_change(Gfx::IntRect const& modified_image_rect) { - update(m_editor_image_rect); + update(m_editor_image_rect.intersected(enclosing_int_rect(image_rect_to_editor_rect(modified_image_rect)))); } void ImageEditor::image_did_change_title(String const& path) diff --git a/Userland/Applications/PixelPaint/ImageEditor.h b/Userland/Applications/PixelPaint/ImageEditor.h index 88803ce1ef..28dcd15747 100644 --- a/Userland/Applications/PixelPaint/ImageEditor.h +++ b/Userland/Applications/PixelPaint/ImageEditor.h @@ -87,7 +87,7 @@ private: virtual void context_menu_event(GUI::ContextMenuEvent&) override; virtual void resize_event(GUI::ResizeEvent&) override; - virtual void image_did_change() override; + virtual void image_did_change(Gfx::IntRect const&) override; virtual void image_select_layer(Layer*) override; virtual void image_did_change_title(String const&) override; diff --git a/Userland/Applications/PixelPaint/Layer.cpp b/Userland/Applications/PixelPaint/Layer.cpp index 1db8722640..a6d0d4be9e 100644 --- a/Userland/Applications/PixelPaint/Layer.cpp +++ b/Userland/Applications/PixelPaint/Layer.cpp @@ -61,9 +61,9 @@ Layer::Layer(Image& image, NonnullRefPtr bitmap, String name) { } -void Layer::did_modify_bitmap() +void Layer::did_modify_bitmap(Gfx::IntRect const& rect) { - m_image.layer_did_modify_bitmap({}, *this); + m_image.layer_did_modify_bitmap({}, *this, rect); } void Layer::set_visible(bool visible) diff --git a/Userland/Applications/PixelPaint/Layer.h b/Userland/Applications/PixelPaint/Layer.h index 7991cffb94..273836b30b 100644 --- a/Userland/Applications/PixelPaint/Layer.h +++ b/Userland/Applications/PixelPaint/Layer.h @@ -46,7 +46,7 @@ public: void set_bitmap(NonnullRefPtr bitmap) { m_bitmap = move(bitmap); } - void did_modify_bitmap(); + void did_modify_bitmap(Gfx::IntRect const& = {}); void set_selected(bool selected) { m_selected = selected; } bool is_selected() const { return m_selected; }