From 2183d01eb0c2ee9fd5db9af33b4f201586e5cd30 Mon Sep 17 00:00:00 2001 From: Marcus Nilsson Date: Sun, 4 Jul 2021 12:34:10 +0200 Subject: [PATCH] PixelPaint: Ask to preserve transparency when exporting Previously the alpha channel was thrown away when exporting to BMP or PNG in PixelPaint, instead let the user decide. --- Userland/Applications/PixelPaint/Image.cpp | 14 ++++++++------ Userland/Applications/PixelPaint/Image.h | 6 +++--- Userland/Applications/PixelPaint/main.cpp | 6 ++++-- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/Userland/Applications/PixelPaint/Image.cpp b/Userland/Applications/PixelPaint/Image.cpp index f9f93c8c43..33ed9ff84a 100644 --- a/Userland/Applications/PixelPaint/Image.cpp +++ b/Userland/Applications/PixelPaint/Image.cpp @@ -192,9 +192,9 @@ Result Image::write_to_file(const String& file_path) const return {}; } -RefPtr Image::try_compose_bitmap() const +RefPtr Image::try_compose_bitmap(Gfx::BitmapFormat format) const { - auto bitmap = Gfx::Bitmap::create(Gfx::BitmapFormat::BGRx8888, m_size); + auto bitmap = Gfx::Bitmap::create(format, m_size); if (!bitmap) return nullptr; GUI::Painter painter(*bitmap); @@ -202,13 +202,14 @@ RefPtr Image::try_compose_bitmap() const return bitmap; } -Result Image::export_bmp_to_file(String const& file_path) +Result Image::export_bmp_to_file(String const& file_path, bool preserve_alpha_channel) { auto file_or_error = Core::File::open(file_path, (Core::OpenMode)(Core::OpenMode::WriteOnly | Core::OpenMode::Truncate)); if (file_or_error.is_error()) return file_or_error.error(); - auto bitmap = try_compose_bitmap(); + auto bitmap_format = preserve_alpha_channel ? Gfx::BitmapFormat::BGRA8888 : Gfx::BitmapFormat::BGRx8888; + auto bitmap = try_compose_bitmap(bitmap_format); if (!bitmap) return String { "Failed to allocate bitmap for encoding"sv }; @@ -222,13 +223,14 @@ Result Image::export_bmp_to_file(String const& file_path) return {}; } -Result Image::export_png_to_file(String const& file_path) +Result Image::export_png_to_file(String const& file_path, bool preserve_alpha_channel) { auto file_or_error = Core::File::open(file_path, (Core::OpenMode)(Core::OpenMode::WriteOnly | Core::OpenMode::Truncate)); if (file_or_error.is_error()) return file_or_error.error(); - auto bitmap = try_compose_bitmap(); + auto bitmap_format = preserve_alpha_channel ? Gfx::BitmapFormat::BGRA8888 : Gfx::BitmapFormat::BGRx8888; + auto bitmap = try_compose_bitmap(bitmap_format); if (!bitmap) return String { "Failed to allocate bitmap for encoding"sv }; diff --git a/Userland/Applications/PixelPaint/Image.h b/Userland/Applications/PixelPaint/Image.h index a5474a6958..65aad4726b 100644 --- a/Userland/Applications/PixelPaint/Image.h +++ b/Userland/Applications/PixelPaint/Image.h @@ -43,7 +43,7 @@ public: static RefPtr try_create_from_bitmap(NonnullRefPtr); // This generates a new Bitmap with the final image (all layers composed according to their attributes.) - RefPtr try_compose_bitmap() const; + RefPtr try_compose_bitmap(Gfx::BitmapFormat format) const; size_t layer_count() const { return m_layers.size(); } Layer const& layer(size_t index) const { return m_layers.at(index); } @@ -58,8 +58,8 @@ public: void paint_into(GUI::Painter&, Gfx::IntRect const& dest_rect) const; Result write_to_file(String const& file_path) const; - Result export_bmp_to_file(String const& file_path); - Result export_png_to_file(String const& file_path); + Result export_bmp_to_file(String const& file_path, bool preserve_alpha_channel); + Result export_png_to_file(String const& file_path, bool preserve_alpha_channel); void move_layer_to_front(Layer&); void move_layer_to_back(Layer&); diff --git a/Userland/Applications/PixelPaint/main.cpp b/Userland/Applications/PixelPaint/main.cpp index bd2fc9d9a6..27167d347c 100644 --- a/Userland/Applications/PixelPaint/main.cpp +++ b/Userland/Applications/PixelPaint/main.cpp @@ -157,7 +157,8 @@ int main(int argc, char** argv) auto save_path = GUI::FilePicker::get_save_filepath(window, "untitled", "bmp"); if (!save_path.has_value()) return; - auto result = editor->image().export_bmp_to_file(save_path.value()); + auto preserve_alpha_channel = GUI::MessageBox::show(window, "Do you wish to preserve transparency?", "Preserve transparency?", GUI::MessageBox::Type::Question, GUI::MessageBox::InputType::YesNo); + auto result = editor->image().export_bmp_to_file(save_path.value(), preserve_alpha_channel == GUI::MessageBox::ExecYes); if (result.is_error()) GUI::MessageBox::show_error(window, String::formatted("Export to BMP failed: {}", result.error())); }, @@ -169,7 +170,8 @@ int main(int argc, char** argv) auto save_path = GUI::FilePicker::get_save_filepath(window, "untitled", "png"); if (!save_path.has_value()) return; - auto result = editor->image().export_bmp_to_file(save_path.value()); + auto preserve_alpha_channel = GUI::MessageBox::show(window, "Do you wish to preserve transparency?", "Preserve transparency?", GUI::MessageBox::Type::Question, GUI::MessageBox::InputType::YesNo); + auto result = editor->image().export_png_to_file(save_path.value(), preserve_alpha_channel == GUI::MessageBox::ExecYes); if (result.is_error()) GUI::MessageBox::show_error(window, String::formatted("Export to PNG failed: {}", result.error())); },