diff --git a/Userland/Applications/PixelPaint/Image.cpp b/Userland/Applications/PixelPaint/Image.cpp index f3e73b32d0..c6e16d8b9c 100644 --- a/Userland/Applications/PixelPaint/Image.cpp +++ b/Userland/Applications/PixelPaint/Image.cpp @@ -1,6 +1,7 @@ /* * Copyright (c) 2020-2021, Andreas Kling * Copyright (c) 2021, Mustafa Quraish + * Copyright (c) 2021, Tobias Christiansen * * SPDX-License-Identifier: BSD-2-Clause */ @@ -113,6 +114,18 @@ Result, String> Image::try_create_from_pixel_paint_file(Cor return String { "Not a valid PP file"sv }; auto& json = json_or_error.value().as_object(); + auto image_or_error = try_create_from_pixel_paint_json(json); + + if (image_or_error.is_error()) + return image_or_error.release_error(); + + auto image = image_or_error.release_value(); + image->set_path(file_path); + return image; +} + +Result, String> Image::try_create_from_pixel_paint_json(JsonObject const& json) +{ auto image = try_create_with_size({ json.get("width").to_i32(), json.get("height").to_i32() }); if (!image) return String { "Image memory allocation failed" }; @@ -147,7 +160,6 @@ Result, String> Image::try_create_from_pixel_paint_file(Cor layer->set_selected(layer_object.get("selected").as_bool()); } - image->set_path(file_path); return image.release_nonnull(); } @@ -197,10 +209,8 @@ Result, String> Image::try_create_from_path(String const& f return image.release_nonnull(); } -Result Image::write_to_fd_and_close(int fd) const +void Image::serialize_as_json(JsonObjectSerializer& json) const { - StringBuilder builder; - JsonObjectSerializer json(builder); json.add("width", m_size.width()); json.add("height", m_size.height()); { @@ -219,6 +229,13 @@ Result Image::write_to_fd_and_close(int fd) const json_layer.add("bitmap", encode_base64(bmp_dumber.dump(layer.bitmap()))); } } +} + +Result Image::write_to_fd_and_close(int fd) const +{ + StringBuilder builder; + JsonObjectSerializer json(builder); + serialize_as_json(json); json.finish(); auto file = Core::File::construct(); @@ -235,24 +252,7 @@ Result Image::write_to_file(const String& file_path) const { StringBuilder builder; JsonObjectSerializer json(builder); - json.add("width", m_size.width()); - json.add("height", m_size.height()); - { - auto json_layers = json.add_array("layers"); - for (const auto& layer : m_layers) { - Gfx::BMPWriter bmp_dumber; - auto json_layer = json_layers.add_object(); - json_layer.add("width", layer.size().width()); - json_layer.add("height", layer.size().height()); - json_layer.add("name", layer.name()); - json_layer.add("locationx", layer.location().x()); - json_layer.add("locationy", layer.location().y()); - json_layer.add("opacity_percent", layer.opacity_percent()); - json_layer.add("visible", layer.is_visible()); - json_layer.add("selected", layer.is_selected()); - json_layer.add("bitmap", encode_base64(bmp_dumber.dump(layer.bitmap()))); - } - } + serialize_as_json(json); json.finish(); auto file_or_error = Core::File::open(file_path, (Core::OpenMode)(Core::OpenMode::WriteOnly | Core::OpenMode::Truncate)); diff --git a/Userland/Applications/PixelPaint/Image.h b/Userland/Applications/PixelPaint/Image.h index b681c10c13..f83ed2ce18 100644 --- a/Userland/Applications/PixelPaint/Image.h +++ b/Userland/Applications/PixelPaint/Image.h @@ -1,6 +1,7 @@ /* * Copyright (c) 2020-2021, Andreas Kling * Copyright (c) 2021, Mustafa Quraish + * Copyright (c) 2021, Tobias Christiansen * * SPDX-License-Identifier: BSD-2-Clause */ @@ -8,6 +9,7 @@ #pragma once #include +#include #include #include #include @@ -47,6 +49,7 @@ public: static Result, String> try_create_from_fd_and_close(int fd, String const& file_path); static Result, String> try_create_from_path(String const& file_path); static RefPtr try_create_from_bitmap(NonnullRefPtr); + static Result, String> try_create_from_pixel_paint_json(JsonObject const&); // This generates a new Bitmap with the final image (all layers composed according to their attributes.) RefPtr try_compose_bitmap(Gfx::BitmapFormat format) const; @@ -63,6 +66,8 @@ public: void restore_snapshot(Image const&); void paint_into(GUI::Painter&, Gfx::IntRect const& dest_rect) const; + + void serialize_as_json(JsonObjectSerializer& json) const; Result write_to_fd_and_close(int fd) const; Result write_to_file(String const& file_path) const; Result export_bmp_to_fd_and_close(int fd, bool preserve_alpha_channel);