Utility/STBSaver: Replace static map by constexpr unordered_map
This commit is contained in:
parent
ced5083aef
commit
b5206ebdb7
|
|
@ -6,7 +6,8 @@
|
||||||
#include <Nazara/Utility/Image.hpp>
|
#include <Nazara/Utility/Image.hpp>
|
||||||
#include <Nazara/Utility/PixelFormat.hpp>
|
#include <Nazara/Utility/PixelFormat.hpp>
|
||||||
#include <Nazara/Utility/Formats/STBLoader.hpp>
|
#include <Nazara/Utility/Formats/STBLoader.hpp>
|
||||||
#include <map>
|
#include <frozen/string.h>
|
||||||
|
#include <frozen/unordered_map.h>
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
#define STB_IMAGE_WRITE_IMPLEMENTATION
|
#define STB_IMAGE_WRITE_IMPLEMENTATION
|
||||||
#include <stb_image_write.h>
|
#include <stb_image_write.h>
|
||||||
|
|
@ -14,12 +15,10 @@
|
||||||
|
|
||||||
namespace Nz
|
namespace Nz
|
||||||
{
|
{
|
||||||
namespace
|
namespace NAZARA_ANONYMOUS_NAMESPACE
|
||||||
{
|
{
|
||||||
using FormatHandler = bool(*)(const Image& image, const ImageParams& parameters, Stream& stream);
|
using FormatHandler = bool(*)(const Image& image, const ImageParams& parameters, Stream& stream);
|
||||||
|
|
||||||
std::map<std::string_view, FormatHandler> s_formatHandlers;
|
|
||||||
|
|
||||||
int ConvertToFloatFormat(Image& image)
|
int ConvertToFloatFormat(Image& image)
|
||||||
{
|
{
|
||||||
switch (image.GetFormat())
|
switch (image.GetFormat())
|
||||||
|
|
@ -105,43 +104,6 @@ namespace Nz
|
||||||
throw std::runtime_error("Failed to write to stream");
|
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)
|
bool SaveBMP(const Image& image, const ImageParams& parameters, Stream& stream)
|
||||||
{
|
{
|
||||||
NazaraUnused(parameters);
|
NazaraUnused(parameters);
|
||||||
|
|
@ -256,18 +218,61 @@ namespace Nz
|
||||||
|
|
||||||
return true;
|
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
|
namespace Loaders
|
||||||
{
|
{
|
||||||
ImageSaver::Entry GetImageSaver_STB()
|
ImageSaver::Entry GetImageSaver_STB()
|
||||||
{
|
{
|
||||||
s_formatHandlers[".bmp"] = &SaveBMP;
|
NAZARA_USE_ANONYMOUS_NAMESPACE
|
||||||
s_formatHandlers[".hdr"] = &SaveHDR;
|
|
||||||
s_formatHandlers[".jpg"] = &SaveJPEG;
|
|
||||||
s_formatHandlers[".jpeg"] = &SaveJPEG;
|
|
||||||
s_formatHandlers[".png"] = &SavePNG;
|
|
||||||
s_formatHandlers[".tga"] = &SaveTGA;
|
|
||||||
|
|
||||||
ImageSaver::Entry entry;
|
ImageSaver::Entry entry;
|
||||||
entry.formatSupport = FormatQuerier;
|
entry.formatSupport = FormatQuerier;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue