Bläddra i källkod

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.
Marcus Nilsson 4 år sedan
förälder
incheckning
2183d01eb0

+ 8 - 6
Userland/Applications/PixelPaint/Image.cpp

@@ -192,9 +192,9 @@ Result<void, String> Image::write_to_file(const String& file_path) const
     return {};
 }
 
-RefPtr<Gfx::Bitmap> Image::try_compose_bitmap() const
+RefPtr<Gfx::Bitmap> 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<Gfx::Bitmap> Image::try_compose_bitmap() const
     return bitmap;
 }
 
-Result<void, String> Image::export_bmp_to_file(String const& file_path)
+Result<void, String> 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<void, String> Image::export_bmp_to_file(String const& file_path)
     return {};
 }
 
-Result<void, String> Image::export_png_to_file(String const& file_path)
+Result<void, String> 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 };
 

+ 3 - 3
Userland/Applications/PixelPaint/Image.h

@@ -43,7 +43,7 @@ public:
     static RefPtr<Image> try_create_from_bitmap(NonnullRefPtr<Gfx::Bitmap>);
 
     // This generates a new Bitmap with the final image (all layers composed according to their attributes.)
-    RefPtr<Gfx::Bitmap> try_compose_bitmap() const;
+    RefPtr<Gfx::Bitmap> 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<void, String> write_to_file(String const& file_path) const;
-    Result<void, String> export_bmp_to_file(String const& file_path);
-    Result<void, String> export_png_to_file(String const& file_path);
+    Result<void, String> export_bmp_to_file(String const& file_path, bool preserve_alpha_channel);
+    Result<void, String> export_png_to_file(String const& file_path, bool preserve_alpha_channel);
 
     void move_layer_to_front(Layer&);
     void move_layer_to_back(Layer&);

+ 4 - 2
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()));
             },