diff --git a/doc/changelog.dox b/doc/changelog.dox index ab5e20836..8a4aaa910 100644 --- a/doc/changelog.dox +++ b/doc/changelog.dox @@ -40,6 +40,10 @@ See also: @subsection changelog-latest-changes Changes and improvements +- The @ref PixelFormat and @ref CompressedPixelFormat enums can now be saved + and retrieved from @ref Corrade::Utility::Configuration / + @ref Corrade::Utility::Arguments + @subsubsection changelog-latest-changes-trade Trade library - For better usability, the @ref magnum-imageconverter "magnum-imageconverter" diff --git a/src/Magnum/PixelFormat.cpp b/src/Magnum/PixelFormat.cpp index ddc63cff3..e2416c1b6 100644 --- a/src/Magnum/PixelFormat.cpp +++ b/src/Magnum/PixelFormat.cpp @@ -25,6 +25,7 @@ #include "PixelFormat.h" +#include #include #include #include @@ -205,3 +206,39 @@ Debug& operator<<(Debug& debug, const CompressedPixelFormat value) { #endif } + +namespace Corrade { namespace Utility { + +std::string ConfigurationValue::toString(Magnum::PixelFormat value, ConfigurationValueFlags) { + if(Magnum::UnsignedInt(value) - 1 < Containers::arraySize(Magnum::PixelFormatNames)) + return Magnum::PixelFormatNames[Magnum::UnsignedInt(value) - 1]; + + return {}; +} + +Magnum::PixelFormat ConfigurationValue::fromString(const std::string& stringValue, ConfigurationValueFlags) { + /** @todo This is extremely slow with >100 values. Do a binary search on a + sorted index list instead (extracted into a common utility) */ + for(std::size_t i = 0; i != Containers::arraySize(Magnum::PixelFormatNames); ++i) + if(stringValue == Magnum::PixelFormatNames[i]) return Magnum::PixelFormat(i + 1); + + return {}; +} + +std::string ConfigurationValue::toString(Magnum::CompressedPixelFormat value, ConfigurationValueFlags) { + if(Magnum::UnsignedInt(value) - 1 < Containers::arraySize(Magnum::CompressedPixelFormatNames)) + return Magnum::CompressedPixelFormatNames[Magnum::UnsignedInt(value) - 1]; + + return {}; +} + +Magnum::CompressedPixelFormat ConfigurationValue::fromString(const std::string& stringValue, ConfigurationValueFlags) { + /** @todo This is extremely slow with >100 values. Do a binary search on a + sorted index list instead (extracted into a common utility) */ + for(std::size_t i = 0; i != Containers::arraySize(Magnum::CompressedPixelFormatNames); ++i) + if(stringValue == Magnum::CompressedPixelFormatNames[i]) return Magnum::CompressedPixelFormat(i + 1); + + return {}; +} + +}} diff --git a/src/Magnum/PixelFormat.h b/src/Magnum/PixelFormat.h index 3c84b5a38..f7e8cd41e 100644 --- a/src/Magnum/PixelFormat.h +++ b/src/Magnum/PixelFormat.h @@ -30,6 +30,7 @@ */ #include +#include #include "Magnum/Magnum.h" #include "Magnum/visibility.h" @@ -2197,4 +2198,46 @@ template constexpr T compressedPixelFormatUnwrap(Compress } +namespace Corrade { namespace Utility { + +/** @configurationvalue{Magnum::PixelFormat} */ +template<> struct MAGNUM_EXPORT ConfigurationValue { + ConfigurationValue() = delete; + + /** + * @brief Writes enum value as string + * + * If the value is invalid, returns empty string. + */ + static std::string toString(Magnum::PixelFormat value, ConfigurationValueFlags); + + /** + * @brief Reads enum value as string + * + * If the value is invalid, returns a zero (invalid) format. + */ + static Magnum::PixelFormat fromString(const std::string& stringValue, ConfigurationValueFlags); +}; + +/** @configurationvalue{Magnum::CompressedPixelFormat} */ +template<> struct MAGNUM_EXPORT ConfigurationValue { + ConfigurationValue() = delete; + + /** + * @brief Write enum value as string + * + * If the value is invalid, returns empty string. + */ + static std::string toString(Magnum::CompressedPixelFormat value, ConfigurationValueFlags); + + /** + * @brief Read enum value as string + * + * If the value is invalid, returns a zero (invalid) format. + */ + static Magnum::CompressedPixelFormat fromString(const std::string& stringValue, ConfigurationValueFlags); +}; + +}} + #endif diff --git a/src/Magnum/Test/PixelFormatTest.cpp b/src/Magnum/Test/PixelFormatTest.cpp index 53dc7f4c1..749d2ccf3 100644 --- a/src/Magnum/Test/PixelFormatTest.cpp +++ b/src/Magnum/Test/PixelFormatTest.cpp @@ -27,6 +27,7 @@ #include #include #include +#include #include "Magnum/PixelFormat.h" #include "Magnum/Math/Vector3.h" @@ -64,6 +65,9 @@ struct PixelFormatTest: TestSuite::Tester { void compressedDebug(); void compressedDebugImplementationSpecific(); + + void configuration(); + void compresedConfiguration(); }; PixelFormatTest::PixelFormatTest() { @@ -94,7 +98,10 @@ PixelFormatTest::PixelFormatTest() { &PixelFormatTest::debugImplementationSpecific, &PixelFormatTest::compressedDebug, - &PixelFormatTest::compressedDebugImplementationSpecific}); + &PixelFormatTest::compressedDebugImplementationSpecific, + + &PixelFormatTest::configuration, + &PixelFormatTest::compresedConfiguration}); } void PixelFormatTest::mapping() { @@ -351,6 +358,38 @@ void PixelFormatTest::compressedDebugImplementationSpecific() { CORRADE_COMPARE(out.str(), "CompressedPixelFormat::ImplementationSpecific(0xdead)\n"); } +void PixelFormatTest::configuration() { + Utility::Configuration c; + + c.setValue("format", PixelFormat::RGB8Srgb); + CORRADE_COMPARE(c.value("format"), "RGB8Srgb"); + CORRADE_COMPARE(c.value("format"), PixelFormat::RGB8Srgb); + + c.setValue("zero", PixelFormat(0)); + CORRADE_COMPARE(c.value("zero"), ""); + CORRADE_COMPARE(c.value("zero"), PixelFormat{}); + + c.setValue("invalid", PixelFormat(0xdead)); + CORRADE_COMPARE(c.value("invalid"), ""); + CORRADE_COMPARE(c.value("invalid"), PixelFormat{}); +} + +void PixelFormatTest::compresedConfiguration() { + Utility::Configuration c; + + c.setValue("format", CompressedPixelFormat::Astc3x3x3RGBASrgb); + CORRADE_COMPARE(c.value("format"), "Astc3x3x3RGBASrgb"); + CORRADE_COMPARE(c.value("format"), CompressedPixelFormat::Astc3x3x3RGBASrgb); + + c.setValue("zero", CompressedPixelFormat(0)); + CORRADE_COMPARE(c.value("zero"), ""); + CORRADE_COMPARE(c.value("zero"), CompressedPixelFormat{}); + + c.setValue("invalid", CompressedPixelFormat(0xdead)); + CORRADE_COMPARE(c.value("invalid"), ""); + CORRADE_COMPARE(c.value("invalid"), CompressedPixelFormat{}); +} + }}} CORRADE_TEST_MAIN(Magnum::Test::PixelFormatTest)