From 4fe8da4b5cd3321ac57e42380069164c2f9bbfae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jaakko=20Kera=CC=88nen?= Date: Wed, 4 Jul 2018 22:40:21 +0300 Subject: [PATCH] libgui|Image: Serializing based on a file extension format hint --- doomsday/libs/gui/include/de/graphics/image.h | 1 + doomsday/libs/gui/src/graphics/image.cpp | 30 +++++++++++++++++-- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/doomsday/libs/gui/include/de/graphics/image.h b/doomsday/libs/gui/include/de/graphics/image.h index 1ee92197d3..14307ce9b7 100644 --- a/doomsday/libs/gui/include/de/graphics/image.h +++ b/doomsday/libs/gui/include/de/graphics/image.h @@ -248,6 +248,7 @@ class LIBGUI_PUBLIC Image : public ISerializable void save(const NativePath &path) const; Block serialize(SerializationFormat format) const; + Block serialize(const char *formatHint) const; // Implements ISerializable. void operator >> (Writer &to) const; diff --git a/doomsday/libs/gui/src/graphics/image.cpp b/doomsday/libs/gui/src/graphics/image.cpp index 21c8572dc5..7320468d25 100644 --- a/doomsday/libs/gui/src/graphics/image.cpp +++ b/doomsday/libs/gui/src/graphics/image.cpp @@ -34,6 +34,8 @@ namespace de { +static constexpr int JPEG_QUALITY = 85; + #define IMAGE_ASSERT_EDITABLE(d) DE_ASSERT(d->format == RGBA_8888) namespace internal { @@ -1005,7 +1007,7 @@ void Image::save(const NativePath &path) const } else if (!ext.compareWithoutCase(".jpg")) { - stbi_write_jpg(path.c_str(), width(), height(), comp, bits(), 85); + stbi_write_jpg(path.c_str(), width(), height(), comp, bits(), JPEG_QUALITY); } else if (!ext.compareWithoutCase(".tga")) { @@ -1037,7 +1039,7 @@ Block Image::serialize(SerializationFormat format) const break; case Jpeg: - stbi_write_jpg_to_func(dataWriter, &data, width(), height(), comp, bits(), 85); + stbi_write_jpg_to_func(dataWriter, &data, width(), height(), comp, bits(), JPEG_QUALITY); break; case Targa: @@ -1051,6 +1053,30 @@ Block Image::serialize(SerializationFormat format) const return data; } +Block Image::serialize(const char *formatHint) const +{ + struct Hint { + const char *ext; + SerializationFormat sformat; + }; + static const Hint hints[] = { + { ".png", Png }, + { ".jpg", Jpeg }, + { ".jpeg", Jpeg }, + { ".bmp", Bmp }, + { ".tga", Targa }, + }; + + for (const auto &hint : hints) + { + if (!iCmpStrCase(formatHint, hint.ext)) + { + return serialize(hint.sformat); + } + } + return serialize(Png); +} + void Image::operator>>(Writer &to) const { to << duint8(d->format);