From 8e265b512a3385b8494187e05132d7be90c4a340 Mon Sep 17 00:00:00 2001 From: Pierre Date: Fri, 22 Jan 2021 11:55:26 +0100 Subject: [PATCH] PixelPaint: adding an option to export as PNG --- Userland/Applications/PixelPaint/Image.cpp | 14 ++++++++++++++ Userland/Applications/PixelPaint/Image.h | 1 + Userland/Applications/PixelPaint/main.cpp | 14 ++++++++++++++ 3 files changed, 29 insertions(+) diff --git a/Userland/Applications/PixelPaint/Image.cpp b/Userland/Applications/PixelPaint/Image.cpp index 09a075dfe0..01f202cce4 100644 --- a/Userland/Applications/PixelPaint/Image.cpp +++ b/Userland/Applications/PixelPaint/Image.cpp @@ -34,6 +34,7 @@ #include #include #include +#include #include //#define PAINT_DEBUG @@ -153,6 +154,19 @@ void Image::export_bmp(const String& file_path) fclose(file); } +void Image::export_png(const String& file_path) +{ + auto bitmap = Gfx::Bitmap::create(Gfx::BitmapFormat::RGBA32, m_size); + GUI::Painter painter(*bitmap); + paint_into(painter, { 0, 0, m_size.width(), m_size.height() }); + + Gfx::PNGWriter png_writer; + auto png = png_writer.write(bitmap); + auto file = fopen(file_path.characters(), "wb"); + fwrite(png.data(), sizeof(u8), png.size(), file); + fclose(file); +} + void Image::add_layer(NonnullRefPtr layer) { for (auto& existing_layer : m_layers) { diff --git a/Userland/Applications/PixelPaint/Image.h b/Userland/Applications/PixelPaint/Image.h index 63184b3ad3..858c2381e1 100644 --- a/Userland/Applications/PixelPaint/Image.h +++ b/Userland/Applications/PixelPaint/Image.h @@ -70,6 +70,7 @@ public: void paint_into(GUI::Painter&, const Gfx::IntRect& dest_rect); void save(const String& file_path) const; void export_bmp(const String& file_path); + void export_png(const String& file_path); 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 df581829e6..9c054a67dd 100644 --- a/Userland/Applications/PixelPaint/main.cpp +++ b/Userland/Applications/PixelPaint/main.cpp @@ -160,6 +160,20 @@ int main(int argc, char** argv) image_editor.image()->export_bmp(save_path.value()); }, window)); + export_submenu.add_action( + GUI::Action::create( + "As PNG", [&](auto&) { + if (!image_editor.image()) + return; + + Optional save_path = GUI::FilePicker::get_save_filepath(window, "untitled", "png"); + + if (!save_path.has_value()) + return; + + image_editor.image()->export_png(save_path.value()); + }, + window)); app_menu.add_separator(); app_menu.add_action(GUI::CommonActions::make_quit_action([](auto&) {