diff --git a/ChangeLog.md b/ChangeLog.md index ac21b3223..8c53715d6 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -49,6 +49,7 @@ Nazara Engine: - It is now possible to initialize a StackArray with a size of zero on every platforms (this was not possible on non-Windows platforms before) - Calling PlacementDestroy on a null pointer is now a no-op (was triggering an undefined behavior) - Fix OBJParser relative offsets handling +- Add JPEG image saver Nazara Development Kit: - Added ImageWidget (#139) diff --git a/src/Nazara/Utility/Formats/STBSaver.cpp b/src/Nazara/Utility/Formats/STBSaver.cpp index 4ec466c23..bc8d7d7ac 100644 --- a/src/Nazara/Utility/Formats/STBSaver.cpp +++ b/src/Nazara/Utility/Formats/STBSaver.cpp @@ -161,6 +161,38 @@ namespace Nz return true; } + bool SaveJPEG(const Image& image, const ImageParams& parameters, Stream& stream) + { + Image tempImage(image); //< We're using COW here to prevent Image copy unless required + + int componentCount = ConvertToIntegerFormat(tempImage); + if (componentCount == 0) + { + NazaraError("Failed to convert image to suitable format"); + return false; + } + + long long imageQuality; + if (parameters.custom.GetIntegerParameter("NativeJPEGSaver_Quality", &imageQuality)) + { + if (imageQuality <= 0 || imageQuality > 100) + { + NazaraError("NativeJPEGSaver_Quality value (" + Nz::String::Number(imageQuality) + ") does not fit in bounds ]0, 100], clamping..."); + imageQuality = Nz::Clamp(imageQuality, 1LL, 100LL); + } + } + else + imageQuality = 100; + + if (!stbi_write_jpg_to_func(&WriteToStream, &stream, tempImage.GetWidth(), tempImage.GetHeight(), componentCount, tempImage.GetConstPixels(), int(imageQuality))) + { + NazaraError("Failed to write JPEG to stream"); + return false; + } + + return true; + } + bool SaveHDR(const Image& image, const ImageParams& parameters, Stream& stream) { NazaraUnused(parameters); @@ -232,10 +264,12 @@ namespace Nz { void RegisterSTBSaver() { - s_formatHandlers["bmp"] = &SaveBMP; - s_formatHandlers["hdr"] = &SaveHDR; - s_formatHandlers["png"] = &SavePNG; - s_formatHandlers["tga"] = &SaveTGA; + s_formatHandlers["bmp"] = &SaveBMP; + s_formatHandlers["hdr"] = &SaveHDR; + s_formatHandlers["jpg"] = &SaveJPEG; + s_formatHandlers["jpeg"] = &SaveJPEG; + s_formatHandlers["png"] = &SavePNG; + s_formatHandlers["tga"] = &SaveTGA; ImageSaver::RegisterSaver(FormatQuerier, SaveToStream); }