diff options
author | Mustafa Quraish <mustafaq9@gmail.com> | 2021-09-03 07:38:45 -0400 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2021-09-04 03:30:03 +0200 |
commit | 6910cbc075c7768b84e2fc87c670bf7decd94dc8 (patch) | |
tree | 7717b8e48ed58eff2cf2f7f94642c7adfc1e4c2b /Userland | |
parent | 65d52467f4d29a85ba65b5bd9bce982f38a1bf8e (diff) | |
download | serenity-6910cbc075c7768b84e2fc87c670bf7decd94dc8.zip |
PixelPaint: Add `Copy Merged` action
This allows the user to copy the merged bitmap (all visible layers).
Diffstat (limited to 'Userland')
-rw-r--r-- | Userland/Applications/PixelPaint/Image.cpp | 15 | ||||
-rw-r--r-- | Userland/Applications/PixelPaint/Image.h | 2 | ||||
-rw-r--r-- | Userland/Applications/PixelPaint/main.cpp | 15 |
3 files changed, 32 insertions, 0 deletions
diff --git a/Userland/Applications/PixelPaint/Image.cpp b/Userland/Applications/PixelPaint/Image.cpp index 5d32cf2dc8..174ce6fd60 100644 --- a/Userland/Applications/PixelPaint/Image.cpp +++ b/Userland/Applications/PixelPaint/Image.cpp @@ -8,6 +8,7 @@ #include "Image.h" #include "Layer.h" +#include "Selection.h" #include <AK/Base64.h> #include <AK/JsonObject.h> #include <AK/JsonObjectSerializer.h> @@ -173,6 +174,20 @@ RefPtr<Gfx::Bitmap> Image::try_compose_bitmap(Gfx::BitmapFormat format) const return bitmap; } +RefPtr<Gfx::Bitmap> Image::try_copy_bitmap(Selection const& selection) const +{ + if (selection.is_empty()) + return {}; + auto selection_rect = selection.bounding_rect(); + + // FIXME: Add a way to only compose a certain part of the image + auto full_bitmap = try_compose_bitmap(Gfx::BitmapFormat::BGRA8888); + if (!full_bitmap) + return {}; + + return full_bitmap->cropped(selection_rect); +} + Result<void, String> Image::export_bmp_to_fd_and_close(int fd, bool preserve_alpha_channel) { auto file = Core::File::construct(); diff --git a/Userland/Applications/PixelPaint/Image.h b/Userland/Applications/PixelPaint/Image.h index 1ffa9d382e..9ae8bb40ee 100644 --- a/Userland/Applications/PixelPaint/Image.h +++ b/Userland/Applications/PixelPaint/Image.h @@ -26,6 +26,7 @@ namespace PixelPaint { class Layer; +class Selection; class ImageClient { public: @@ -53,6 +54,7 @@ public: // This generates a new Bitmap with the final image (all layers composed according to their attributes.) RefPtr<Gfx::Bitmap> try_compose_bitmap(Gfx::BitmapFormat format) const; + RefPtr<Gfx::Bitmap> try_copy_bitmap(Selection const&) const; size_t layer_count() const { return m_layers.size(); } Layer const& layer(size_t index) const { return m_layers.at(index); } diff --git a/Userland/Applications/PixelPaint/main.cpp b/Userland/Applications/PixelPaint/main.cpp index 1916e93aeb..bb679824a8 100644 --- a/Userland/Applications/PixelPaint/main.cpp +++ b/Userland/Applications/PixelPaint/main.cpp @@ -256,6 +256,20 @@ int main(int argc, char** argv) } GUI::Clipboard::the().set_bitmap(*bitmap); }); + auto copy_merged_action = GUI::Action::create( + "Copy &Merged", { Mod_Ctrl | Mod_Shift, Key_C }, Gfx::Bitmap::try_load_from_file("/res/icons/16x16/edit-copy.png"), + [&](auto&) { + auto* editor = current_image_editor(); + if (!editor) + return; + auto bitmap = editor->image().try_copy_bitmap(editor->selection()); + if (!bitmap) { + dbgln("try_copy_bitmap() from Image failed"); + return; + } + GUI::Clipboard::the().set_bitmap(*bitmap); + }, + window); auto paste_action = GUI::CommonActions::make_paste_action([&](auto&) { auto* editor = current_image_editor(); @@ -277,6 +291,7 @@ int main(int argc, char** argv) paste_action->set_enabled(GUI::Clipboard::the().mime_type() == "image/x-serenityos"); edit_menu.add_action(copy_action); + edit_menu.add_action(copy_merged_action); edit_menu.add_action(paste_action); auto undo_action = GUI::CommonActions::make_undo_action([&](auto&) { |