summaryrefslogtreecommitdiff
path: root/Userland
diff options
context:
space:
mode:
authorMustafa Quraish <mustafaq9@gmail.com>2021-09-03 07:38:45 -0400
committerAndreas Kling <kling@serenityos.org>2021-09-04 03:30:03 +0200
commit6910cbc075c7768b84e2fc87c670bf7decd94dc8 (patch)
tree7717b8e48ed58eff2cf2f7f94642c7adfc1e4c2b /Userland
parent65d52467f4d29a85ba65b5bd9bce982f38a1bf8e (diff)
downloadserenity-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.cpp15
-rw-r--r--Userland/Applications/PixelPaint/Image.h2
-rw-r--r--Userland/Applications/PixelPaint/main.cpp15
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&) {