From a5c4df7a99a5d38a87e10e996439db6a8b49f756 Mon Sep 17 00:00:00 2001 From: MladoniSzabi Date: Wed, 5 Oct 2022 13:29:22 +0100 Subject: [PATCH] Fixed Image.save_jpg() returning OK but not saving image. The function that was supposed to implement the saving in image_loader_jpegd was just returning OK without doing anything. Copied the code from _jpgd_buffer_save_func to _jpgd_save_func but changed the ImageLoaderJPGOSBufferto a ImageLoaderJPGOSFile to save to a file instead of memory. Changed the image format from FORMAT_ETC2_RGB8 to FORMAT_RGB8 since the first one was creating a weird greyscale interlaced image. --- modules/jpg/image_loader_jpegd.cpp | 38 ++++++++++++++++++++---------- 1 file changed, 25 insertions(+), 13 deletions(-) diff --git a/modules/jpg/image_loader_jpegd.cpp b/modules/jpg/image_loader_jpegd.cpp index ce20ac90609..cd4140ab30f 100644 --- a/modules/jpg/image_loader_jpegd.cpp +++ b/modules/jpg/image_loader_jpegd.cpp @@ -33,8 +33,8 @@ #include "core/os/os.h" #include "core/string/print_string.h" -#include "thirdparty/jpeg-compressor/jpgd.h" -#include "thirdparty/jpeg-compressor/jpge.h" +#include +#include #include Error jpeg_load_image_from_buffer(Image *p_image, const uint8_t *p_buffer, int p_buffer_len) { @@ -132,10 +132,6 @@ static Ref _jpegd_mem_loader_func(const uint8_t *p_png, int p_size) { return img; } -static Error _jpgd_save_func(const String &p_path, const Ref &p_img, float p_quality) { - return OK; -} - class ImageLoaderJPGOSFile : public jpge::output_stream { public: Ref f; @@ -157,21 +153,18 @@ public: } }; -static Vector _jpgd_buffer_save_func(const Ref &p_img, float p_quality) { - ERR_FAIL_COND_V(p_img.is_null() || p_img->is_empty(), Vector()); +static Error _jpgd_save_to_output_stream(jpge::output_stream *p_output_stream, const Ref &p_img, float p_quality) { + ERR_FAIL_COND_V(p_img.is_null() || p_img->is_empty(), ERR_INVALID_PARAMETER); Ref image = p_img; if (image->get_format() != Image::FORMAT_RGB8) { - image->convert(Image::FORMAT_ETC2_RGB8); + image->convert(Image::FORMAT_RGB8); } jpge::params p; p.m_quality = CLAMP(p_quality * 100, 1, 100); - Vector output; - ImageLoaderJPGOSBuffer ob; - ob.buffer = &output; jpge::jpeg_encoder enc; - enc.init(&ob, image->get_width(), image->get_height(), 3, p); + enc.init(p_output_stream, image->get_width(), image->get_height(), 3, p); const uint8_t *src_data = image->get_data().ptr(); for (int i = 0; i < image->get_height(); i++) { @@ -180,9 +173,28 @@ static Vector _jpgd_buffer_save_func(const Ref &p_img, float p_q enc.process_scanline(nullptr); + return OK; +} + +static Vector _jpgd_buffer_save_func(const Ref &p_img, float p_quality) { + Vector output; + ImageLoaderJPGOSBuffer ob; + ob.buffer = &output; + if (_jpgd_save_to_output_stream(&ob, p_img, p_quality) != OK) { + return Vector(); + } return output; } +static Error _jpgd_save_func(const String &p_path, const Ref &p_img, float p_quality) { + Error err; + Ref file = FileAccess::open(p_path, FileAccess::WRITE, &err); + ERR_FAIL_COND_V_MSG(err, err, vformat("Can't save JPG at path: '%s'.", p_path)); + ImageLoaderJPGOSFile ob; + ob.f = file; + return _jpgd_save_to_output_stream(&ob, p_img, p_quality); +} + ImageLoaderJPG::ImageLoaderJPG() { Image::_jpg_mem_loader_func = _jpegd_mem_loader_func; Image::save_jpg_func = _jpgd_save_func;