Utility/STBSaver: Replace static map by constexpr unordered_map

This commit is contained in:
SirLynix 2023-06-13 19:39:28 +02:00
parent ced5083aef
commit b5206ebdb7
1 changed files with 52 additions and 47 deletions

View File

@ -6,7 +6,8 @@
#include <Nazara/Utility/Image.hpp>
#include <Nazara/Utility/PixelFormat.hpp>
#include <Nazara/Utility/Formats/STBLoader.hpp>
#include <map>
#include <frozen/string.h>
#include <frozen/unordered_map.h>
#include <stdexcept>
#define STB_IMAGE_WRITE_IMPLEMENTATION
#include <stb_image_write.h>
@ -14,12 +15,10 @@
namespace Nz
{
namespace
namespace NAZARA_ANONYMOUS_NAMESPACE
{
using FormatHandler = bool(*)(const Image& image, const ImageParams& parameters, Stream& stream);
std::map<std::string_view, FormatHandler> s_formatHandlers;
int ConvertToFloatFormat(Image& image)
{
switch (image.GetFormat())
@ -105,43 +104,6 @@ namespace Nz
throw std::runtime_error("Failed to write to stream");
}
bool FormatQuerier(const std::string_view& extension)
{
return s_formatHandlers.find(extension) != s_formatHandlers.end();
}
bool SaveToStream(const Image& image, const std::string& format, Stream& stream, const ImageParams& parameters)
{
NazaraUnused(parameters);
if (!image.IsValid())
{
NazaraError("Invalid image");
return false;
}
ImageType type = image.GetType();
if (type != ImageType::E1D && type != ImageType::E2D)
{
NazaraError("Image type 0x" + NumberToString(UnderlyingCast(type), 16) + " is not in a supported format");
return false;
}
auto it = s_formatHandlers.find(format);
NazaraAssert(it != s_formatHandlers.end(), "Invalid handler");
const FormatHandler& handler = it->second;
try
{
return handler(image, parameters, stream);
}
catch (const std::exception& e)
{
NazaraError(e.what());
return false;
}
}
bool SaveBMP(const Image& image, const ImageParams& parameters, Stream& stream)
{
NazaraUnused(parameters);
@ -256,18 +218,61 @@ namespace Nz
return true;
}
constexpr FormatHandler test = &SaveBMP;
constexpr frozen::unordered_map s_formatHandlers = frozen::make_unordered_map<frozen::string, FormatHandler>({
{ ".bmp", &SaveBMP },
{ ".hdr", &SaveHDR },
{ ".jpg", &SaveJPEG },
{ ".jpeg", &SaveJPEG },
{ ".png", &SavePNG },
{ ".tga", &SaveTGA }
});
bool FormatQuerier(const std::string_view& extension)
{
return s_formatHandlers.find(extension) != s_formatHandlers.end();
}
bool SaveToStream(const Image& image, const std::string& format, Stream& stream, const ImageParams& parameters)
{
NazaraUnused(parameters);
if (!image.IsValid())
{
NazaraError("Invalid image");
return false;
}
ImageType type = image.GetType();
if (type != ImageType::E1D && type != ImageType::E2D)
{
NazaraError("Image type 0x" + NumberToString(UnderlyingCast(type), 16) + " is not in a supported format");
return false;
}
auto it = s_formatHandlers.find(std::string_view(format));
NazaraAssert(it != s_formatHandlers.end(), "Invalid handler");
const FormatHandler& handler = it->second;
try
{
return handler(image, parameters, stream);
}
catch (const std::exception& e)
{
NazaraError(e.what());
return false;
}
}
}
namespace Loaders
{
ImageSaver::Entry GetImageSaver_STB()
{
s_formatHandlers[".bmp"] = &SaveBMP;
s_formatHandlers[".hdr"] = &SaveHDR;
s_formatHandlers[".jpg"] = &SaveJPEG;
s_formatHandlers[".jpeg"] = &SaveJPEG;
s_formatHandlers[".png"] = &SavePNG;
s_formatHandlers[".tga"] = &SaveTGA;
NAZARA_USE_ANONYMOUS_NAMESPACE
ImageSaver::Entry entry;
entry.formatSupport = FormatQuerier;