Browse Source

ShaderTools,Trade: return Optional<Array<char>> from converter plugins.

Consistently with changes done to Utility::Path, this enforces proper
error handling on user side. Originally I didn't want to do this and
instead wanted to have a special Array instance devoted for an error
state, but that still would allow the error state be errorneously
treated as a successful but empty array.
pull/557/head
Vladimír Vondruš 4 years ago
parent
commit
51f7862e00
  1. 124
      src/Magnum/ShaderTools/AbstractConverter.cpp
  2. 80
      src/Magnum/ShaderTools/AbstractConverter.h
  3. 147
      src/Magnum/ShaderTools/Test/AbstractConverterTest.cpp
  4. 389
      src/Magnum/Trade/AbstractImageConverter.cpp
  5. 217
      src/Magnum/Trade/AbstractImageConverter.h
  6. 25
      src/Magnum/Trade/AbstractSceneConverter.cpp
  7. 31
      src/Magnum/Trade/AbstractSceneConverter.h
  8. 204
      src/Magnum/Trade/Test/AbstractImageConverterTest.cpp
  9. 10
      src/Magnum/Trade/Test/AbstractSceneConverterTest.cpp
  10. 2
      src/MagnumPlugins/AnyImageConverter/AnyImageConverter.cpp
  11. 2
      src/MagnumPlugins/AnySceneConverter/AnySceneConverter.cpp
  12. 7
      src/MagnumPlugins/AnyShaderConverter/AnyConverter.cpp
  13. 4
      src/MagnumPlugins/AnyShaderConverter/AnyConverter.h
  14. 1
      src/MagnumPlugins/MagnumFontConverter/MagnumFontConverter.cpp
  15. 10
      src/MagnumPlugins/TgaImageConverter/TgaImageConverter.cpp
  16. 2
      src/MagnumPlugins/TgaImageConverter/TgaImageConverter.h

124
src/Magnum/ShaderTools/AbstractConverter.cpp

@ -61,7 +61,7 @@ using namespace Containers::Literals;
Containers::StringView AbstractConverter::pluginInterface() { Containers::StringView AbstractConverter::pluginInterface() {
return return
/* [interface] */ /* [interface] */
"cz.mosra.magnum.ShaderTools.AbstractConverter/0.1"_s "cz.mosra.magnum.ShaderTools.AbstractConverter/0.1.1"_s
/* [interface] */ /* [interface] */
; ;
} }
@ -272,18 +272,29 @@ std::pair<bool, Containers::String> AbstractConverter::doValidateFile(const Stag
} }
} }
Containers::Array<char> AbstractConverter::convertDataToData(const Stage stage, const Containers::ArrayView<const void> data) { #ifndef MAGNUM_BUILD_DEPRECATED
Containers::Optional<Containers::Array<char>>
#else
Implementation::OptionalButAlsoArray<char>
#endif
AbstractConverter::convertDataToData(const Stage stage, const Containers::ArrayView<const void> data) {
CORRADE_ASSERT(features() >= ConverterFeature::ConvertData, CORRADE_ASSERT(features() >= ConverterFeature::ConvertData,
"ShaderTools::AbstractConverter::convertDataToData(): feature not supported", {}); "ShaderTools::AbstractConverter::convertDataToData(): feature not supported", {});
/* Cast to a non-void type for more convenience */ /* Cast to a non-void type for more convenience */
Containers::Array<char> out = doConvertDataToData(stage, Containers::arrayCast<const char>(data)); Containers::Optional<Containers::Array<char>> out = doConvertDataToData(stage, Containers::arrayCast<const char>(data));
CORRADE_ASSERT(!out.deleter(), CORRADE_ASSERT(!out || !out->deleter(),
"ShaderTools::AbstractConverter::convertDataToData(): implementation is not allowed to use a custom Array deleter", {}); "ShaderTools::AbstractConverter::convertDataToData(): implementation is not allowed to use a custom Array deleter", {});
/* GCC 4.8 and Clang 3.8 need an explicit conversion here */
#ifdef MAGNUM_BUILD_DEPRECATED
return Implementation::OptionalButAlsoArray<char>{std::move(out)};
#else
return out; return out;
#endif
} }
Containers::Array<char> AbstractConverter::doConvertDataToData(Stage, Containers::ArrayView<const char>) { Containers::Optional<Containers::Array<char>> AbstractConverter::doConvertDataToData(Stage, Containers::ArrayView<const char>) {
CORRADE_ASSERT_UNREACHABLE("ShaderTools::AbstractConverter::convertDataToData(): feature advertised but not implemented", {}); CORRADE_ASSERT_UNREACHABLE("ShaderTools::AbstractConverter::convertDataToData(): feature advertised but not implemented", {});
} }
@ -294,10 +305,10 @@ bool AbstractConverter::convertDataToFile(const Stage stage, const Containers::A
/** @todo this needs expansion once output callbacks are supported as well */ /** @todo this needs expansion once output callbacks are supported as well */
/* Cast to a non-void type for more convenience */ /* Cast to a non-void type for more convenience */
const Containers::Array<char> out = doConvertDataToData(stage, Containers::arrayCast<const char>(data)); const Containers::Optional<Containers::Array<char>> out = doConvertDataToData(stage, Containers::arrayCast<const char>(data));
if(!out) return false; if(!out) return false;
if(!Utility::Path::write(filename, out)) { if(!Utility::Path::write(filename, *out)) {
Error{} << "ShaderTools::AbstractConverter::convertDataToFile(): cannot write to file" << filename; Error{} << "ShaderTools::AbstractConverter::convertDataToFile(): cannot write to file" << filename;
return false; return false;
} }
@ -305,13 +316,13 @@ bool AbstractConverter::convertDataToFile(const Stage stage, const Containers::A
return true; return true;
} }
Containers::Array<char> AbstractConverter::convertDataToDataUsingInputFileCallbacks(const char* const prefix, const Stage stage, const Containers::StringView filename) { Containers::Optional<Containers::Array<char>> AbstractConverter::convertDataToDataUsingInputFileCallbacks(const char* const prefix, const Stage stage, const Containers::StringView filename) {
const Containers::Optional<Containers::ArrayView<const char>> data = _inputFileCallback(filename, InputFileCallbackPolicy::LoadTemporary, _inputFileCallbackUserData); const Containers::Optional<Containers::ArrayView<const char>> data = _inputFileCallback(filename, InputFileCallbackPolicy::LoadTemporary, _inputFileCallbackUserData);
if(!data) { if(!data) {
Error{} << prefix << "cannot open file" << filename; Error{} << prefix << "cannot open file" << filename;
return {}; return {};
} }
Containers::Array<char> out = doConvertDataToData(stage, *data); Containers::Optional<Containers::Array<char>> out = doConvertDataToData(stage, *data);
_inputFileCallback(filename, InputFileCallbackPolicy::Close, _inputFileCallbackUserData); _inputFileCallback(filename, InputFileCallbackPolicy::Close, _inputFileCallbackUserData);
return out; return out;
} }
@ -341,10 +352,10 @@ bool AbstractConverter::convertFileToFile(const Stage stage, const Containers::S
actual file loading to the default implementation (callback used actual file loading to the default implementation (callback used
in the base doConvertFileToFile() implementation, because this in the base doConvertFileToFile() implementation, because this
branch is never taken in that case) */ branch is never taken in that case) */
const Containers::Array<char> out = convertDataToDataUsingInputFileCallbacks("ShaderTools::AbstractConverter::convertFileToFile():", stage, from); const Containers::Optional<Containers::Array<char>> out = convertDataToDataUsingInputFileCallbacks("ShaderTools::AbstractConverter::convertFileToFile():", stage, from);
if(!out) return false; if(!out) return false;
if(!Utility::Path::write(to, out)) { if(!Utility::Path::write(to, *out)) {
Error{} << "ShaderTools::AbstractConverter::convertFileToFile(): cannot write to file" << to; Error{} << "ShaderTools::AbstractConverter::convertFileToFile(): cannot write to file" << to;
return false; return false;
} }
@ -359,7 +370,7 @@ bool AbstractConverter::doConvertFileToFile(const Stage stage, const Containers:
CORRADE_ASSERT(features() >= ConverterFeature::ConvertData, "ShaderTools::AbstractConverter::convertFileToFile(): feature advertised but not implemented", {}); CORRADE_ASSERT(features() >= ConverterFeature::ConvertData, "ShaderTools::AbstractConverter::convertFileToFile(): feature advertised but not implemented", {});
/** @todo this needs expansion once output callbacks are supported as well */ /** @todo this needs expansion once output callbacks are supported as well */
Containers::Array<char> out; Containers::Optional<Containers::Array<char>> out;
/* If callbacks are set, use them. This is the same implementation as in /* If callbacks are set, use them. This is the same implementation as in
convertFileToFile(), see the comment there for details. */ convertFileToFile(), see the comment there for details. */
@ -379,7 +390,7 @@ bool AbstractConverter::doConvertFileToFile(const Stage stage, const Containers:
if(!out) return false; if(!out) return false;
if(!Utility::Path::write(to, out)) { if(!Utility::Path::write(to, *out)) {
Error{} << "ShaderTools::AbstractConverter::convertFileToFile(): cannot write to file" << to; Error{} << "ShaderTools::AbstractConverter::convertFileToFile(): cannot write to file" << to;
return false; return false;
} }
@ -387,11 +398,16 @@ bool AbstractConverter::doConvertFileToFile(const Stage stage, const Containers:
return true; return true;
} }
Containers::Array<char> AbstractConverter::convertFileToData(const Stage stage, const Containers::StringView filename) { #ifndef MAGNUM_BUILD_DEPRECATED
Containers::Optional<Containers::Array<char>>
#else
Implementation::OptionalButAlsoArray<char>
#endif
AbstractConverter::convertFileToData(const Stage stage, const Containers::StringView filename) {
CORRADE_ASSERT(features() >= ConverterFeature::ConvertData, CORRADE_ASSERT(features() >= ConverterFeature::ConvertData,
"ShaderTools::AbstractConverter::convertFileToData(): feature not supported", {}); "ShaderTools::AbstractConverter::convertFileToData(): feature not supported", {});
Containers::Array<char> out; Containers::Optional<Containers::Array<char>> out;
/* If input file callbacks are not set or the converter supports handling /* If input file callbacks are not set or the converter supports handling
them directly, call into the implementation */ them directly, call into the implementation */
@ -415,12 +431,18 @@ Containers::Array<char> AbstractConverter::convertFileToData(const Stage stage,
out = convertDataToDataUsingInputFileCallbacks("ShaderTools::AbstractConverter::convertFileToData():", stage, filename); out = convertDataToDataUsingInputFileCallbacks("ShaderTools::AbstractConverter::convertFileToData():", stage, filename);
} }
CORRADE_ASSERT(!out.deleter(), CORRADE_ASSERT(!out || !out->deleter(),
"ShaderTools::AbstractConverter::convertFileToData(): implementation is not allowed to use a custom Array deleter", {}); "ShaderTools::AbstractConverter::convertFileToData(): implementation is not allowed to use a custom Array deleter", {});
/* GCC 4.8 and Clang 3.8 need an explicit conversion here */
#ifdef MAGNUM_BUILD_DEPRECATED
return Implementation::OptionalButAlsoArray<char>{std::move(out)};
#else
return out; return out;
#endif
} }
Containers::Array<char> AbstractConverter::doConvertFileToData(const Stage stage, const Containers::StringView filename) { Containers::Optional<Containers::Array<char>> AbstractConverter::doConvertFileToData(const Stage stage, const Containers::StringView filename) {
/* If callbacks are set, use them. This is the same implementation as in /* If callbacks are set, use them. This is the same implementation as in
convertFileToFile(), see the comment there for details. */ convertFileToFile(), see the comment there for details. */
if(_inputFileCallback) { if(_inputFileCallback) {
@ -438,7 +460,12 @@ Containers::Array<char> AbstractConverter::doConvertFileToData(const Stage stage
} }
} }
Containers::Array<char> AbstractConverter::linkDataToData(const Containers::ArrayView<const std::pair<Stage, Containers::ArrayView<const void>>> data) { #ifndef MAGNUM_BUILD_DEPRECATED
Containers::Optional<Containers::Array<char>>
#else
Implementation::OptionalButAlsoArray<char>
#endif
AbstractConverter::linkDataToData(const Containers::ArrayView<const std::pair<Stage, Containers::ArrayView<const void>>> data) {
CORRADE_ASSERT(features() >= ConverterFeature::LinkData, CORRADE_ASSERT(features() >= ConverterFeature::LinkData,
"ShaderTools::AbstractConverter::linkDataToData(): feature not supported", {}); "ShaderTools::AbstractConverter::linkDataToData(): feature not supported", {});
CORRADE_ASSERT(!(_flags & ConverterFlag::PreprocessOnly), CORRADE_ASSERT(!(_flags & ConverterFlag::PreprocessOnly),
@ -447,17 +474,28 @@ Containers::Array<char> AbstractConverter::linkDataToData(const Containers::Arra
"ShaderTools::AbstractConverter::linkDataToData(): no data passed", {}); "ShaderTools::AbstractConverter::linkDataToData(): no data passed", {});
/* Cast to a non-void type for more convenience */ /* Cast to a non-void type for more convenience */
Containers::Array<char> out = doLinkDataToData(Containers::arrayCast<const std::pair<Stage, Containers::ArrayView<const char>>>(data)); Containers::Optional<Containers::Array<char>> out = doLinkDataToData(Containers::arrayCast<const std::pair<Stage, Containers::ArrayView<const char>>>(data));
CORRADE_ASSERT(!out.deleter(), CORRADE_ASSERT(!out || !out->deleter(),
"ShaderTools::AbstractConverter::linkDataToData(): implementation is not allowed to use a custom Array deleter", {}); "ShaderTools::AbstractConverter::linkDataToData(): implementation is not allowed to use a custom Array deleter", {});
/* GCC 4.8 and Clang 3.8 need an explicit conversion here */
#ifdef MAGNUM_BUILD_DEPRECATED
return Implementation::OptionalButAlsoArray<char>{std::move(out)};
#else
return out; return out;
#endif
} }
Containers::Array<char> AbstractConverter::linkDataToData(const std::initializer_list<std::pair<Stage, Containers::ArrayView<const void>>> data) { #ifndef MAGNUM_BUILD_DEPRECATED
Containers::Optional<Containers::Array<char>>
#else
Implementation::OptionalButAlsoArray<char>
#endif
AbstractConverter::linkDataToData(const std::initializer_list<std::pair<Stage, Containers::ArrayView<const void>>> data) {
return linkDataToData(Containers::arrayView(data)); return linkDataToData(Containers::arrayView(data));
} }
Containers::Array<char> AbstractConverter::doLinkDataToData(Containers::ArrayView<const std::pair<Stage, Containers::ArrayView<const char>>>) { Containers::Optional<Containers::Array<char>> AbstractConverter::doLinkDataToData(Containers::ArrayView<const std::pair<Stage, Containers::ArrayView<const char>>>) {
CORRADE_ASSERT_UNREACHABLE("ShaderTools::AbstractConverter::linkDataToData(): feature advertised but not implemented", {}); CORRADE_ASSERT_UNREACHABLE("ShaderTools::AbstractConverter::linkDataToData(): feature advertised but not implemented", {});
} }
@ -472,10 +510,10 @@ bool AbstractConverter::linkDataToFile(const Containers::ArrayView<const std::pa
/** @todo this needs expansion once output callbacks are supported as well */ /** @todo this needs expansion once output callbacks are supported as well */
/* Cast to a non-void type for more convenience */ /* Cast to a non-void type for more convenience */
const Containers::Array<char> out = doLinkDataToData(Containers::arrayCast<const std::pair<Stage, Containers::ArrayView<const char>>>(data)); const Containers::Optional<Containers::Array<char>> out = doLinkDataToData(Containers::arrayCast<const std::pair<Stage, Containers::ArrayView<const char>>>(data));
if(!out) return false; if(!out) return false;
if(!Utility::Path::write(filename, out)) { if(!Utility::Path::write(filename, *out)) {
Error{} << "ShaderTools::AbstractConverter::linkDataToFile(): cannot write to file" << filename; Error{} << "ShaderTools::AbstractConverter::linkDataToFile(): cannot write to file" << filename;
return false; return false;
} }
@ -487,7 +525,7 @@ bool AbstractConverter::linkDataToFile(const std::initializer_list<std::pair<Sta
return linkDataToFile(Containers::arrayView(data), filename); return linkDataToFile(Containers::arrayView(data), filename);
} }
Containers::Array<char> AbstractConverter::linkDataToDataUsingInputFileCallbacks(const char* const prefix, const Containers::ArrayView<const std::pair<Stage, Containers::StringView>> filenames) { Containers::Optional<Containers::Array<char>> AbstractConverter::linkDataToDataUsingInputFileCallbacks(const char* const prefix, const Containers::ArrayView<const std::pair<Stage, Containers::StringView>> filenames) {
Containers::Array<std::pair<Stage, Containers::ArrayView<const char>>> data{NoInit, filenames.size()}; Containers::Array<std::pair<Stage, Containers::ArrayView<const char>>> data{NoInit, filenames.size()};
/* First load all files. Remember how many of these succeeded so we can /* First load all files. Remember how many of these succeeded so we can
@ -502,7 +540,7 @@ Containers::Array<char> AbstractConverter::linkDataToDataUsingInputFileCallbacks
} }
/* If all input files loaded successfully, process */ /* If all input files loaded successfully, process */
Containers::Array<char> out; Containers::Optional<Containers::Array<char>> out;
if(i == filenames.size()) out = doLinkDataToData(data); if(i == filenames.size()) out = doLinkDataToData(data);
/* Close again all input files that loaded successfully */ /* Close again all input files that loaded successfully */
@ -551,10 +589,10 @@ bool AbstractConverter::linkFilesToFile(const Containers::ArrayView<const std::p
actual file loading to the default implementation (callback used actual file loading to the default implementation (callback used
in the base doLinkFilesToFile() implementation, because this in the base doLinkFilesToFile() implementation, because this
branch is never taken in that case) */ branch is never taken in that case) */
const Containers::Array<char> out = linkDataToDataUsingInputFileCallbacks("ShaderTools::AbstractConverter::linkFilesToFile():", from); const Containers::Optional<Containers::Array<char>> out = linkDataToDataUsingInputFileCallbacks("ShaderTools::AbstractConverter::linkFilesToFile():", from);
if(!out) return false; if(!out) return false;
if(!Utility::Path::write(to, out)) { if(!Utility::Path::write(to, *out)) {
Error{} << "ShaderTools::AbstractConverter::linkFilesToFile(): cannot write to file" << to; Error{} << "ShaderTools::AbstractConverter::linkFilesToFile(): cannot write to file" << to;
return false; return false;
} }
@ -573,7 +611,7 @@ bool AbstractConverter::doLinkFilesToFile(const Containers::ArrayView<const std:
CORRADE_ASSERT(features() >= ConverterFeature::LinkData, "ShaderTools::AbstractConverter::linkFilesToFile(): feature advertised but not implemented", {}); CORRADE_ASSERT(features() >= ConverterFeature::LinkData, "ShaderTools::AbstractConverter::linkFilesToFile(): feature advertised but not implemented", {});
/** @todo this needs expansion once output callbacks are supported as well */ /** @todo this needs expansion once output callbacks are supported as well */
Containers::Array<char> out; Containers::Optional<Containers::Array<char>> out;
/* If callbacks are set, use them. This is the same implementation as in /* If callbacks are set, use them. This is the same implementation as in
convertFileToFile(), see the comment there for details. */ convertFileToFile(), see the comment there for details. */
@ -606,7 +644,7 @@ bool AbstractConverter::doLinkFilesToFile(const Containers::ArrayView<const std:
if(!out) return false; if(!out) return false;
if(!Utility::Path::write(to, out)) { if(!Utility::Path::write(to, *out)) {
Error{} << "ShaderTools::AbstractConverter::linkFilesToFile(): cannot write to file" << to; Error{} << "ShaderTools::AbstractConverter::linkFilesToFile(): cannot write to file" << to;
return false; return false;
} }
@ -614,7 +652,12 @@ bool AbstractConverter::doLinkFilesToFile(const Containers::ArrayView<const std:
return true; return true;
} }
Containers::Array<char> AbstractConverter::linkFilesToData(const Containers::ArrayView<const std::pair<Stage, Containers::StringView>> filenames) { #ifndef MAGNUM_BUILD_DEPRECATED
Containers::Optional<Containers::Array<char>>
#else
Implementation::OptionalButAlsoArray<char>
#endif
AbstractConverter::linkFilesToData(const Containers::ArrayView<const std::pair<Stage, Containers::StringView>> filenames) {
CORRADE_ASSERT(features() >= ConverterFeature::LinkData, CORRADE_ASSERT(features() >= ConverterFeature::LinkData,
"ShaderTools::AbstractConverter::linkFilesToData(): feature not supported", {}); "ShaderTools::AbstractConverter::linkFilesToData(): feature not supported", {});
CORRADE_ASSERT(!(_flags & ConverterFlag::PreprocessOnly), CORRADE_ASSERT(!(_flags & ConverterFlag::PreprocessOnly),
@ -622,7 +665,7 @@ Containers::Array<char> AbstractConverter::linkFilesToData(const Containers::Arr
CORRADE_ASSERT(!filenames.isEmpty(), CORRADE_ASSERT(!filenames.isEmpty(),
"ShaderTools::AbstractConverter::linkFilesToData(): no files passed", {}); "ShaderTools::AbstractConverter::linkFilesToData(): no files passed", {});
Containers::Array<char> out; Containers::Optional<Containers::Array<char>> out;
/* If input file callbacks are not set or the converter supports handling /* If input file callbacks are not set or the converter supports handling
them directly, call into the implementation */ them directly, call into the implementation */
@ -646,16 +689,27 @@ Containers::Array<char> AbstractConverter::linkFilesToData(const Containers::Arr
out = linkDataToDataUsingInputFileCallbacks("ShaderTools::AbstractConverter::linkFilesToData():", filenames); out = linkDataToDataUsingInputFileCallbacks("ShaderTools::AbstractConverter::linkFilesToData():", filenames);
} }
CORRADE_ASSERT(!out.deleter(), CORRADE_ASSERT(!out || !out->deleter(),
"ShaderTools::AbstractConverter::linkFilesToData(): implementation is not allowed to use a custom Array deleter", {}); "ShaderTools::AbstractConverter::linkFilesToData(): implementation is not allowed to use a custom Array deleter", {});
/* GCC 4.8 and Clang 3.8 need an explicit conversion here */
#ifdef MAGNUM_BUILD_DEPRECATED
return Implementation::OptionalButAlsoArray<char>{std::move(out)};
#else
return out; return out;
#endif
} }
Containers::Array<char> AbstractConverter::linkFilesToData(const std::initializer_list<std::pair<Stage, Containers::StringView>> filenames) { #ifndef MAGNUM_BUILD_DEPRECATED
Containers::Optional<Containers::Array<char>>
#else
Implementation::OptionalButAlsoArray<char>
#endif
AbstractConverter::linkFilesToData(const std::initializer_list<std::pair<Stage, Containers::StringView>> filenames) {
return linkFilesToData(Containers::arrayView(filenames)); return linkFilesToData(Containers::arrayView(filenames));
} }
Containers::Array<char> AbstractConverter::doLinkFilesToData(const Containers::ArrayView<const std::pair<Stage, Containers::StringView>> filenames) { Containers::Optional<Containers::Array<char>> AbstractConverter::doLinkFilesToData(const Containers::ArrayView<const std::pair<Stage, Containers::StringView>> filenames) {
/* If callbacks are set, use them. This is the same implementation as in /* If callbacks are set, use them. This is the same implementation as in
linkFilesToFile(), see the comment there for details. */ linkFilesToFile(), see the comment there for details. */
if(_inputFileCallback) { if(_inputFileCallback) {

80
src/Magnum/ShaderTools/AbstractConverter.h

@ -38,6 +38,9 @@
#include "Magnum/ShaderTools/visibility.h" #include "Magnum/ShaderTools/visibility.h"
#ifdef MAGNUM_BUILD_DEPRECATED #ifdef MAGNUM_BUILD_DEPRECATED
/* For *ToData() APIs that used to return just an Array before */
#include <Corrade/Containers/Optional.h>
#include "Magnum/ShaderTools/Stage.h" #include "Magnum/ShaderTools/Stage.h"
#endif #endif
@ -269,6 +272,23 @@ enum class Format: UnsignedInt {
*/ */
MAGNUM_SHADERTOOLS_EXPORT Debug& operator<<(Debug& debug, Format value); MAGNUM_SHADERTOOLS_EXPORT Debug& operator<<(Debug& debug, Format value);
#ifdef MAGNUM_BUILD_DEPRECATED
namespace Implementation {
/* Could be a concrete type as it's always only char, but that would mean
I'd need to include Optional and Array here. There's a copy of this
class for Trade::AbstractSceneConverter and AbstractImageConverter as
introducing a common header containing just deprecated functionality
seems silly. */
template<class T> struct OptionalButAlsoArray: Containers::Optional<Containers::Array<T>> {
/*implicit*/ OptionalButAlsoArray() = default;
/*implicit*/ OptionalButAlsoArray(Containers::Optional<Containers::Array<T>>&& optional): Containers::Optional<Containers::Array<T>>{std::move(optional)} {}
CORRADE_DEPRECATED("use Containers::Optional<Containers::Array<T>> instead") /*implicit*/ operator Containers::Array<T>() && {
return *this ? Containers::Array<T>{std::move(**this)} : nullptr;
}
};
}
#endif
/** /**
@brief Base for shader converter plugins @brief Base for shader converter plugins
@m_since_latest @m_since_latest
@ -790,7 +810,12 @@ class MAGNUM_SHADERTOOLS_EXPORT AbstractConverter: public PluginManager::Abstrac
* @see @ref features(), @ref convertDataToFile(), * @see @ref features(), @ref convertDataToFile(),
* @ref convertFileToData(), @ref convertFileToFile() * @ref convertFileToData(), @ref convertFileToFile()
*/ */
Containers::Array<char> convertDataToData(Stage stage, Containers::ArrayView<const void> data); #if !defined(MAGNUM_BUILD_DEPRECATED) || defined(DOXYGEN_GENERATING_OUTPUT)
Containers::Optional<Containers::Array<char>>
#else
Implementation::OptionalButAlsoArray<char>
#endif
convertDataToData(Stage stage, Containers::ArrayView<const void> data);
/** /**
* @brief Convert shader data to a file * @brief Convert shader data to a file
@ -823,26 +848,41 @@ class MAGNUM_SHADERTOOLS_EXPORT AbstractConverter: public PluginManager::Abstrac
* *
* Available only if @ref ConverterFeature::ConvertData is supported. * Available only if @ref ConverterFeature::ConvertData is supported.
* On failure prints a message to @relativeref{Magnum,Error} and * On failure prints a message to @relativeref{Magnum,Error} and
* returns @cpp nullptr @ce. * returns @ref Containers::NullOpt.
* @see @ref features(), @ref convertFileToFile(), * @see @ref features(), @ref convertFileToFile(),
* @ref convertDataToFile(), @ref convertDataToData() * @ref convertDataToFile(), @ref convertDataToData()
*/ */
Containers::Array<char> convertFileToData(Stage stage, Containers::StringView filename); #if !defined(MAGNUM_BUILD_DEPRECATED) || defined(DOXYGEN_GENERATING_OUTPUT)
Containers::Optional<Containers::Array<char>>
#else
Implementation::OptionalButAlsoArray<char>
#endif
convertFileToData(Stage stage, Containers::StringView filename);
/** /**
* @brief Link shader data together to a data * @brief Link shader data together to a data
* *
* Available only if @ref ConverterFeature::LinkData is supported. On * Available only if @ref ConverterFeature::LinkData is supported. On
* failure prints a message to @relativeref{Magnum,Error} and returns * failure prints a message to @relativeref{Magnum,Error} and returns
* @cpp nullptr @ce. Can't be called if * @ref Containers::NullOpt. Can't be called if
* @ref ConverterFlag::PreprocessOnly is set --- in that case * @ref ConverterFlag::PreprocessOnly is set --- in that case
* @ref convertDataToData() has to be used instead. * @ref convertDataToData() has to be used instead.
* @see @ref features() @ref linkDataToFile(), @ref linkFilesToFile() * @see @ref features() @ref linkDataToFile(), @ref linkFilesToFile()
*/ */
Containers::Array<char> linkDataToData(Containers::ArrayView<const std::pair<Stage, Containers::ArrayView<const void>>> data); #if !defined(MAGNUM_BUILD_DEPRECATED) || defined(DOXYGEN_GENERATING_OUTPUT)
Containers::Optional<Containers::Array<char>>
#else
Implementation::OptionalButAlsoArray<char>
#endif
linkDataToData(Containers::ArrayView<const std::pair<Stage, Containers::ArrayView<const void>>> data);
/** @overload */ /** @overload */
Containers::Array<char> linkDataToData(std::initializer_list<std::pair<Stage, Containers::ArrayView<const void>>> data); #if !defined(MAGNUM_BUILD_DEPRECATED) || defined(DOXYGEN_GENERATING_OUTPUT)
Containers::Optional<Containers::Array<char>>
#else
Implementation::OptionalButAlsoArray<char>
#endif
linkDataToData(std::initializer_list<std::pair<Stage, Containers::ArrayView<const void>>> data);
/** /**
* @brief Link shader data together to a file * @brief Link shader data together to a file
@ -884,16 +924,26 @@ class MAGNUM_SHADERTOOLS_EXPORT AbstractConverter: public PluginManager::Abstrac
* *
* Available only if @ref ConverterFeature::LinkData is supported. On * Available only if @ref ConverterFeature::LinkData is supported. On
* failure prints a message to @relativeref{Magnum,Error} and returns * failure prints a message to @relativeref{Magnum,Error} and returns
* @cpp nullptr @ce. Can't be called if * @ref Containers::NullOpt. Can't be called if
* @ref ConverterFlag::PreprocessOnly is set --- in that case * @ref ConverterFlag::PreprocessOnly is set --- in that case
* @ref convertFileToData() has to be used instead. * @ref convertFileToData() has to be used instead.
* @see @ref features(), @ref linkFilesToFile(), @ref linkDataToFile(), * @see @ref features(), @ref linkFilesToFile(), @ref linkDataToFile(),
* @ref linkDataToData() * @ref linkDataToData()
*/ */
Containers::Array<char> linkFilesToData(Containers::ArrayView<const std::pair<Stage, Containers::StringView>> filenames); #if !defined(MAGNUM_BUILD_DEPRECATED) || defined(DOXYGEN_GENERATING_OUTPUT)
Containers::Optional<Containers::Array<char>>
#else
Implementation::OptionalButAlsoArray<char>
#endif
linkFilesToData(Containers::ArrayView<const std::pair<Stage, Containers::StringView>> filenames);
/** @overload */ /** @overload */
Containers::Array<char> linkFilesToData(std::initializer_list<std::pair<Stage, Containers::StringView>> filenames); #if !defined(MAGNUM_BUILD_DEPRECATED) || defined(DOXYGEN_GENERATING_OUTPUT)
Containers::Optional<Containers::Array<char>>
#else
Implementation::OptionalButAlsoArray<char>
#endif
linkFilesToData(std::initializer_list<std::pair<Stage, Containers::StringView>> filenames);
protected: protected:
/** /**
@ -945,7 +995,7 @@ class MAGNUM_SHADERTOOLS_EXPORT AbstractConverter: public PluginManager::Abstrac
* is not supported --- instead, file is loaded though the callback and * is not supported --- instead, file is loaded though the callback and
* data passed through to @ref doConvertDataToData(). * data passed through to @ref doConvertDataToData().
*/ */
virtual Containers::Array<char> doConvertFileToData(Stage stage, Containers::StringView filename); virtual Containers::Optional<Containers::Array<char>> doConvertFileToData(Stage stage, Containers::StringView filename);
/** /**
* @brief Implementation for @ref linkFilesToFile() * @brief Implementation for @ref linkFilesToFile()
@ -979,7 +1029,7 @@ class MAGNUM_SHADERTOOLS_EXPORT AbstractConverter: public PluginManager::Abstrac
* is not supported --- instead, file is loaded though the callback and * is not supported --- instead, file is loaded though the callback and
* data passed through to @ref doConvertDataToData(). * data passed through to @ref doConvertDataToData().
*/ */
virtual Containers::Array<char> doLinkFilesToData(Containers::ArrayView<const std::pair<Stage, Containers::StringView>> filenames); virtual Containers::Optional<Containers::Array<char>> doLinkFilesToData(Containers::ArrayView<const std::pair<Stage, Containers::StringView>> filenames);
private: private:
/** /**
@ -1090,7 +1140,7 @@ class MAGNUM_SHADERTOOLS_EXPORT AbstractConverter: public PluginManager::Abstrac
/* Used by convertFileToFile(), doConvertFileToFile(), /* Used by convertFileToFile(), doConvertFileToFile(),
convertFileToData() and doConvertFileToData() */ convertFileToData() and doConvertFileToData() */
MAGNUM_SHADERTOOLS_LOCAL Containers::Array<char> convertDataToDataUsingInputFileCallbacks(const char* prefix, const Stage stage, Containers::StringView filename); MAGNUM_SHADERTOOLS_LOCAL Containers::Optional<Containers::Array<char>> convertDataToDataUsingInputFileCallbacks(const char* prefix, const Stage stage, Containers::StringView filename);
/** /**
* @brief Implementation for @ref convertDataToData() * @brief Implementation for @ref convertDataToData()
@ -1100,11 +1150,11 @@ class MAGNUM_SHADERTOOLS_EXPORT AbstractConverter: public PluginManager::Abstrac
* in order to accept any type, this function gets it cast to * in order to accept any type, this function gets it cast to
* @cpp char @ce for more convenience. * @cpp char @ce for more convenience.
*/ */
virtual Containers::Array<char> doConvertDataToData(Stage stage, Containers::ArrayView<const char> data); virtual Containers::Optional<Containers::Array<char>> doConvertDataToData(Stage stage, Containers::ArrayView<const char> data);
/* Used by linkFilesToFile(), doLinkFilesToFile(), linkFilesToData() /* Used by linkFilesToFile(), doLinkFilesToFile(), linkFilesToData()
and doLinkFilesToData() */ and doLinkFilesToData() */
MAGNUM_SHADERTOOLS_LOCAL Containers::Array<char> linkDataToDataUsingInputFileCallbacks(const char* prefix, Containers::ArrayView<const std::pair<Stage, Containers::StringView>> filenames); MAGNUM_SHADERTOOLS_LOCAL Containers::Optional<Containers::Array<char>> linkDataToDataUsingInputFileCallbacks(const char* prefix, Containers::ArrayView<const std::pair<Stage, Containers::StringView>> filenames);
/** /**
* @brief Implementation for @ref linkDataToData() * @brief Implementation for @ref linkDataToData()
@ -1114,7 +1164,7 @@ class MAGNUM_SHADERTOOLS_EXPORT AbstractConverter: public PluginManager::Abstrac
* order to accept any type, this function gets it cast to * order to accept any type, this function gets it cast to
* @cpp char @ce for more convenience. * @cpp char @ce for more convenience.
*/ */
virtual Containers::Array<char> doLinkDataToData(Containers::ArrayView<const std::pair<Stage, Containers::ArrayView<const char>>> data); virtual Containers::Optional<Containers::Array<char>> doLinkDataToData(Containers::ArrayView<const std::pair<Stage, Containers::ArrayView<const char>>> data);
ConverterFlags _flags; ConverterFlags _flags;

147
src/Magnum/ShaderTools/Test/AbstractConverterTest.cpp

@ -934,7 +934,7 @@ void AbstractConverterTest::convertDataToData() {
void doSetInputFormat(Format, Containers::StringView) override {} void doSetInputFormat(Format, Containers::StringView) override {}
void doSetOutputFormat(Format, Containers::StringView) override {} void doSetOutputFormat(Format, Containers::StringView) override {}
Containers::Array<char> doConvertDataToData(Stage, Containers::ArrayView<const char> data) override { Containers::Optional<Containers::Array<char>> doConvertDataToData(Stage, Containers::ArrayView<const char> data) override {
return Containers::array({data.back(), data.front()}); return Containers::array({data.back(), data.front()});
} }
} converter; } converter;
@ -996,7 +996,7 @@ void AbstractConverterTest::convertDataToDataCustomDeleter() {
void doSetInputFormat(Format, Containers::StringView) override {} void doSetInputFormat(Format, Containers::StringView) override {}
void doSetOutputFormat(Format, Containers::StringView) override {} void doSetOutputFormat(Format, Containers::StringView) override {}
Containers::Array<char> doConvertDataToData(Stage, Containers::ArrayView<const char>) override { Containers::Optional<Containers::Array<char>> doConvertDataToData(Stage, Containers::ArrayView<const char>) override {
return Containers::Array<char>{nullptr, 0, [](char*, std::size_t){}}; return Containers::Array<char>{nullptr, 0, [](char*, std::size_t){}};
} }
} converter; } converter;
@ -1015,7 +1015,7 @@ void AbstractConverterTest::convertDataToFileThroughData() {
void doSetInputFormat(Format, Containers::StringView) override {} void doSetInputFormat(Format, Containers::StringView) override {}
void doSetOutputFormat(Format, Containers::StringView) override {} void doSetOutputFormat(Format, Containers::StringView) override {}
Containers::Array<char> doConvertDataToData(Stage, Containers::ArrayView<const char> data) override { Containers::Optional<Containers::Array<char>> doConvertDataToData(Stage, Containers::ArrayView<const char> data) override {
return Containers::array({data.back(), data.front()}); return Containers::array({data.back(), data.front()});
} }
} converter; } converter;
@ -1039,7 +1039,7 @@ void AbstractConverterTest::convertDataToFileThroughDataFailed() {
void doSetInputFormat(Format, Containers::StringView) override {} void doSetInputFormat(Format, Containers::StringView) override {}
void doSetOutputFormat(Format, Containers::StringView) override {} void doSetOutputFormat(Format, Containers::StringView) override {}
Containers::Array<char> doConvertDataToData(Stage, Containers::ArrayView<const char>) override { Containers::Optional<Containers::Array<char>> doConvertDataToData(Stage, Containers::ArrayView<const char>) override {
return {}; return {};
} }
} converter; } converter;
@ -1066,7 +1066,7 @@ void AbstractConverterTest::convertDataToFileThroughDataNotWritable() {
void doSetInputFormat(Format, Containers::StringView) override {} void doSetInputFormat(Format, Containers::StringView) override {}
void doSetOutputFormat(Format, Containers::StringView) override {} void doSetOutputFormat(Format, Containers::StringView) override {}
Containers::Array<char> doConvertDataToData(Stage, Containers::ArrayView<const char>) override { Containers::Optional<Containers::Array<char>> doConvertDataToData(Stage, Containers::ArrayView<const char>) override {
return Containers::Array<char>{1}; return Containers::Array<char>{1};
} }
} converter; } converter;
@ -1152,7 +1152,7 @@ void AbstractConverterTest::convertFileToFileThroughData() {
void doSetInputFormat(Format, Containers::StringView) override {} void doSetInputFormat(Format, Containers::StringView) override {}
void doSetOutputFormat(Format, Containers::StringView) override {} void doSetOutputFormat(Format, Containers::StringView) override {}
Containers::Array<char> doConvertDataToData(Stage, Containers::ArrayView<const char> data) override { Containers::Optional<Containers::Array<char>> doConvertDataToData(Stage, Containers::ArrayView<const char> data) override {
return Containers::array({data.back(), data.front()}); return Containers::array({data.back(), data.front()});
} }
} converter; } converter;
@ -1175,7 +1175,7 @@ void AbstractConverterTest::convertFileToFileThroughDataNotFound() {
void doSetInputFormat(Format, Containers::StringView) override {} void doSetInputFormat(Format, Containers::StringView) override {}
void doSetOutputFormat(Format, Containers::StringView) override {} void doSetOutputFormat(Format, Containers::StringView) override {}
Containers::Array<char> doConvertDataToData(Stage, Containers::ArrayView<const char>) override { Containers::Optional<Containers::Array<char>> doConvertDataToData(Stage, Containers::ArrayView<const char>) override {
CORRADE_VERIFY(!"this shouldn't be reached"); CORRADE_VERIFY(!"this shouldn't be reached");
return {}; return {};
} }
@ -1198,7 +1198,7 @@ void AbstractConverterTest::convertFileToFileThroughDataFailed() {
void doSetInputFormat(Format, Containers::StringView) override {} void doSetInputFormat(Format, Containers::StringView) override {}
void doSetOutputFormat(Format, Containers::StringView) override {} void doSetOutputFormat(Format, Containers::StringView) override {}
Containers::Array<char> doConvertDataToData(Stage, Containers::ArrayView<const char>) override { Containers::Optional<Containers::Array<char>> doConvertDataToData(Stage, Containers::ArrayView<const char>) override {
return {}; return {};
} }
} converter; } converter;
@ -1225,7 +1225,7 @@ void AbstractConverterTest::convertFileToFileThroughDataNotWritable() {
void doSetInputFormat(Format, Containers::StringView) override {} void doSetInputFormat(Format, Containers::StringView) override {}
void doSetOutputFormat(Format, Containers::StringView) override {} void doSetOutputFormat(Format, Containers::StringView) override {}
Containers::Array<char> doConvertDataToData(Stage, Containers::ArrayView<const char>) override { Containers::Optional<Containers::Array<char>> doConvertDataToData(Stage, Containers::ArrayView<const char>) override {
return Containers::Array<char>{1}; return Containers::Array<char>{1};
} }
} converter; } converter;
@ -1284,7 +1284,7 @@ void AbstractConverterTest::convertFileToData() {
void doSetInputFormat(Format, Containers::StringView) override {} void doSetInputFormat(Format, Containers::StringView) override {}
void doSetOutputFormat(Format, Containers::StringView) override {} void doSetOutputFormat(Format, Containers::StringView) override {}
Containers::Array<char> doConvertFileToData(Stage, const Containers::StringView from) override { Containers::Optional<Containers::Array<char>> doConvertFileToData(Stage, const Containers::StringView from) override {
Containers::Optional<Containers::Array<char>> data = Utility::Path::read(from); Containers::Optional<Containers::Array<char>> data = Utility::Path::read(from);
CORRADE_VERIFY(data); CORRADE_VERIFY(data);
return Containers::array({data->back(), data->front()}); return Containers::array({data->back(), data->front()});
@ -1306,7 +1306,7 @@ void AbstractConverterTest::convertFileToDataAsData() {
void doSetInputFormat(Format, Containers::StringView) override {} void doSetInputFormat(Format, Containers::StringView) override {}
void doSetOutputFormat(Format, Containers::StringView) override {} void doSetOutputFormat(Format, Containers::StringView) override {}
Containers::Array<char> doConvertDataToData(Stage, Containers::ArrayView<const char> data) override { Containers::Optional<Containers::Array<char>> doConvertDataToData(Stage, Containers::ArrayView<const char> data) override {
return Containers::array({data.back(), data.front()}); return Containers::array({data.back(), data.front()});
} }
} converter; } converter;
@ -1324,7 +1324,7 @@ void AbstractConverterTest::convertFileToDataAsDataNotFound() {
void doSetInputFormat(Format, Containers::StringView) override {} void doSetInputFormat(Format, Containers::StringView) override {}
void doSetOutputFormat(Format, Containers::StringView) override {} void doSetOutputFormat(Format, Containers::StringView) override {}
Containers::Array<char> doConvertDataToData(Stage, Containers::ArrayView<const char>) override { Containers::Optional<Containers::Array<char>> doConvertDataToData(Stage, Containers::ArrayView<const char>) override {
CORRADE_VERIFY(!"this shouldn't be reached"); CORRADE_VERIFY(!"this shouldn't be reached");
return {}; return {};
} }
@ -1390,7 +1390,7 @@ void AbstractConverterTest::convertFileToDataCustomDeleter() {
void doSetInputFormat(Format, Containers::StringView) override {} void doSetInputFormat(Format, Containers::StringView) override {}
void doSetOutputFormat(Format, Containers::StringView) override {} void doSetOutputFormat(Format, Containers::StringView) override {}
Containers::Array<char> doConvertFileToData(Stage, const Containers::StringView) override { Containers::Optional<Containers::Array<char>> doConvertFileToData(Stage, const Containers::StringView) override {
return Containers::Array<char>{nullptr, 0, [](char*, std::size_t){}}; return Containers::Array<char>{nullptr, 0, [](char*, std::size_t){}};
} }
} converter; } converter;
@ -1409,7 +1409,7 @@ void AbstractConverterTest::linkDataToData() {
void doSetInputFormat(Format, Containers::StringView) override {} void doSetInputFormat(Format, Containers::StringView) override {}
void doSetOutputFormat(Format, Containers::StringView) override {} void doSetOutputFormat(Format, Containers::StringView) override {}
Containers::Array<char> doLinkDataToData(Containers::ArrayView<const std::pair<Stage, Containers::ArrayView<const char>>> data) override { Containers::Optional<Containers::Array<char>> doLinkDataToData(Containers::ArrayView<const std::pair<Stage, Containers::ArrayView<const char>>> data) override {
CORRADE_COMPARE(data.size(), 2); CORRADE_COMPARE(data.size(), 2);
return Containers::array({ return Containers::array({
data[0].first == Stage::Vertex ? data[0].second[0] : ' ', data[0].first == Stage::Vertex ? data[0].second[0] : ' ',
@ -1518,7 +1518,7 @@ void AbstractConverterTest::linkDataToDataCustomDeleter() {
void doSetInputFormat(Format, Containers::StringView) override {} void doSetInputFormat(Format, Containers::StringView) override {}
void doSetOutputFormat(Format, Containers::StringView) override {} void doSetOutputFormat(Format, Containers::StringView) override {}
Containers::Array<char> doLinkDataToData(Containers::ArrayView<const std::pair<Stage, Containers::ArrayView<const char>>>) override { Containers::Optional<Containers::Array<char>> doLinkDataToData(Containers::ArrayView<const std::pair<Stage, Containers::ArrayView<const char>>>) override {
return Containers::Array<char>{nullptr, 0, [](char*, std::size_t){}}; return Containers::Array<char>{nullptr, 0, [](char*, std::size_t){}};
} }
} converter; } converter;
@ -1538,7 +1538,7 @@ void AbstractConverterTest::linkDataToFileThroughData() {
void doSetInputFormat(Format, Containers::StringView) override {} void doSetInputFormat(Format, Containers::StringView) override {}
void doSetOutputFormat(Format, Containers::StringView) override {} void doSetOutputFormat(Format, Containers::StringView) override {}
Containers::Array<char> doLinkDataToData(Containers::ArrayView<const std::pair<Stage, Containers::ArrayView<const char>>> data) override { Containers::Optional<Containers::Array<char>> doLinkDataToData(Containers::ArrayView<const std::pair<Stage, Containers::ArrayView<const char>>> data) override {
CORRADE_COMPARE(data.size(), 2); CORRADE_COMPARE(data.size(), 2);
return Containers::array({ return Containers::array({
data[0].first == Stage::Vertex ? data[0].second[0] : ' ', data[0].first == Stage::Vertex ? data[0].second[0] : ' ',
@ -1568,7 +1568,7 @@ void AbstractConverterTest::linkDataToFileThroughDataFailed() {
void doSetInputFormat(Format, Containers::StringView) override {} void doSetInputFormat(Format, Containers::StringView) override {}
void doSetOutputFormat(Format, Containers::StringView) override {} void doSetOutputFormat(Format, Containers::StringView) override {}
Containers::Array<char> doLinkDataToData(Containers::ArrayView<const std::pair<Stage, Containers::ArrayView<const char>>>) override { Containers::Optional<Containers::Array<char>> doLinkDataToData(Containers::ArrayView<const std::pair<Stage, Containers::ArrayView<const char>>>) override {
return {}; return {};
} }
} converter; } converter;
@ -1596,7 +1596,7 @@ void AbstractConverterTest::linkDataToFileThroughDataNotWritable() {
void doSetInputFormat(Format, Containers::StringView) override {} void doSetInputFormat(Format, Containers::StringView) override {}
void doSetOutputFormat(Format, Containers::StringView) override {} void doSetOutputFormat(Format, Containers::StringView) override {}
Containers::Array<char> doLinkDataToData(Containers::ArrayView<const std::pair<Stage, Containers::ArrayView<const char>>>) override { Containers::Optional<Containers::Array<char>> doLinkDataToData(Containers::ArrayView<const std::pair<Stage, Containers::ArrayView<const char>>>) override {
return Containers::Array<char>{1}; return Containers::Array<char>{1};
} }
} converter; } converter;
@ -1732,7 +1732,7 @@ void AbstractConverterTest::linkFilesToFileThroughData() {
void doSetInputFormat(Format, Containers::StringView) override {} void doSetInputFormat(Format, Containers::StringView) override {}
void doSetOutputFormat(Format, Containers::StringView) override {} void doSetOutputFormat(Format, Containers::StringView) override {}
Containers::Array<char> doLinkDataToData(Containers::ArrayView<const std::pair<Stage, Containers::ArrayView<const char>>> data) override { Containers::Optional<Containers::Array<char>> doLinkDataToData(Containers::ArrayView<const std::pair<Stage, Containers::ArrayView<const char>>> data) override {
CORRADE_COMPARE(data.size(), 2); CORRADE_COMPARE(data.size(), 2);
return Containers::array({ return Containers::array({
data[0].first == Stage::Vertex ? data[0].second[0] : ' ', data[0].first == Stage::Vertex ? data[0].second[0] : ' ',
@ -1762,7 +1762,7 @@ void AbstractConverterTest::linkFilesToFileThroughDataNotFound() {
void doSetInputFormat(Format, Containers::StringView) override {} void doSetInputFormat(Format, Containers::StringView) override {}
void doSetOutputFormat(Format, Containers::StringView) override {} void doSetOutputFormat(Format, Containers::StringView) override {}
Containers::Array<char> doLinkDataToData(Containers::ArrayView<const std::pair<Stage, Containers::ArrayView<const char>>>) override { Containers::Optional<Containers::Array<char>> doLinkDataToData(Containers::ArrayView<const std::pair<Stage, Containers::ArrayView<const char>>>) override {
CORRADE_VERIFY(!"this shouldn't be reached"); CORRADE_VERIFY(!"this shouldn't be reached");
return {}; return {};
} }
@ -1788,7 +1788,7 @@ void AbstractConverterTest::linkFilesToFileThroughDataFailed() {
void doSetInputFormat(Format, Containers::StringView) override {} void doSetInputFormat(Format, Containers::StringView) override {}
void doSetOutputFormat(Format, Containers::StringView) override {} void doSetOutputFormat(Format, Containers::StringView) override {}
Containers::Array<char> doLinkDataToData(Containers::ArrayView<const std::pair<Stage, Containers::ArrayView<const char>>>) override { Containers::Optional<Containers::Array<char>> doLinkDataToData(Containers::ArrayView<const std::pair<Stage, Containers::ArrayView<const char>>>) override {
return {}; return {};
} }
} converter; } converter;
@ -1817,7 +1817,7 @@ void AbstractConverterTest::linkFilesToFileThroughDataNotWritable() {
void doSetInputFormat(Format, Containers::StringView) override {} void doSetInputFormat(Format, Containers::StringView) override {}
void doSetOutputFormat(Format, Containers::StringView) override {} void doSetOutputFormat(Format, Containers::StringView) override {}
Containers::Array<char> doLinkDataToData(Containers::ArrayView<const std::pair<Stage, Containers::ArrayView<const char>>>) override { Containers::Optional<Containers::Array<char>> doLinkDataToData(Containers::ArrayView<const std::pair<Stage, Containers::ArrayView<const char>>>) override {
return Containers::Array<char>{1}; return Containers::Array<char>{1};
} }
} converter; } converter;
@ -1918,7 +1918,7 @@ void AbstractConverterTest::linkFilesToData() {
void doSetInputFormat(Format, Containers::StringView) override {} void doSetInputFormat(Format, Containers::StringView) override {}
void doSetOutputFormat(Format, Containers::StringView) override {} void doSetOutputFormat(Format, Containers::StringView) override {}
Containers::Array<char> doLinkFilesToData(Containers::ArrayView<const std::pair<Stage, Containers::StringView>> from) override { Containers::Optional<Containers::Array<char>> doLinkFilesToData(Containers::ArrayView<const std::pair<Stage, Containers::StringView>> from) override {
CORRADE_COMPARE(from.size(), 2); CORRADE_COMPARE(from.size(), 2);
Containers::Optional<Containers::Array<char>> first = Utility::Path::read(from[0].second); Containers::Optional<Containers::Array<char>> first = Utility::Path::read(from[0].second);
Containers::Optional<Containers::Array<char>> second = Utility::Path::read(from[1].second); Containers::Optional<Containers::Array<char>> second = Utility::Path::read(from[1].second);
@ -1949,7 +1949,7 @@ void AbstractConverterTest::linkFilesToDataAsData() {
void doSetInputFormat(Format, Containers::StringView) override {} void doSetInputFormat(Format, Containers::StringView) override {}
void doSetOutputFormat(Format, Containers::StringView) override {} void doSetOutputFormat(Format, Containers::StringView) override {}
Containers::Array<char> doLinkDataToData(Containers::ArrayView<const std::pair<Stage, Containers::ArrayView<const char>>> data) override { Containers::Optional<Containers::Array<char>> doLinkDataToData(Containers::ArrayView<const std::pair<Stage, Containers::ArrayView<const char>>> data) override {
CORRADE_COMPARE(data.size(), 2); CORRADE_COMPARE(data.size(), 2);
return Containers::array({ return Containers::array({
data[0].first == Stage::Vertex ? data[0].second[0] : ' ', data[0].first == Stage::Vertex ? data[0].second[0] : ' ',
@ -1976,7 +1976,7 @@ void AbstractConverterTest::linkFilesToDataAsDataNotFound() {
void doSetInputFormat(Format, Containers::StringView) override {} void doSetInputFormat(Format, Containers::StringView) override {}
void doSetOutputFormat(Format, Containers::StringView) override {} void doSetOutputFormat(Format, Containers::StringView) override {}
Containers::Array<char> doLinkDataToData(Containers::ArrayView<const std::pair<Stage, Containers::ArrayView<const char>>>) override { Containers::Optional<Containers::Array<char>> doLinkDataToData(Containers::ArrayView<const std::pair<Stage, Containers::ArrayView<const char>>>) override {
CORRADE_VERIFY(!"this shouldn't be reached"); CORRADE_VERIFY(!"this shouldn't be reached");
return {}; return {};
} }
@ -2086,7 +2086,7 @@ void AbstractConverterTest::linkFilesToDataCustomDeleter() {
void doSetInputFormat(Format, Containers::StringView) override {} void doSetInputFormat(Format, Containers::StringView) override {}
void doSetOutputFormat(Format, Containers::StringView) override {} void doSetOutputFormat(Format, Containers::StringView) override {}
Containers::Array<char> doLinkFilesToData(Containers::ArrayView<const std::pair<Stage, Containers::StringView>>) override { Containers::Optional<Containers::Array<char>> doLinkFilesToData(Containers::ArrayView<const std::pair<Stage, Containers::StringView>>) override {
return Containers::Array<char>{nullptr, 0, [](char*, std::size_t){}}; return Containers::Array<char>{nullptr, 0, [](char*, std::size_t){}};
} }
} converter; } converter;
@ -2428,7 +2428,7 @@ void AbstractConverterTest::setInputFileCallbackConvertFileToFileDirectly() {
return stage == Stage::Mesh && from == "file.dat" && to == "file.out" && inputFileCallback() && inputFileCallbackUserData(); return stage == Stage::Mesh && from == "file.dat" && to == "file.out" && inputFileCallback() && inputFileCallbackUserData();
} }
Containers::Array<char> doConvertDataToData(Stage, Containers::ArrayView<const char>) override { Containers::Optional<Containers::Array<char>> doConvertDataToData(Stage, Containers::ArrayView<const char>) override {
CORRADE_VERIFY(!"this should not be reached"); CORRADE_VERIFY(!"this should not be reached");
return {}; return {};
} }
@ -2460,7 +2460,7 @@ void AbstractConverterTest::setInputFileCallbackConvertFileToFileThroughBaseImpl
return AbstractConverter::doConvertFileToFile(stage, from, to); return AbstractConverter::doConvertFileToFile(stage, from, to);
} }
Containers::Array<char> doConvertDataToData(Stage stage, Containers::ArrayView<const char> data) override { Containers::Optional<Containers::Array<char>> doConvertDataToData(Stage stage, Containers::ArrayView<const char> data) override {
if(stage == Stage::Geometry && data.size() == 1 && data[0] == '\xb0') if(stage == Stage::Geometry && data.size() == 1 && data[0] == '\xb0')
return Containers::array({'y', 'e', 'p'}); return Containers::array({'y', 'e', 'p'});
return {}; return {};
@ -2543,7 +2543,7 @@ void AbstractConverterTest::setInputFileCallbackConvertFileToFileAsData() {
return {}; return {};
} }
Containers::Array<char> doConvertDataToData(Stage stage, Containers::ArrayView<const char> data) override { Containers::Optional<Containers::Array<char>> doConvertDataToData(Stage stage, Containers::ArrayView<const char> data) override {
if(stage == Stage::RayAnyHit && data.size() == 1 && data[0] == '\xb0') if(stage == Stage::RayAnyHit && data.size() == 1 && data[0] == '\xb0')
return Containers::array({'y', 'e', 'p'}); return Containers::array({'y', 'e', 'p'});
return {}; return {};
@ -2620,7 +2620,7 @@ void AbstractConverterTest::setInputFileCallbackConvertFileToFileAsDataNotWritab
return {}; return {};
} }
Containers::Array<char> doConvertDataToData(Stage, Containers::ArrayView<const char>) override { Containers::Optional<Containers::Array<char>> doConvertDataToData(Stage, Containers::ArrayView<const char>) override {
return Containers::Array<char>{1}; return Containers::Array<char>{1};
} }
} converter; } converter;
@ -2664,13 +2664,13 @@ void AbstractConverterTest::setInputFileCallbackConvertFileToDataDirectly() {
void doSetInputFormat(Format, Containers::StringView) override {} void doSetInputFormat(Format, Containers::StringView) override {}
void doSetOutputFormat(Format, Containers::StringView) override {} void doSetOutputFormat(Format, Containers::StringView) override {}
Containers::Array<char> doConvertFileToData(Stage stage, Containers::StringView from) override { Containers::Optional<Containers::Array<char>> doConvertFileToData(Stage stage, Containers::StringView from) override {
if(stage == Stage::Compute && from == "file.dat" && inputFileCallback() && inputFileCallbackUserData()) if(stage == Stage::Compute && from == "file.dat" && inputFileCallback() && inputFileCallbackUserData())
return Containers::array({'y', 'e', 'p'}); return Containers::array({'y', 'e', 'p'});
return {}; return {};
} }
Containers::Array<char> doConvertDataToData(Stage, Containers::ArrayView<const char>) override { Containers::Optional<Containers::Array<char>> doConvertDataToData(Stage, Containers::ArrayView<const char>) override {
CORRADE_VERIFY(!"this should not be reached"); CORRADE_VERIFY(!"this should not be reached");
return {}; return {};
} }
@ -2682,7 +2682,9 @@ void AbstractConverterTest::setInputFileCallbackConvertFileToDataDirectly() {
return Containers::Optional<Containers::ArrayView<const char>>{}; return Containers::Optional<Containers::ArrayView<const char>>{};
}, &a); }, &a);
CORRADE_COMPARE_AS(converter.convertFileToData(Stage::Compute, "file.dat"), Containers::Optional<Containers::Array<char>> out = converter.convertFileToData(Stage::Compute, "file.dat");
CORRADE_VERIFY(out);
CORRADE_COMPARE_AS(*out,
Containers::arrayView({'y', 'e', 'p'}), Containers::arrayView({'y', 'e', 'p'}),
TestSuite::Compare::Container); TestSuite::Compare::Container);
} }
@ -2695,7 +2697,7 @@ void AbstractConverterTest::setInputFileCallbackConvertFileToDataThroughBaseImpl
void doSetInputFormat(Format, Containers::StringView) override {} void doSetInputFormat(Format, Containers::StringView) override {}
void doSetOutputFormat(Format, Containers::StringView) override {} void doSetOutputFormat(Format, Containers::StringView) override {}
Containers::Array<char> doConvertFileToData(Stage stage, Containers::StringView from) override { Containers::Optional<Containers::Array<char>> doConvertFileToData(Stage stage, Containers::StringView from) override {
convertFileToDataCalled = true; convertFileToDataCalled = true;
if(stage != Stage::TessellationEvaluation || from != "file.dat" || !inputFileCallback() || !inputFileCallbackUserData()) if(stage != Stage::TessellationEvaluation || from != "file.dat" || !inputFileCallback() || !inputFileCallbackUserData())
@ -2704,7 +2706,7 @@ void AbstractConverterTest::setInputFileCallbackConvertFileToDataThroughBaseImpl
return AbstractConverter::doConvertFileToData(stage, from); return AbstractConverter::doConvertFileToData(stage, from);
} }
Containers::Array<char> doConvertDataToData(Stage stage, Containers::ArrayView<const char> data) override { Containers::Optional<Containers::Array<char>> doConvertDataToData(Stage stage, Containers::ArrayView<const char> data) override {
if(stage == Stage::TessellationEvaluation && data.size() == 1 && data[0] == '\xb0') if(stage == Stage::TessellationEvaluation && data.size() == 1 && data[0] == '\xb0')
return Containers::array({'y', 'e', 'p'}); return Containers::array({'y', 'e', 'p'});
return {}; return {};
@ -2734,7 +2736,9 @@ void AbstractConverterTest::setInputFileCallbackConvertFileToDataThroughBaseImpl
return {}; return {};
}, state); }, state);
CORRADE_COMPARE_AS(converter.convertFileToData(Stage::TessellationEvaluation, "file.dat"), Containers::Optional<Containers::Array<char>> out = converter.convertFileToData(Stage::TessellationEvaluation, "file.dat");
CORRADE_VERIFY(out);
CORRADE_COMPARE_AS(*out,
Containers::arrayView({'y', 'e', 'p'}), Containers::arrayView({'y', 'e', 'p'}),
TestSuite::Compare::Container); TestSuite::Compare::Container);
CORRADE_VERIFY(converter.convertFileToDataCalled); CORRADE_VERIFY(converter.convertFileToDataCalled);
@ -2750,7 +2754,7 @@ void AbstractConverterTest::setInputFileCallbackConvertFileToDataThroughBaseImpl
void doSetInputFormat(Format, Containers::StringView) override {} void doSetInputFormat(Format, Containers::StringView) override {}
void doSetOutputFormat(Format, Containers::StringView) override {} void doSetOutputFormat(Format, Containers::StringView) override {}
Containers::Array<char> doConvertFileToData(Stage stage, Containers::StringView from) override { Containers::Optional<Containers::Array<char>> doConvertFileToData(Stage stage, Containers::StringView from) override {
convertFileToDataCalled = true; convertFileToDataCalled = true;
return AbstractConverter::doConvertFileToData(stage, from); return AbstractConverter::doConvertFileToData(stage, from);
} }
@ -2778,12 +2782,12 @@ void AbstractConverterTest::setInputFileCallbackConvertFileToDataAsData() {
void doSetInputFormat(Format, Containers::StringView) override {} void doSetInputFormat(Format, Containers::StringView) override {}
void doSetOutputFormat(Format, Containers::StringView) override {} void doSetOutputFormat(Format, Containers::StringView) override {}
Containers::Array<char> doConvertFileToData(Stage, Containers::StringView) override { Containers::Optional<Containers::Array<char>> doConvertFileToData(Stage, Containers::StringView) override {
CORRADE_VERIFY(!"this shouldn't be reached"); CORRADE_VERIFY(!"this shouldn't be reached");
return {}; return {};
} }
Containers::Array<char> doConvertDataToData(Stage stage, Containers::ArrayView<const char> data) override { Containers::Optional<Containers::Array<char>> doConvertDataToData(Stage stage, Containers::ArrayView<const char> data) override {
if(stage == Stage::RayGeneration && data.size() == 1 && data[0] == '\xb0') if(stage == Stage::RayGeneration && data.size() == 1 && data[0] == '\xb0')
return Containers::array({'y', 'e', 'p'}); return Containers::array({'y', 'e', 'p'});
return {}; return {};
@ -2811,7 +2815,9 @@ void AbstractConverterTest::setInputFileCallbackConvertFileToDataAsData() {
return {}; return {};
}, state); }, state);
CORRADE_COMPARE_AS(converter.convertFileToData(Stage::RayGeneration, "file.dat"), Containers::Optional<Containers::Array<char>> out = converter.convertFileToData(Stage::RayGeneration, "file.dat");
CORRADE_VERIFY(out);
CORRADE_COMPARE_AS(*out,
Containers::arrayView({'y', 'e', 'p'}), Containers::arrayView({'y', 'e', 'p'}),
TestSuite::Compare::Container); TestSuite::Compare::Container);
CORRADE_VERIFY(state.loaded); CORRADE_VERIFY(state.loaded);
@ -2826,7 +2832,7 @@ void AbstractConverterTest::setInputFileCallbackConvertFileToDataAsDataFailed()
void doSetInputFormat(Format, Containers::StringView) override {} void doSetInputFormat(Format, Containers::StringView) override {}
void doSetOutputFormat(Format, Containers::StringView) override {} void doSetOutputFormat(Format, Containers::StringView) override {}
Containers::Array<char> doConvertFileToData(Stage, Containers::StringView) override { Containers::Optional<Containers::Array<char>> doConvertFileToData(Stage, Containers::StringView) override {
CORRADE_VERIFY(!"this shouldn't be reached"); CORRADE_VERIFY(!"this shouldn't be reached");
return {}; return {};
} }
@ -2855,7 +2861,7 @@ void AbstractConverterTest::setInputFileCallbackLinkFilesToFileDirectly() {
return from.size() == 2 && from[0].first == Stage::Vertex && from[0].second == "another.dat" && from[1].first == Stage::Fragment && from[1].second == "file.dat" && to == "file.out" && inputFileCallback() && inputFileCallbackUserData(); return from.size() == 2 && from[0].first == Stage::Vertex && from[0].second == "another.dat" && from[1].first == Stage::Fragment && from[1].second == "file.dat" && to == "file.out" && inputFileCallback() && inputFileCallbackUserData();
} }
Containers::Array<char> doConvertDataToData(Stage, Containers::ArrayView<const char>) override { Containers::Optional<Containers::Array<char>> doConvertDataToData(Stage, Containers::ArrayView<const char>) override {
CORRADE_VERIFY(!"this should not be reached"); CORRADE_VERIFY(!"this should not be reached");
return {}; return {};
} }
@ -2890,7 +2896,7 @@ void AbstractConverterTest::setInputFileCallbackLinkFilesToFileThroughBaseImplem
return AbstractConverter::doLinkFilesToFile(from, to); return AbstractConverter::doLinkFilesToFile(from, to);
} }
Containers::Array<char> doLinkDataToData(Containers::ArrayView<const std::pair<Stage, Containers::ArrayView<const char>>> data) override { Containers::Optional<Containers::Array<char>> doLinkDataToData(Containers::ArrayView<const std::pair<Stage, Containers::ArrayView<const char>>> data) override {
CORRADE_COMPARE(data.size(), 2); CORRADE_COMPARE(data.size(), 2);
return Containers::array({ return Containers::array({
data[0].first == Stage::Vertex ? data[0].second[0] : ' ', data[0].first == Stage::Vertex ? data[0].second[0] : ' ',
@ -2956,7 +2962,7 @@ void AbstractConverterTest::setInputFileCallbackLinkFilesToFileThroughBaseImplem
return AbstractConverter::doLinkFilesToFile(from, to); return AbstractConverter::doLinkFilesToFile(from, to);
} }
Containers::Array<char> doLinkDataToData(Containers::ArrayView<const std::pair<Stage, Containers::ArrayView<const char>>>) override { Containers::Optional<Containers::Array<char>> doLinkDataToData(Containers::ArrayView<const std::pair<Stage, Containers::ArrayView<const char>>>) override {
CORRADE_VERIFY(!"this shouldn't be called"); CORRADE_VERIFY(!"this shouldn't be called");
return {}; return {};
} }
@ -3015,7 +3021,7 @@ void AbstractConverterTest::setInputFileCallbackLinkFilesToFileAsData() {
return {}; return {};
} }
Containers::Array<char> doLinkDataToData(Containers::ArrayView<const std::pair<Stage, Containers::ArrayView<const char>>> data) override { Containers::Optional<Containers::Array<char>> doLinkDataToData(Containers::ArrayView<const std::pair<Stage, Containers::ArrayView<const char>>> data) override {
CORRADE_COMPARE(data.size(), 2); CORRADE_COMPARE(data.size(), 2);
return Containers::array({ return Containers::array({
data[0].first == Stage::Vertex ? data[0].second[0] : ' ', data[0].first == Stage::Vertex ? data[0].second[0] : ' ',
@ -3125,7 +3131,7 @@ void AbstractConverterTest::setInputFileCallbackLinkFilesToFileAsDataNotWritable
return {}; return {};
} }
Containers::Array<char> doLinkDataToData(Containers::ArrayView<const std::pair<Stage, Containers::ArrayView<const char>>>) override { Containers::Optional<Containers::Array<char>> doLinkDataToData(Containers::ArrayView<const std::pair<Stage, Containers::ArrayView<const char>>>) override {
return Containers::Array<char>{1}; return Containers::Array<char>{1};
} }
} converter; } converter;
@ -3178,13 +3184,13 @@ void AbstractConverterTest::setInputFileCallbackLinkFilesToDataDirectly() {
void doSetInputFormat(Format, Containers::StringView) override {} void doSetInputFormat(Format, Containers::StringView) override {}
void doSetOutputFormat(Format, Containers::StringView) override {} void doSetOutputFormat(Format, Containers::StringView) override {}
Containers::Array<char> doLinkFilesToData(Containers::ArrayView<const std::pair<Stage, Containers::StringView>> from) override { Containers::Optional<Containers::Array<char>> doLinkFilesToData(Containers::ArrayView<const std::pair<Stage, Containers::StringView>> from) override {
if(from.size() == 2 && from[0].first == Stage::Vertex && from[0].second == "another.dat" && from[1].first == Stage::Fragment && from[1].second == "file.dat" && inputFileCallback() && inputFileCallbackUserData()) if(from.size() == 2 && from[0].first == Stage::Vertex && from[0].second == "another.dat" && from[1].first == Stage::Fragment && from[1].second == "file.dat" && inputFileCallback() && inputFileCallbackUserData())
return Containers::array({'y', 'e', 'p'}); return Containers::array({'y', 'e', 'p'});
return {}; return {};
} }
Containers::Array<char> doLinkDataToData(Containers::ArrayView<const std::pair<Stage, Containers::ArrayView<const char>>>) override { Containers::Optional<Containers::Array<char>> doLinkDataToData(Containers::ArrayView<const std::pair<Stage, Containers::ArrayView<const char>>>) override {
CORRADE_VERIFY(!"this should not be reached"); CORRADE_VERIFY(!"this should not be reached");
return {}; return {};
} }
@ -3196,10 +3202,13 @@ void AbstractConverterTest::setInputFileCallbackLinkFilesToDataDirectly() {
return Containers::Optional<Containers::ArrayView<const char>>{}; return Containers::Optional<Containers::ArrayView<const char>>{};
}, &a); }, &a);
CORRADE_COMPARE_AS(converter.linkFilesToData({ Containers::Optional<Containers::Array<char>> out = converter.linkFilesToData({
{Stage::Vertex, "another.dat"}, {Stage::Vertex, "another.dat"},
{Stage::Fragment, "file.dat"} {Stage::Fragment, "file.dat"}
}), Containers::arrayView({'y', 'e', 'p'}), });
CORRADE_VERIFY(out);
CORRADE_COMPARE_AS(*out,
Containers::arrayView({'y', 'e', 'p'}),
TestSuite::Compare::Container); TestSuite::Compare::Container);
} }
@ -3211,7 +3220,7 @@ void AbstractConverterTest::setInputFileCallbackLinkFilesToDataThroughBaseImplem
void doSetInputFormat(Format, Containers::StringView) override {} void doSetInputFormat(Format, Containers::StringView) override {}
void doSetOutputFormat(Format, Containers::StringView) override {} void doSetOutputFormat(Format, Containers::StringView) override {}
Containers::Array<char> doLinkFilesToData(Containers::ArrayView<const std::pair<Stage, Containers::StringView>> from) override { Containers::Optional<Containers::Array<char>> doLinkFilesToData(Containers::ArrayView<const std::pair<Stage, Containers::StringView>> from) override {
linkFilesToDataCalled = true; linkFilesToDataCalled = true;
if(from.size() != 2 || from[0].first != Stage::Vertex || from[0].second != "another.dat" || from[1].first != Stage::Fragment || from[1].second != "file.dat" || !inputFileCallback() || !inputFileCallbackUserData()) if(from.size() != 2 || from[0].first != Stage::Vertex || from[0].second != "another.dat" || from[1].first != Stage::Fragment || from[1].second != "file.dat" || !inputFileCallback() || !inputFileCallbackUserData())
@ -3220,7 +3229,7 @@ void AbstractConverterTest::setInputFileCallbackLinkFilesToDataThroughBaseImplem
return AbstractConverter::doLinkFilesToData(from); return AbstractConverter::doLinkFilesToData(from);
} }
Containers::Array<char> doLinkDataToData(Containers::ArrayView<const std::pair<Stage, Containers::ArrayView<const char>>> data) override { Containers::Optional<Containers::Array<char>> doLinkDataToData(Containers::ArrayView<const std::pair<Stage, Containers::ArrayView<const char>>> data) override {
CORRADE_COMPARE(data.size(), 2); CORRADE_COMPARE(data.size(), 2);
return Containers::array({ return Containers::array({
data[0].first == Stage::Vertex ? data[0].second[0] : ' ', data[0].first == Stage::Vertex ? data[0].second[0] : ' ',
@ -3255,10 +3264,13 @@ void AbstractConverterTest::setInputFileCallbackLinkFilesToDataThroughBaseImplem
return {}; return {};
}, state); }, state);
CORRADE_COMPARE_AS(converter.linkFilesToData({ Containers::Optional<Containers::Array<char>> out = converter.linkFilesToData({
{Stage::Vertex, "another.dat"}, {Stage::Vertex, "another.dat"},
{Stage::Fragment, "file.dat"} {Stage::Fragment, "file.dat"}
}), Containers::arrayView({'V', 'S'}), });
CORRADE_VERIFY(out);
CORRADE_COMPARE_AS(*out,
Containers::arrayView({'V', 'S'}),
TestSuite::Compare::Container); TestSuite::Compare::Container);
CORRADE_VERIFY(converter.linkFilesToDataCalled); CORRADE_VERIFY(converter.linkFilesToDataCalled);
CORRADE_COMPARE(state.operations, CORRADE_COMPARE(state.operations,
@ -3276,7 +3288,7 @@ void AbstractConverterTest::setInputFileCallbackLinkFilesToDataThroughBaseImplem
void doSetInputFormat(Format, Containers::StringView) override {} void doSetInputFormat(Format, Containers::StringView) override {}
void doSetOutputFormat(Format, Containers::StringView) override {} void doSetOutputFormat(Format, Containers::StringView) override {}
Containers::Array<char> doLinkFilesToData(Containers::ArrayView<const std::pair<Stage, Containers::StringView>> from) override { Containers::Optional<Containers::Array<char>> doLinkFilesToData(Containers::ArrayView<const std::pair<Stage, Containers::StringView>> from) override {
linkFilesToDataCalled = true; linkFilesToDataCalled = true;
return AbstractConverter::doLinkFilesToData(from); return AbstractConverter::doLinkFilesToData(from);
} }
@ -3330,12 +3342,12 @@ void AbstractConverterTest::setInputFileCallbackLinkFilesToDataAsData() {
void doSetInputFormat(Format, Containers::StringView) override {} void doSetInputFormat(Format, Containers::StringView) override {}
void doSetOutputFormat(Format, Containers::StringView) override {} void doSetOutputFormat(Format, Containers::StringView) override {}
Containers::Array<char> doLinkFilesToData(Containers::ArrayView<const std::pair<Stage, Containers::StringView>>) override { Containers::Optional<Containers::Array<char>> doLinkFilesToData(Containers::ArrayView<const std::pair<Stage, Containers::StringView>>) override {
CORRADE_VERIFY(!"this shouldn't be reached"); CORRADE_VERIFY(!"this shouldn't be reached");
return {}; return {};
} }
Containers::Array<char> doLinkDataToData(Containers::ArrayView<const std::pair<Stage, Containers::ArrayView<const char>>> data) override { Containers::Optional<Containers::Array<char>> doLinkDataToData(Containers::ArrayView<const std::pair<Stage, Containers::ArrayView<const char>>> data) override {
CORRADE_COMPARE(data.size(), 2); CORRADE_COMPARE(data.size(), 2);
return Containers::array({ return Containers::array({
data[0].first == Stage::Vertex ? data[0].second[0] : ' ', data[0].first == Stage::Vertex ? data[0].second[0] : ' ',
@ -3368,10 +3380,13 @@ void AbstractConverterTest::setInputFileCallbackLinkFilesToDataAsData() {
return {}; return {};
}, state); }, state);
CORRADE_COMPARE_AS(converter.linkFilesToData({ Containers::Optional<Containers::Array<char>> out = converter.linkFilesToData({
{Stage::Vertex, "another.dat"}, {Stage::Vertex, "another.dat"},
{Stage::Fragment, "file.dat"} {Stage::Fragment, "file.dat"}
}), Containers::arrayView({'V', 'S'}), });
CORRADE_VERIFY(out);
CORRADE_COMPARE_AS(*out,
Containers::arrayView({'V', 'S'}),
TestSuite::Compare::Container); TestSuite::Compare::Container);
CORRADE_COMPARE(state.operations, CORRADE_COMPARE(state.operations,
"loaded another.dat\n" "loaded another.dat\n"
@ -3388,7 +3403,7 @@ void AbstractConverterTest::setInputFileCallbackLinkFilesToDataAsDataFailed() {
void doSetInputFormat(Format, Containers::StringView) override {} void doSetInputFormat(Format, Containers::StringView) override {}
void doSetOutputFormat(Format, Containers::StringView) override {} void doSetOutputFormat(Format, Containers::StringView) override {}
Containers::Array<char> doLinkFilesToData(Containers::ArrayView<const std::pair<Stage, Containers::StringView>>) override { Containers::Optional<Containers::Array<char>> doLinkFilesToData(Containers::ArrayView<const std::pair<Stage, Containers::StringView>>) override {
CORRADE_VERIFY(!"this shouldn't be reached"); CORRADE_VERIFY(!"this shouldn't be reached");
return {}; return {};
} }

389
src/Magnum/Trade/AbstractImageConverter.cpp

@ -65,7 +65,7 @@ using namespace Containers::Literals;
Containers::StringView AbstractImageConverter::pluginInterface() { Containers::StringView AbstractImageConverter::pluginInterface() {
return return
/* [interface] */ /* [interface] */
"cz.mosra.magnum.Trade.AbstractImageConverter/0.3.1"_s "cz.mosra.magnum.Trade.AbstractImageConverter/0.3.2"_s
/* [interface] */ /* [interface] */
; ;
} }
@ -290,9 +290,14 @@ template<UnsignedInt dimensions, template<UnsignedInt, class> class View> bool c
} }
#endif #endif
Containers::Array<char> AbstractImageConverter::convertToData(const ImageView1D& image) { #ifndef MAGNUM_BUILD_DEPRECATED
Containers::Optional<Containers::Array<char>>
#else
Implementation::ImageConverterOptionalButAlsoArray<char>
#endif
AbstractImageConverter::convertToData(const ImageView1D& image) {
CORRADE_ASSERT(features() >= ImageConverterFeature::Convert1DToData, CORRADE_ASSERT(features() >= ImageConverterFeature::Convert1DToData,
"Trade::AbstractImageConverter::convertToData(): 1D image conversion not supported", nullptr); "Trade::AbstractImageConverter::convertToData(): 1D image conversion not supported", {});
#ifndef CORRADE_NO_ASSERT #ifndef CORRADE_NO_ASSERT
/* Explicitly return if checks fail for CORRADE_GRACEFUL_ASSERT builds */ /* Explicitly return if checks fail for CORRADE_GRACEFUL_ASSERT builds */
@ -300,21 +305,32 @@ Containers::Array<char> AbstractImageConverter::convertToData(const ImageView1D&
return {}; return {};
#endif #endif
Containers::Array<char> out = doConvertToData(image); Containers::Optional<Containers::Array<char>> out = doConvertToData(image);
CORRADE_ASSERT(!out.deleter(), "Trade::AbstractImageConverter::convertToData(): implementation is not allowed to use a custom Array deleter", {}); CORRADE_ASSERT(!out || !out->deleter(), "Trade::AbstractImageConverter::convertToData(): implementation is not allowed to use a custom Array deleter", {});
/* GCC 4.8 and Clang 3.8 need an explicit conversion here */
#ifdef MAGNUM_BUILD_DEPRECATED
return Implementation::ImageConverterOptionalButAlsoArray<char>{std::move(out)};
#else
return out; return out;
#endif
} }
Containers::Array<char> AbstractImageConverter::doConvertToData(const ImageView1D& image) { Containers::Optional<Containers::Array<char>> AbstractImageConverter::doConvertToData(const ImageView1D& image) {
CORRADE_ASSERT(features() >= ImageConverterFeature::ConvertLevels1DToData, CORRADE_ASSERT(features() >= ImageConverterFeature::ConvertLevels1DToData,
"Trade::AbstractImageConverter::convertToData(): 1D image conversion advertised but not implemented", nullptr); "Trade::AbstractImageConverter::convertToData(): 1D image conversion advertised but not implemented", {});
return doConvertToData(Containers::arrayView({image})); return doConvertToData(Containers::arrayView({image}));
} }
Containers::Array<char> AbstractImageConverter::convertToData(const ImageView2D& image) { #ifndef MAGNUM_BUILD_DEPRECATED
Containers::Optional<Containers::Array<char>>
#else
Implementation::ImageConverterOptionalButAlsoArray<char>
#endif
AbstractImageConverter::convertToData(const ImageView2D& image) {
CORRADE_ASSERT(features() >= ImageConverterFeature::Convert2DToData, CORRADE_ASSERT(features() >= ImageConverterFeature::Convert2DToData,
"Trade::AbstractImageConverter::convertToData(): 2D image conversion not supported", nullptr); "Trade::AbstractImageConverter::convertToData(): 2D image conversion not supported", {});
#ifndef CORRADE_NO_ASSERT #ifndef CORRADE_NO_ASSERT
/* Explicitly return if checks fail for CORRADE_GRACEFUL_ASSERT builds */ /* Explicitly return if checks fail for CORRADE_GRACEFUL_ASSERT builds */
@ -322,14 +338,20 @@ Containers::Array<char> AbstractImageConverter::convertToData(const ImageView2D&
return {}; return {};
#endif #endif
Containers::Array<char> out = doConvertToData(image); Containers::Optional<Containers::Array<char>> out = doConvertToData(image);
CORRADE_ASSERT(!out.deleter(), "Trade::AbstractImageConverter::convertToData(): implementation is not allowed to use a custom Array deleter", {}); CORRADE_ASSERT(!out || !out->deleter(), "Trade::AbstractImageConverter::convertToData(): implementation is not allowed to use a custom Array deleter", {});
/* GCC 4.8 and Clang 3.8 need an explicit conversion here */
#ifdef MAGNUM_BUILD_DEPRECATED
return Implementation::ImageConverterOptionalButAlsoArray<char>{std::move(out)};
#else
return out; return out;
#endif
} }
Containers::Array<char> AbstractImageConverter::doConvertToData(const ImageView2D& image) { Containers::Optional<Containers::Array<char>> AbstractImageConverter::doConvertToData(const ImageView2D& image) {
CORRADE_ASSERT(features() >= ImageConverterFeature::ConvertLevels2DToData, CORRADE_ASSERT(features() >= ImageConverterFeature::ConvertLevels2DToData,
"Trade::AbstractImageConverter::convertToData(): 2D image conversion advertised but not implemented", nullptr); "Trade::AbstractImageConverter::convertToData(): 2D image conversion advertised but not implemented", {});
return doConvertToData(Containers::arrayView({image})); return doConvertToData(Containers::arrayView({image}));
} }
@ -340,9 +362,14 @@ Containers::Array<char> AbstractImageConverter::exportToData(const ImageView2D&
} }
#endif #endif
Containers::Array<char> AbstractImageConverter::convertToData(const ImageView3D& image) { #ifndef MAGNUM_BUILD_DEPRECATED
Containers::Optional<Containers::Array<char>>
#else
Implementation::ImageConverterOptionalButAlsoArray<char>
#endif
AbstractImageConverter::convertToData(const ImageView3D& image) {
CORRADE_ASSERT(features() >= ImageConverterFeature::Convert3DToData, CORRADE_ASSERT(features() >= ImageConverterFeature::Convert3DToData,
"Trade::AbstractImageConverter::convertToData(): 3D image conversion not supported", nullptr); "Trade::AbstractImageConverter::convertToData(): 3D image conversion not supported", {});
#ifndef CORRADE_NO_ASSERT #ifndef CORRADE_NO_ASSERT
/* Explicitly return if checks fail for CORRADE_GRACEFUL_ASSERT builds */ /* Explicitly return if checks fail for CORRADE_GRACEFUL_ASSERT builds */
@ -350,21 +377,32 @@ Containers::Array<char> AbstractImageConverter::convertToData(const ImageView3D&
return {}; return {};
#endif #endif
Containers::Array<char> out = doConvertToData(image); Containers::Optional<Containers::Array<char>> out = doConvertToData(image);
CORRADE_ASSERT(!out.deleter(), "Trade::AbstractImageConverter::convertToData(): implementation is not allowed to use a custom Array deleter", {}); CORRADE_ASSERT(!out || !out->deleter(), "Trade::AbstractImageConverter::convertToData(): implementation is not allowed to use a custom Array deleter", {});
/* GCC 4.8 and Clang 3.8 need an explicit conversion here */
#ifdef MAGNUM_BUILD_DEPRECATED
return Implementation::ImageConverterOptionalButAlsoArray<char>{std::move(out)};
#else
return out; return out;
#endif
} }
Containers::Array<char> AbstractImageConverter::doConvertToData(const ImageView3D& image) { Containers::Optional<Containers::Array<char>> AbstractImageConverter::doConvertToData(const ImageView3D& image) {
CORRADE_ASSERT(features() >= ImageConverterFeature::ConvertLevels3DToData, CORRADE_ASSERT(features() >= ImageConverterFeature::ConvertLevels3DToData,
"Trade::AbstractImageConverter::convertToData(): 3D image conversion advertised but not implemented", nullptr); "Trade::AbstractImageConverter::convertToData(): 3D image conversion advertised but not implemented", {});
return doConvertToData(Containers::arrayView({image})); return doConvertToData(Containers::arrayView({image}));
} }
Containers::Array<char> AbstractImageConverter::convertToData(const CompressedImageView1D& image) { #ifndef MAGNUM_BUILD_DEPRECATED
Containers::Optional<Containers::Array<char>>
#else
Implementation::ImageConverterOptionalButAlsoArray<char>
#endif
AbstractImageConverter::convertToData(const CompressedImageView1D& image) {
CORRADE_ASSERT(features() >= ImageConverterFeature::ConvertCompressed1DToData, CORRADE_ASSERT(features() >= ImageConverterFeature::ConvertCompressed1DToData,
"Trade::AbstractImageConverter::convertToData(): compressed 1D image conversion not supported", nullptr); "Trade::AbstractImageConverter::convertToData(): compressed 1D image conversion not supported", {});
#ifndef CORRADE_NO_ASSERT #ifndef CORRADE_NO_ASSERT
/* Explicitly return if checks fail for CORRADE_GRACEFUL_ASSERT builds */ /* Explicitly return if checks fail for CORRADE_GRACEFUL_ASSERT builds */
@ -372,21 +410,32 @@ Containers::Array<char> AbstractImageConverter::convertToData(const CompressedIm
return {}; return {};
#endif #endif
Containers::Array<char> out = doConvertToData(image); Containers::Optional<Containers::Array<char>> out = doConvertToData(image);
CORRADE_ASSERT(!out.deleter(), "Trade::AbstractImageConverter::convertToData(): implementation is not allowed to use a custom Array deleter", {}); CORRADE_ASSERT(!out || !out->deleter(), "Trade::AbstractImageConverter::convertToData(): implementation is not allowed to use a custom Array deleter", {});
/* GCC 4.8 and Clang 3.8 need an explicit conversion here */
#ifdef MAGNUM_BUILD_DEPRECATED
return Implementation::ImageConverterOptionalButAlsoArray<char>{std::move(out)};
#else
return out; return out;
#endif
} }
Containers::Array<char> AbstractImageConverter::doConvertToData(const CompressedImageView1D& image) { Containers::Optional<Containers::Array<char>> AbstractImageConverter::doConvertToData(const CompressedImageView1D& image) {
CORRADE_ASSERT(features() >= ImageConverterFeature::ConvertCompressedLevels1DToData, CORRADE_ASSERT(features() >= ImageConverterFeature::ConvertCompressedLevels1DToData,
"Trade::AbstractImageConverter::convertToData(): compressed 1D image conversion advertised but not implemented", nullptr); "Trade::AbstractImageConverter::convertToData(): compressed 1D image conversion advertised but not implemented", {});
return doConvertToData(Containers::arrayView({image})); return doConvertToData(Containers::arrayView({image}));
} }
Containers::Array<char> AbstractImageConverter::convertToData(const CompressedImageView2D& image) { #ifndef MAGNUM_BUILD_DEPRECATED
Containers::Optional<Containers::Array<char>>
#else
Implementation::ImageConverterOptionalButAlsoArray<char>
#endif
AbstractImageConverter::convertToData(const CompressedImageView2D& image) {
CORRADE_ASSERT(features() >= ImageConverterFeature::ConvertCompressed2DToData, CORRADE_ASSERT(features() >= ImageConverterFeature::ConvertCompressed2DToData,
"Trade::AbstractImageConverter::convertToData(): compressed 2D image conversion not supported", nullptr); "Trade::AbstractImageConverter::convertToData(): compressed 2D image conversion not supported", {});
#ifndef CORRADE_NO_ASSERT #ifndef CORRADE_NO_ASSERT
/* Explicitly return if checks fail for CORRADE_GRACEFUL_ASSERT builds */ /* Explicitly return if checks fail for CORRADE_GRACEFUL_ASSERT builds */
@ -394,14 +443,20 @@ Containers::Array<char> AbstractImageConverter::convertToData(const CompressedIm
return {}; return {};
#endif #endif
Containers::Array<char> out = doConvertToData(image); Containers::Optional<Containers::Array<char>> out = doConvertToData(image);
CORRADE_ASSERT(!out.deleter(), "Trade::AbstractImageConverter::convertToData(): implementation is not allowed to use a custom Array deleter", {}); CORRADE_ASSERT(!out || !out->deleter(), "Trade::AbstractImageConverter::convertToData(): implementation is not allowed to use a custom Array deleter", {});
/* GCC 4.8 and Clang 3.8 need an explicit conversion here */
#ifdef MAGNUM_BUILD_DEPRECATED
return Implementation::ImageConverterOptionalButAlsoArray<char>{std::move(out)};
#else
return out; return out;
#endif
} }
Containers::Array<char> AbstractImageConverter::doConvertToData(const CompressedImageView2D& image) { Containers::Optional<Containers::Array<char>> AbstractImageConverter::doConvertToData(const CompressedImageView2D& image) {
CORRADE_ASSERT(features() >= ImageConverterFeature::ConvertCompressedLevels2DToData, CORRADE_ASSERT(features() >= ImageConverterFeature::ConvertCompressedLevels2DToData,
"Trade::AbstractImageConverter::convertToData(): compressed 2D image conversion advertised but not implemented", nullptr); "Trade::AbstractImageConverter::convertToData(): compressed 2D image conversion advertised but not implemented", {});
return doConvertToData(Containers::arrayView({image})); return doConvertToData(Containers::arrayView({image}));
} }
@ -412,9 +467,14 @@ Containers::Array<char> AbstractImageConverter::exportToData(const CompressedIma
} }
#endif #endif
Containers::Array<char> AbstractImageConverter::convertToData(const CompressedImageView3D& image) { #ifndef MAGNUM_BUILD_DEPRECATED
Containers::Optional<Containers::Array<char>>
#else
Implementation::ImageConverterOptionalButAlsoArray<char>
#endif
AbstractImageConverter::convertToData(const CompressedImageView3D& image) {
CORRADE_ASSERT(features() >= ImageConverterFeature::ConvertCompressed3DToData, CORRADE_ASSERT(features() >= ImageConverterFeature::ConvertCompressed3DToData,
"Trade::AbstractImageConverter::convertToData(): compressed 3D image conversion not supported", nullptr); "Trade::AbstractImageConverter::convertToData(): compressed 3D image conversion not supported", {});
#ifndef CORRADE_NO_ASSERT #ifndef CORRADE_NO_ASSERT
/* Explicitly return if checks fail for CORRADE_GRACEFUL_ASSERT builds */ /* Explicitly return if checks fail for CORRADE_GRACEFUL_ASSERT builds */
@ -422,23 +482,39 @@ Containers::Array<char> AbstractImageConverter::convertToData(const CompressedIm
return {}; return {};
#endif #endif
Containers::Array<char> out = doConvertToData(image); Containers::Optional<Containers::Array<char>> out = doConvertToData(image);
CORRADE_ASSERT(!out.deleter(), "Trade::AbstractImageConverter::convertToData(): implementation is not allowed to use a custom Array deleter", {}); CORRADE_ASSERT(!out || !out->deleter(), "Trade::AbstractImageConverter::convertToData(): implementation is not allowed to use a custom Array deleter", {});
/* GCC 4.8 and Clang 3.8 need an explicit conversion here */
#ifdef MAGNUM_BUILD_DEPRECATED
return Implementation::ImageConverterOptionalButAlsoArray<char>{std::move(out)};
#else
return out; return out;
#endif
} }
Containers::Array<char> AbstractImageConverter::doConvertToData(const CompressedImageView3D& image) { Containers::Optional<Containers::Array<char>> AbstractImageConverter::doConvertToData(const CompressedImageView3D& image) {
CORRADE_ASSERT(features() >= ImageConverterFeature::ConvertCompressedLevels3DToData, CORRADE_ASSERT(features() >= ImageConverterFeature::ConvertCompressedLevels3DToData,
"Trade::AbstractImageConverter::convertToData(): compressed 3D image conversion advertised but not implemented", nullptr); "Trade::AbstractImageConverter::convertToData(): compressed 3D image conversion advertised but not implemented", {});
return doConvertToData(Containers::arrayView({image})); return doConvertToData(Containers::arrayView({image}));
} }
Containers::Array<char> AbstractImageConverter::convertToData(const ImageData1D& image) { #ifndef MAGNUM_BUILD_DEPRECATED
Containers::Optional<Containers::Array<char>>
#else
Implementation::ImageConverterOptionalButAlsoArray<char>
#endif
AbstractImageConverter::convertToData(const ImageData1D& image) {
return image.isCompressed() ? convertToData(CompressedImageView1D(image)) : convertToData(ImageView1D(image)); return image.isCompressed() ? convertToData(CompressedImageView1D(image)) : convertToData(ImageView1D(image));
} }
Containers::Array<char> AbstractImageConverter::convertToData(const ImageData2D& image) { #ifndef MAGNUM_BUILD_DEPRECATED
Containers::Optional<Containers::Array<char>>
#else
Implementation::ImageConverterOptionalButAlsoArray<char>
#endif
AbstractImageConverter::convertToData(const ImageData2D& image) {
return image.isCompressed() ? convertToData(CompressedImageView2D(image)) : convertToData(ImageView2D(image)); return image.isCompressed() ? convertToData(CompressedImageView2D(image)) : convertToData(ImageView2D(image));
} }
@ -448,7 +524,12 @@ Containers::Array<char> AbstractImageConverter::exportToData(const ImageData2D&
} }
#endif #endif
Containers::Array<char> AbstractImageConverter::convertToData(const ImageData3D& image) { #ifndef MAGNUM_BUILD_DEPRECATED
Containers::Optional<Containers::Array<char>>
#else
Implementation::ImageConverterOptionalButAlsoArray<char>
#endif
AbstractImageConverter::convertToData(const ImageData3D& image) {
return image.isCompressed() ? convertToData(CompressedImageView3D(image)) : convertToData(ImageView3D(image)); return image.isCompressed() ? convertToData(CompressedImageView3D(image)) : convertToData(ImageView3D(image));
} }
@ -501,9 +582,14 @@ template<UnsignedInt dimensions> bool checkImageValidity(const char* const messa
} }
#endif #endif
Containers::Array<char> AbstractImageConverter::convertToData(const Containers::ArrayView<const ImageView1D> imageLevels) { #ifndef MAGNUM_BUILD_DEPRECATED
Containers::Optional<Containers::Array<char>>
#else
Implementation::ImageConverterOptionalButAlsoArray<char>
#endif
AbstractImageConverter::convertToData(const Containers::ArrayView<const ImageView1D> imageLevels) {
CORRADE_ASSERT(features() >= ImageConverterFeature::ConvertLevels1DToData, CORRADE_ASSERT(features() >= ImageConverterFeature::ConvertLevels1DToData,
"Trade::AbstractImageConverter::convertToData(): multi-level 1D image conversion not supported", nullptr); "Trade::AbstractImageConverter::convertToData(): multi-level 1D image conversion not supported", {});
#ifndef CORRADE_NO_ASSERT #ifndef CORRADE_NO_ASSERT
/* Explicitly return if checks fail for CORRADE_GRACEFUL_ASSERT builds */ /* Explicitly return if checks fail for CORRADE_GRACEFUL_ASSERT builds */
@ -511,22 +597,38 @@ Containers::Array<char> AbstractImageConverter::convertToData(const Containers::
return {}; return {};
#endif #endif
Containers::Array<char> out = doConvertToData(imageLevels); Containers::Optional<Containers::Array<char>> out = doConvertToData(imageLevels);
CORRADE_ASSERT(!out.deleter(), "Trade::AbstractImageConverter::convertToData(): implementation is not allowed to use a custom Array deleter", {}); CORRADE_ASSERT(!out || !out->deleter(), "Trade::AbstractImageConverter::convertToData(): implementation is not allowed to use a custom Array deleter", {});
/* GCC 4.8 and Clang 3.8 need an explicit conversion here */
#ifdef MAGNUM_BUILD_DEPRECATED
return Implementation::ImageConverterOptionalButAlsoArray<char>{std::move(out)};
#else
return out; return out;
#endif
} }
Containers::Array<char> AbstractImageConverter::convertToData(const std::initializer_list<ImageView1D> imageLevels) { #ifndef MAGNUM_BUILD_DEPRECATED
Containers::Optional<Containers::Array<char>>
#else
Implementation::ImageConverterOptionalButAlsoArray<char>
#endif
AbstractImageConverter::convertToData(const std::initializer_list<ImageView1D> imageLevels) {
return convertToData(Containers::arrayView(imageLevels)); return convertToData(Containers::arrayView(imageLevels));
} }
Containers::Array<char> AbstractImageConverter::doConvertToData(Containers::ArrayView<const ImageView1D>) { Containers::Optional<Containers::Array<char>> AbstractImageConverter::doConvertToData(Containers::ArrayView<const ImageView1D>) {
CORRADE_ASSERT_UNREACHABLE("Trade::AbstractImageConverter::convertToData(): multi-level 1D image conversion advertised but not implemented", nullptr); CORRADE_ASSERT_UNREACHABLE("Trade::AbstractImageConverter::convertToData(): multi-level 1D image conversion advertised but not implemented", {});
} }
Containers::Array<char> AbstractImageConverter::convertToData(const Containers::ArrayView<const ImageView2D> imageLevels) { #ifndef MAGNUM_BUILD_DEPRECATED
Containers::Optional<Containers::Array<char>>
#else
Implementation::ImageConverterOptionalButAlsoArray<char>
#endif
AbstractImageConverter::convertToData(const Containers::ArrayView<const ImageView2D> imageLevels) {
CORRADE_ASSERT(features() >= ImageConverterFeature::ConvertLevels2DToData, CORRADE_ASSERT(features() >= ImageConverterFeature::ConvertLevels2DToData,
"Trade::AbstractImageConverter::convertToData(): multi-level 2D image conversion not supported", nullptr); "Trade::AbstractImageConverter::convertToData(): multi-level 2D image conversion not supported", {});
#ifndef CORRADE_NO_ASSERT #ifndef CORRADE_NO_ASSERT
/* Explicitly return if checks fail for CORRADE_GRACEFUL_ASSERT builds */ /* Explicitly return if checks fail for CORRADE_GRACEFUL_ASSERT builds */
@ -534,22 +636,38 @@ Containers::Array<char> AbstractImageConverter::convertToData(const Containers::
return {}; return {};
#endif #endif
Containers::Array<char> out = doConvertToData(imageLevels); Containers::Optional<Containers::Array<char>> out = doConvertToData(imageLevels);
CORRADE_ASSERT(!out.deleter(), "Trade::AbstractImageConverter::convertToData(): implementation is not allowed to use a custom Array deleter", {}); CORRADE_ASSERT(!out || !out->deleter(), "Trade::AbstractImageConverter::convertToData(): implementation is not allowed to use a custom Array deleter", {});
/* GCC 4.8 and Clang 3.8 need an explicit conversion here */
#ifdef MAGNUM_BUILD_DEPRECATED
return Implementation::ImageConverterOptionalButAlsoArray<char>{std::move(out)};
#else
return out; return out;
#endif
} }
Containers::Array<char> AbstractImageConverter::convertToData(const std::initializer_list<ImageView2D> imageLevels) { #ifndef MAGNUM_BUILD_DEPRECATED
Containers::Optional<Containers::Array<char>>
#else
Implementation::ImageConverterOptionalButAlsoArray<char>
#endif
AbstractImageConverter::convertToData(const std::initializer_list<ImageView2D> imageLevels) {
return convertToData(Containers::arrayView(imageLevels)); return convertToData(Containers::arrayView(imageLevels));
} }
Containers::Array<char> AbstractImageConverter::doConvertToData(Containers::ArrayView<const ImageView2D>) { Containers::Optional<Containers::Array<char>> AbstractImageConverter::doConvertToData(Containers::ArrayView<const ImageView2D>) {
CORRADE_ASSERT_UNREACHABLE("Trade::AbstractImageConverter::convertToData(): multi-level 2D image conversion advertised but not implemented", nullptr); CORRADE_ASSERT_UNREACHABLE("Trade::AbstractImageConverter::convertToData(): multi-level 2D image conversion advertised but not implemented", {});
} }
Containers::Array<char> AbstractImageConverter::convertToData(const Containers::ArrayView<const ImageView3D> imageLevels) { #ifndef MAGNUM_BUILD_DEPRECATED
Containers::Optional<Containers::Array<char>>
#else
Implementation::ImageConverterOptionalButAlsoArray<char>
#endif
AbstractImageConverter::convertToData(const Containers::ArrayView<const ImageView3D> imageLevels) {
CORRADE_ASSERT(features() >= ImageConverterFeature::ConvertLevels3DToData, CORRADE_ASSERT(features() >= ImageConverterFeature::ConvertLevels3DToData,
"Trade::AbstractImageConverter::convertToData(): multi-level 3D image conversion not supported", nullptr); "Trade::AbstractImageConverter::convertToData(): multi-level 3D image conversion not supported", {});
#ifndef CORRADE_NO_ASSERT #ifndef CORRADE_NO_ASSERT
/* Explicitly return if checks fail for CORRADE_GRACEFUL_ASSERT builds */ /* Explicitly return if checks fail for CORRADE_GRACEFUL_ASSERT builds */
@ -557,22 +675,38 @@ Containers::Array<char> AbstractImageConverter::convertToData(const Containers::
return {}; return {};
#endif #endif
Containers::Array<char> out = doConvertToData(imageLevels); Containers::Optional<Containers::Array<char>> out = doConvertToData(imageLevels);
CORRADE_ASSERT(!out.deleter(), "Trade::AbstractImageConverter::convertToData(): implementation is not allowed to use a custom Array deleter", {}); CORRADE_ASSERT(!out || !out->deleter(), "Trade::AbstractImageConverter::convertToData(): implementation is not allowed to use a custom Array deleter", {});
/* GCC 4.8 and Clang 3.8 need an explicit conversion here */
#ifdef MAGNUM_BUILD_DEPRECATED
return Implementation::ImageConverterOptionalButAlsoArray<char>{std::move(out)};
#else
return out; return out;
#endif
} }
Containers::Array<char> AbstractImageConverter::convertToData(const std::initializer_list<ImageView3D> imageLevels) { #ifndef MAGNUM_BUILD_DEPRECATED
Containers::Optional<Containers::Array<char>>
#else
Implementation::ImageConverterOptionalButAlsoArray<char>
#endif
AbstractImageConverter::convertToData(const std::initializer_list<ImageView3D> imageLevels) {
return convertToData(Containers::arrayView(imageLevels)); return convertToData(Containers::arrayView(imageLevels));
} }
Containers::Array<char> AbstractImageConverter::doConvertToData(Containers::ArrayView<const ImageView3D>) { Containers::Optional<Containers::Array<char>> AbstractImageConverter::doConvertToData(Containers::ArrayView<const ImageView3D>) {
CORRADE_ASSERT_UNREACHABLE("Trade::AbstractImageConverter::convertToData(): multi-level 3D image conversion advertised but not implemented", nullptr); CORRADE_ASSERT_UNREACHABLE("Trade::AbstractImageConverter::convertToData(): multi-level 3D image conversion advertised but not implemented", {});
} }
Containers::Array<char> AbstractImageConverter::convertToData(const Containers::ArrayView<const CompressedImageView1D> imageLevels) { #ifndef MAGNUM_BUILD_DEPRECATED
Containers::Optional<Containers::Array<char>>
#else
Implementation::ImageConverterOptionalButAlsoArray<char>
#endif
AbstractImageConverter::convertToData(const Containers::ArrayView<const CompressedImageView1D> imageLevels) {
CORRADE_ASSERT(features() >= ImageConverterFeature::ConvertCompressedLevels1DToData, CORRADE_ASSERT(features() >= ImageConverterFeature::ConvertCompressedLevels1DToData,
"Trade::AbstractImageConverter::convertToData(): multi-level compressed 1D image conversion not supported", nullptr); "Trade::AbstractImageConverter::convertToData(): multi-level compressed 1D image conversion not supported", {});
#ifndef CORRADE_NO_ASSERT #ifndef CORRADE_NO_ASSERT
/* Explicitly return if checks fail for CORRADE_GRACEFUL_ASSERT builds */ /* Explicitly return if checks fail for CORRADE_GRACEFUL_ASSERT builds */
@ -580,22 +714,38 @@ Containers::Array<char> AbstractImageConverter::convertToData(const Containers::
return {}; return {};
#endif #endif
Containers::Array<char> out = doConvertToData(imageLevels); Containers::Optional<Containers::Array<char>> out = doConvertToData(imageLevels);
CORRADE_ASSERT(!out.deleter(), "Trade::AbstractImageConverter::convertToData(): implementation is not allowed to use a custom Array deleter", {}); CORRADE_ASSERT(!out || !out->deleter(), "Trade::AbstractImageConverter::convertToData(): implementation is not allowed to use a custom Array deleter", {});
/* GCC 4.8 and Clang 3.8 need an explicit conversion here */
#ifdef MAGNUM_BUILD_DEPRECATED
return Implementation::ImageConverterOptionalButAlsoArray<char>{std::move(out)};
#else
return out; return out;
#endif
} }
Containers::Array<char> AbstractImageConverter::convertToData(const std::initializer_list<CompressedImageView1D> imageLevels) { #ifndef MAGNUM_BUILD_DEPRECATED
Containers::Optional<Containers::Array<char>>
#else
Implementation::ImageConverterOptionalButAlsoArray<char>
#endif
AbstractImageConverter::convertToData(const std::initializer_list<CompressedImageView1D> imageLevels) {
return convertToData(Containers::arrayView(imageLevels)); return convertToData(Containers::arrayView(imageLevels));
} }
Containers::Array<char> AbstractImageConverter::doConvertToData(Containers::ArrayView<const CompressedImageView1D>) { Containers::Optional<Containers::Array<char>> AbstractImageConverter::doConvertToData(Containers::ArrayView<const CompressedImageView1D>) {
CORRADE_ASSERT_UNREACHABLE("Trade::AbstractImageConverter::convertToData(): multi-level compressed 1D image conversion advertised but not implemented", nullptr); CORRADE_ASSERT_UNREACHABLE("Trade::AbstractImageConverter::convertToData(): multi-level compressed 1D image conversion advertised but not implemented", {});
} }
Containers::Array<char> AbstractImageConverter::convertToData(const Containers::ArrayView<const CompressedImageView2D> imageLevels) { #ifndef MAGNUM_BUILD_DEPRECATED
Containers::Optional<Containers::Array<char>>
#else
Implementation::ImageConverterOptionalButAlsoArray<char>
#endif
AbstractImageConverter::convertToData(const Containers::ArrayView<const CompressedImageView2D> imageLevels) {
CORRADE_ASSERT(features() >= ImageConverterFeature::ConvertCompressedLevels2DToData, CORRADE_ASSERT(features() >= ImageConverterFeature::ConvertCompressedLevels2DToData,
"Trade::AbstractImageConverter::convertToData(): multi-level compressed 2D image conversion not supported", nullptr); "Trade::AbstractImageConverter::convertToData(): multi-level compressed 2D image conversion not supported", {});
#ifndef CORRADE_NO_ASSERT #ifndef CORRADE_NO_ASSERT
/* Explicitly return if checks fail for CORRADE_GRACEFUL_ASSERT builds */ /* Explicitly return if checks fail for CORRADE_GRACEFUL_ASSERT builds */
@ -603,22 +753,38 @@ Containers::Array<char> AbstractImageConverter::convertToData(const Containers::
return {}; return {};
#endif #endif
Containers::Array<char> out = doConvertToData(imageLevels); Containers::Optional<Containers::Array<char>> out = doConvertToData(imageLevels);
CORRADE_ASSERT(!out.deleter(), "Trade::AbstractImageConverter::convertToData(): implementation is not allowed to use a custom Array deleter", {}); CORRADE_ASSERT(!out || !out->deleter(), "Trade::AbstractImageConverter::convertToData(): implementation is not allowed to use a custom Array deleter", {});
/* GCC 4.8 and Clang 3.8 need an explicit conversion here */
#ifdef MAGNUM_BUILD_DEPRECATED
return Implementation::ImageConverterOptionalButAlsoArray<char>{std::move(out)};
#else
return out; return out;
#endif
} }
Containers::Array<char> AbstractImageConverter::convertToData(const std::initializer_list<CompressedImageView2D> imageLevels) { #ifndef MAGNUM_BUILD_DEPRECATED
Containers::Optional<Containers::Array<char>>
#else
Implementation::ImageConverterOptionalButAlsoArray<char>
#endif
AbstractImageConverter::convertToData(const std::initializer_list<CompressedImageView2D> imageLevels) {
return convertToData(Containers::arrayView(imageLevels)); return convertToData(Containers::arrayView(imageLevels));
} }
Containers::Array<char> AbstractImageConverter::doConvertToData(Containers::ArrayView<const CompressedImageView2D>) { Containers::Optional<Containers::Array<char>> AbstractImageConverter::doConvertToData(Containers::ArrayView<const CompressedImageView2D>) {
CORRADE_ASSERT_UNREACHABLE("Trade::AbstractImageConverter::convertToData(): multi-level compressed 2D image conversion advertised but not implemented", nullptr); CORRADE_ASSERT_UNREACHABLE("Trade::AbstractImageConverter::convertToData(): multi-level compressed 2D image conversion advertised but not implemented", {});
} }
Containers::Array<char> AbstractImageConverter::convertToData(const Containers::ArrayView<const CompressedImageView3D> imageLevels) { #ifndef MAGNUM_BUILD_DEPRECATED
Containers::Optional<Containers::Array<char>>
#else
Implementation::ImageConverterOptionalButAlsoArray<char>
#endif
AbstractImageConverter::convertToData(const Containers::ArrayView<const CompressedImageView3D> imageLevels) {
CORRADE_ASSERT(features() >= ImageConverterFeature::ConvertCompressedLevels3DToData, CORRADE_ASSERT(features() >= ImageConverterFeature::ConvertCompressedLevels3DToData,
"Trade::AbstractImageConverter::convertToData(): multi-level compressed 3D image conversion not supported", nullptr); "Trade::AbstractImageConverter::convertToData(): multi-level compressed 3D image conversion not supported", {});
#ifndef CORRADE_NO_ASSERT #ifndef CORRADE_NO_ASSERT
/* Explicitly return if checks fail for CORRADE_GRACEFUL_ASSERT builds */ /* Explicitly return if checks fail for CORRADE_GRACEFUL_ASSERT builds */
@ -626,17 +792,28 @@ Containers::Array<char> AbstractImageConverter::convertToData(const Containers::
return {}; return {};
#endif #endif
Containers::Array<char> out = doConvertToData(imageLevels); Containers::Optional<Containers::Array<char>> out = doConvertToData(imageLevels);
CORRADE_ASSERT(!out.deleter(), "Trade::AbstractImageConverter::convertToData(): implementation is not allowed to use a custom Array deleter", {}); CORRADE_ASSERT(!out || !out->deleter(), "Trade::AbstractImageConverter::convertToData(): implementation is not allowed to use a custom Array deleter", {});
/* GCC 4.8 and Clang 3.8 need an explicit conversion here */
#ifdef MAGNUM_BUILD_DEPRECATED
return Implementation::ImageConverterOptionalButAlsoArray<char>{std::move(out)};
#else
return out; return out;
#endif
} }
Containers::Array<char> AbstractImageConverter::convertToData(const std::initializer_list<CompressedImageView3D> imageLevels) { #ifndef MAGNUM_BUILD_DEPRECATED
Containers::Optional<Containers::Array<char>>
#else
Implementation::ImageConverterOptionalButAlsoArray<char>
#endif
AbstractImageConverter::convertToData(const std::initializer_list<CompressedImageView3D> imageLevels) {
return convertToData(Containers::arrayView(imageLevels)); return convertToData(Containers::arrayView(imageLevels));
} }
Containers::Array<char> AbstractImageConverter::doConvertToData(Containers::ArrayView<const CompressedImageView3D>) { Containers::Optional<Containers::Array<char>> AbstractImageConverter::doConvertToData(Containers::ArrayView<const CompressedImageView3D>) {
CORRADE_ASSERT_UNREACHABLE("Trade::AbstractImageConverter::convertToData(): multi-level compressed 3D image conversion advertised but not implemented", nullptr); CORRADE_ASSERT_UNREACHABLE("Trade::AbstractImageConverter::convertToData(): multi-level compressed 3D image conversion advertised but not implemented", {});
} }
bool AbstractImageConverter::convertToFile(const ImageView1D& image, const Containers::StringView filename) { bool AbstractImageConverter::convertToFile(const ImageView1D& image, const Containers::StringView filename) {
@ -661,11 +838,11 @@ bool AbstractImageConverter::doConvertToFile(const ImageView1D& image, const Con
CORRADE_ASSERT(features() >= ImageConverterFeature::Convert1DToData, "Trade::AbstractImageConverter::convertToFile(): 1D image conversion advertised but not implemented", false); CORRADE_ASSERT(features() >= ImageConverterFeature::Convert1DToData, "Trade::AbstractImageConverter::convertToFile(): 1D image conversion advertised but not implemented", false);
const auto data = doConvertToData(image); const Containers::Optional<Containers::Array<char>> data = doConvertToData(image);
/* No deleter checks as it doesn't matter here */ /* No deleter checks as it doesn't matter here */
if(!data) return false; if(!data) return false;
if(!Utility::Path::write(filename, data)) { if(!Utility::Path::write(filename, *data)) {
Error() << "Trade::AbstractImageConverter::convertToFile(): cannot write to file" << filename; Error() << "Trade::AbstractImageConverter::convertToFile(): cannot write to file" << filename;
return false; return false;
} }
@ -695,11 +872,11 @@ bool AbstractImageConverter::doConvertToFile(const ImageView2D& image, const Con
CORRADE_ASSERT(features() >= ImageConverterFeature::Convert2DToData, "Trade::AbstractImageConverter::convertToFile(): 2D image conversion advertised but not implemented", false); CORRADE_ASSERT(features() >= ImageConverterFeature::Convert2DToData, "Trade::AbstractImageConverter::convertToFile(): 2D image conversion advertised but not implemented", false);
const auto data = doConvertToData(image); const Containers::Optional<Containers::Array<char>> data = doConvertToData(image);
/* No deleter checks as it doesn't matter here */ /* No deleter checks as it doesn't matter here */
if(!data) return false; if(!data) return false;
if(!Utility::Path::write(filename, data)) { if(!Utility::Path::write(filename, *data)) {
Error() << "Trade::AbstractImageConverter::convertToFile(): cannot write to file" << filename; Error() << "Trade::AbstractImageConverter::convertToFile(): cannot write to file" << filename;
return false; return false;
} }
@ -735,11 +912,11 @@ bool AbstractImageConverter::doConvertToFile(const ImageView3D& image, const Con
CORRADE_ASSERT(features() >= ImageConverterFeature::Convert3DToData, "Trade::AbstractImageConverter::convertToFile(): 3D image conversion advertised but not implemented", false); CORRADE_ASSERT(features() >= ImageConverterFeature::Convert3DToData, "Trade::AbstractImageConverter::convertToFile(): 3D image conversion advertised but not implemented", false);
const auto data = doConvertToData(image); const Containers::Optional<Containers::Array<char>> data = doConvertToData(image);
/* No deleter checks as it doesn't matter here */ /* No deleter checks as it doesn't matter here */
if(!data) return false; if(!data) return false;
if(!Utility::Path::write(filename, data)) { if(!Utility::Path::write(filename, *data)) {
Error() << "Trade::AbstractImageConverter::convertToFile(): cannot write to file" << filename; Error() << "Trade::AbstractImageConverter::convertToFile(): cannot write to file" << filename;
return false; return false;
} }
@ -769,11 +946,11 @@ bool AbstractImageConverter::doConvertToFile(const CompressedImageView1D& image,
CORRADE_ASSERT(features() >= ImageConverterFeature::ConvertCompressed1DToData, "Trade::AbstractImageConverter::convertToFile(): compressed 1D image conversion advertised but not implemented", false); CORRADE_ASSERT(features() >= ImageConverterFeature::ConvertCompressed1DToData, "Trade::AbstractImageConverter::convertToFile(): compressed 1D image conversion advertised but not implemented", false);
const auto data = doConvertToData(image); const Containers::Optional<Containers::Array<char>> data = doConvertToData(image);
/* No deleter checks as it doesn't matter here */ /* No deleter checks as it doesn't matter here */
if(!data) return false; if(!data) return false;
if(!Utility::Path::write(filename, data)) { if(!Utility::Path::write(filename, *data)) {
Error() << "Trade::AbstractImageConverter::convertToFile(): cannot write to file" << filename; Error() << "Trade::AbstractImageConverter::convertToFile(): cannot write to file" << filename;
return false; return false;
} }
@ -803,11 +980,11 @@ bool AbstractImageConverter::doConvertToFile(const CompressedImageView2D& image,
CORRADE_ASSERT(features() >= ImageConverterFeature::ConvertCompressed2DToData, "Trade::AbstractImageConverter::convertToFile(): compressed 2D image conversion advertised but not implemented", false); CORRADE_ASSERT(features() >= ImageConverterFeature::ConvertCompressed2DToData, "Trade::AbstractImageConverter::convertToFile(): compressed 2D image conversion advertised but not implemented", false);
const auto data = doConvertToData(image); const Containers::Optional<Containers::Array<char>> data = doConvertToData(image);
/* No deleter checks as it doesn't matter here */ /* No deleter checks as it doesn't matter here */
if(!data) return false; if(!data) return false;
if(!Utility::Path::write(filename, data)) { if(!Utility::Path::write(filename, *data)) {
Error() << "Trade::AbstractImageConverter::convertToFile(): cannot write to file" << filename; Error() << "Trade::AbstractImageConverter::convertToFile(): cannot write to file" << filename;
return false; return false;
} }
@ -843,11 +1020,11 @@ bool AbstractImageConverter::doConvertToFile(const CompressedImageView3D& image,
CORRADE_ASSERT(features() >= ImageConverterFeature::ConvertCompressed3DToData, "Trade::AbstractImageConverter::convertToFile(): compressed 3D image conversion advertised but not implemented", false); CORRADE_ASSERT(features() >= ImageConverterFeature::ConvertCompressed3DToData, "Trade::AbstractImageConverter::convertToFile(): compressed 3D image conversion advertised but not implemented", false);
const auto data = doConvertToData(image); const Containers::Optional<Containers::Array<char>> data = doConvertToData(image);
/* No deleter checks as it doesn't matter here */ /* No deleter checks as it doesn't matter here */
if(!data) return false; if(!data) return false;
if(!Utility::Path::write(filename, data)) { if(!Utility::Path::write(filename, *data)) {
Error() << "Trade::AbstractImageConverter::convertToFile(): cannot write to file" << filename; Error() << "Trade::AbstractImageConverter::convertToFile(): cannot write to file" << filename;
return false; return false;
} }
@ -893,11 +1070,11 @@ bool AbstractImageConverter::convertToFile(const std::initializer_list<ImageView
bool AbstractImageConverter::doConvertToFile(const Containers::ArrayView<const ImageView1D> imageLevels, const Containers::StringView filename) { bool AbstractImageConverter::doConvertToFile(const Containers::ArrayView<const ImageView1D> imageLevels, const Containers::StringView filename) {
CORRADE_ASSERT(features() >= ImageConverterFeature::ConvertLevels1DToData, "Trade::AbstractImageConverter::convertToFile(): multi-level 1D image conversion advertised but not implemented", false); CORRADE_ASSERT(features() >= ImageConverterFeature::ConvertLevels1DToData, "Trade::AbstractImageConverter::convertToFile(): multi-level 1D image conversion advertised but not implemented", false);
const auto data = doConvertToData(imageLevels); const Containers::Optional<Containers::Array<char>> data = doConvertToData(imageLevels);
/* No deleter checks as it doesn't matter here */ /* No deleter checks as it doesn't matter here */
if(!data) return false; if(!data) return false;
if(!Utility::Path::write(filename, data)) { if(!Utility::Path::write(filename, *data)) {
Error() << "Trade::AbstractImageConverter::convertToFile(): cannot write to file" << filename; Error() << "Trade::AbstractImageConverter::convertToFile(): cannot write to file" << filename;
return false; return false;
} }
@ -925,11 +1102,11 @@ bool AbstractImageConverter::convertToFile(const std::initializer_list<ImageView
bool AbstractImageConverter::doConvertToFile(const Containers::ArrayView<const ImageView2D> imageLevels, const Containers::StringView filename) { bool AbstractImageConverter::doConvertToFile(const Containers::ArrayView<const ImageView2D> imageLevels, const Containers::StringView filename) {
CORRADE_ASSERT(features() >= ImageConverterFeature::ConvertLevels2DToData, "Trade::AbstractImageConverter::convertToFile(): multi-level 2D image conversion advertised but not implemented", false); CORRADE_ASSERT(features() >= ImageConverterFeature::ConvertLevels2DToData, "Trade::AbstractImageConverter::convertToFile(): multi-level 2D image conversion advertised but not implemented", false);
const auto data = doConvertToData(imageLevels); const Containers::Optional<Containers::Array<char>> data = doConvertToData(imageLevels);
/* No deleter checks as it doesn't matter here */ /* No deleter checks as it doesn't matter here */
if(!data) return false; if(!data) return false;
if(!Utility::Path::write(filename, data)) { if(!Utility::Path::write(filename, *data)) {
Error() << "Trade::AbstractImageConverter::convertToFile(): cannot write to file" << filename; Error() << "Trade::AbstractImageConverter::convertToFile(): cannot write to file" << filename;
return false; return false;
} }
@ -957,11 +1134,11 @@ bool AbstractImageConverter::convertToFile(const std::initializer_list<ImageView
bool AbstractImageConverter::doConvertToFile(const Containers::ArrayView<const ImageView3D> imageLevels, const Containers::StringView filename) { bool AbstractImageConverter::doConvertToFile(const Containers::ArrayView<const ImageView3D> imageLevels, const Containers::StringView filename) {
CORRADE_ASSERT(features() >= ImageConverterFeature::ConvertLevels3DToData, "Trade::AbstractImageConverter::convertToFile(): multi-level 3D image conversion advertised but not implemented", false); CORRADE_ASSERT(features() >= ImageConverterFeature::ConvertLevels3DToData, "Trade::AbstractImageConverter::convertToFile(): multi-level 3D image conversion advertised but not implemented", false);
const auto data = doConvertToData(imageLevels); const Containers::Optional<Containers::Array<char>> data = doConvertToData(imageLevels);
/* No deleter checks as it doesn't matter here */ /* No deleter checks as it doesn't matter here */
if(!data) return false; if(!data) return false;
if(!Utility::Path::write(filename, data)) { if(!Utility::Path::write(filename, *data)) {
Error() << "Trade::AbstractImageConverter::convertToFile(): cannot write to file" << filename; Error() << "Trade::AbstractImageConverter::convertToFile(): cannot write to file" << filename;
return false; return false;
} }
@ -989,11 +1166,11 @@ bool AbstractImageConverter::convertToFile(const std::initializer_list<Compresse
bool AbstractImageConverter::doConvertToFile(const Containers::ArrayView<const CompressedImageView1D> imageLevels, Containers::StringView filename) { bool AbstractImageConverter::doConvertToFile(const Containers::ArrayView<const CompressedImageView1D> imageLevels, Containers::StringView filename) {
CORRADE_ASSERT(features() >= ImageConverterFeature::ConvertCompressedLevels1DToData, "Trade::AbstractImageConverter::convertToFile(): multi-level compressed 1D image conversion advertised but not implemented", false); CORRADE_ASSERT(features() >= ImageConverterFeature::ConvertCompressedLevels1DToData, "Trade::AbstractImageConverter::convertToFile(): multi-level compressed 1D image conversion advertised but not implemented", false);
const auto data = doConvertToData(imageLevels); const Containers::Optional<Containers::Array<char>> data = doConvertToData(imageLevels);
/* No deleter checks as it doesn't matter here */ /* No deleter checks as it doesn't matter here */
if(!data) return false; if(!data) return false;
if(!Utility::Path::write(filename, data)) { if(!Utility::Path::write(filename, *data)) {
Error() << "Trade::AbstractImageConverter::convertToFile(): cannot write to file" << filename; Error() << "Trade::AbstractImageConverter::convertToFile(): cannot write to file" << filename;
return false; return false;
} }
@ -1021,11 +1198,11 @@ bool AbstractImageConverter::convertToFile(const std::initializer_list<Compresse
bool AbstractImageConverter::doConvertToFile(const Containers::ArrayView<const CompressedImageView2D> imageLevels, Containers::StringView filename) { bool AbstractImageConverter::doConvertToFile(const Containers::ArrayView<const CompressedImageView2D> imageLevels, Containers::StringView filename) {
CORRADE_ASSERT(features() >= ImageConverterFeature::ConvertCompressedLevels2DToData, "Trade::AbstractImageConverter::convertToFile(): multi-level compressed 2D image conversion advertised but not implemented", false); CORRADE_ASSERT(features() >= ImageConverterFeature::ConvertCompressedLevels2DToData, "Trade::AbstractImageConverter::convertToFile(): multi-level compressed 2D image conversion advertised but not implemented", false);
const auto data = doConvertToData(imageLevels); const Containers::Optional<Containers::Array<char>> data = doConvertToData(imageLevels);
/* No deleter checks as it doesn't matter here */ /* No deleter checks as it doesn't matter here */
if(!data) return false; if(!data) return false;
if(!Utility::Path::write(filename, data)) { if(!Utility::Path::write(filename, *data)) {
Error() << "Trade::AbstractImageConverter::convertToFile(): cannot write to file" << filename; Error() << "Trade::AbstractImageConverter::convertToFile(): cannot write to file" << filename;
return false; return false;
} }
@ -1053,11 +1230,11 @@ bool AbstractImageConverter::convertToFile(const std::initializer_list<Compresse
bool AbstractImageConverter::doConvertToFile(const Containers::ArrayView<const CompressedImageView3D> imageLevels, Containers::StringView filename) { bool AbstractImageConverter::doConvertToFile(const Containers::ArrayView<const CompressedImageView3D> imageLevels, Containers::StringView filename) {
CORRADE_ASSERT(features() >= ImageConverterFeature::ConvertCompressedLevels3DToData, "Trade::AbstractImageConverter::convertToFile(): multi-level compressed 3D image conversion advertised but not implemented", false); CORRADE_ASSERT(features() >= ImageConverterFeature::ConvertCompressedLevels3DToData, "Trade::AbstractImageConverter::convertToFile(): multi-level compressed 3D image conversion advertised but not implemented", false);
const auto data = doConvertToData(imageLevels); const Containers::Optional<Containers::Array<char>> data = doConvertToData(imageLevels);
/* No deleter checks as it doesn't matter here */ /* No deleter checks as it doesn't matter here */
if(!data) return false; if(!data) return false;
if(!Utility::Path::write(filename, data)) { if(!Utility::Path::write(filename, *data)) {
Error() << "Trade::AbstractImageConverter::convertToFile(): cannot write to file" << filename; Error() << "Trade::AbstractImageConverter::convertToFile(): cannot write to file" << filename;
return false; return false;
} }

217
src/Magnum/Trade/AbstractImageConverter.h

@ -36,6 +36,9 @@
#include "Magnum/Trade/visibility.h" #include "Magnum/Trade/visibility.h"
#ifdef MAGNUM_BUILD_DEPRECATED #ifdef MAGNUM_BUILD_DEPRECATED
/* For *ToData() APIs that used to return just an Array before */
#include <Corrade/Containers/Optional.h>
/* So deprecated APIs taking a std::string don't fail to compile */ /* So deprecated APIs taking a std::string don't fail to compile */
/** @todo remove once they are gone */ /** @todo remove once they are gone */
#include <Corrade/Utility/StlForwardString.h> #include <Corrade/Utility/StlForwardString.h>
@ -405,6 +408,23 @@ MAGNUM_TRADE_EXPORT Debug& operator<<(Debug& debug, ImageConverterFlag value);
*/ */
MAGNUM_TRADE_EXPORT Debug& operator<<(Debug& debug, ImageConverterFlags value); MAGNUM_TRADE_EXPORT Debug& operator<<(Debug& debug, ImageConverterFlags value);
#ifdef MAGNUM_BUILD_DEPRECATED
namespace Implementation {
/* Could be a concrete type as it's always only char, but that would mean
I'd need to include Optional and Array here. It's named like this
because AbstractSceneConverter and ShaderTools::AbstractConverter each
have its own and introducing a common header containing just deprecated
functionality seems silly. */
template<class T> struct ImageConverterOptionalButAlsoArray: Containers::Optional<Containers::Array<T>> {
/*implicit*/ ImageConverterOptionalButAlsoArray() = default;
/*implicit*/ ImageConverterOptionalButAlsoArray(Containers::Optional<Containers::Array<T>>&& optional): Containers::Optional<Containers::Array<T>>{std::move(optional)} {}
CORRADE_DEPRECATED("use Containers::Optional<Containers::Array<T>> instead") /*implicit*/ operator Containers::Array<T>() && {
return *this ? Containers::Array<T>{std::move(**this)} : nullptr;
}
};
}
#endif
/** /**
@brief Base for image converter plugins @brief Base for image converter plugins
@ -864,12 +884,17 @@ class MAGNUM_TRADE_EXPORT AbstractImageConverter: public PluginManager::Abstract
* @ref ImageConverterFeature::ConvertLevels1DToData is supported. The * @ref ImageConverterFeature::ConvertLevels1DToData is supported. The
* image view is expected to not be @cpp nullptr @ce and to have a * image view is expected to not be @cpp nullptr @ce and to have a
* non-zero size. On failure prints a message to * non-zero size. On failure prints a message to
* @relativeref{Magnum,Error} and returns @cpp nullptr @ce. * @relativeref{Magnum,Error} and returns @ref Containers::NullOpt.
* @see @ref features(), @ref convertToData(const CompressedImageView1D&), * @see @ref features(), @ref convertToData(const CompressedImageView1D&),
* @ref convertToData(const ImageData1D&), @ref convert(), * @ref convertToData(const ImageData1D&), @ref convert(),
* @ref convertToFile() * @ref convertToFile()
*/ */
Containers::Array<char> convertToData(const ImageView1D& image); #if !defined(MAGNUM_BUILD_DEPRECATED) || defined(DOXYGEN_GENERATING_OUTPUT)
Containers::Optional<Containers::Array<char>>
#else
Implementation::ImageConverterOptionalButAlsoArray<char>
#endif
convertToData(const ImageView1D& image);
/** /**
* @brief Convert a 2D image to a raw data * @brief Convert a 2D image to a raw data
@ -879,12 +904,17 @@ class MAGNUM_TRADE_EXPORT AbstractImageConverter: public PluginManager::Abstract
* @ref ImageConverterFeature::ConvertLevels2DToData is supported. The * @ref ImageConverterFeature::ConvertLevels2DToData is supported. The
* image view is expected to not be @cpp nullptr @ce and to have a * image view is expected to not be @cpp nullptr @ce and to have a
* non-zero size in all dimensions. On failure prints a message to * non-zero size in all dimensions. On failure prints a message to
* @relativeref{Magnum,Error} and returns @cpp nullptr @ce. * @relativeref{Magnum,Error} and returns @ref Containers::NullOpt.
* @see @ref features(), @ref convertToData(const CompressedImageView2D&), * @see @ref features(), @ref convertToData(const CompressedImageView2D&),
* @ref convertToData(const ImageData2D&), @ref convert(), * @ref convertToData(const ImageData2D&), @ref convert(),
* @ref convertToFile() * @ref convertToFile()
*/ */
Containers::Array<char> convertToData(const ImageView2D& image); #if !defined(MAGNUM_BUILD_DEPRECATED) || defined(DOXYGEN_GENERATING_OUTPUT)
Containers::Optional<Containers::Array<char>>
#else
Implementation::ImageConverterOptionalButAlsoArray<char>
#endif
convertToData(const ImageView2D& image);
#ifdef MAGNUM_BUILD_DEPRECATED #ifdef MAGNUM_BUILD_DEPRECATED
/** /**
@ -903,12 +933,17 @@ class MAGNUM_TRADE_EXPORT AbstractImageConverter: public PluginManager::Abstract
* @ref ImageConverterFeature::ConvertLevels3DToData is supported. The * @ref ImageConverterFeature::ConvertLevels3DToData is supported. The
* image view is expected to not be @cpp nullptr @ce and to have a * image view is expected to not be @cpp nullptr @ce and to have a
* non-zero size in all dimensions. On failure prints a message to * non-zero size in all dimensions. On failure prints a message to
* @relativeref{Magnum,Error} and returns @cpp nullptr @ce. * @relativeref{Magnum,Error} and returns @ref Containers::NullOpt.
* @see @ref features(), @ref convertToData(const CompressedImageView3D&), * @see @ref features(), @ref convertToData(const CompressedImageView3D&),
* @ref convertToData(const ImageData3D&), @ref convert(), * @ref convertToData(const ImageData3D&), @ref convert(),
* @ref convertToFile() * @ref convertToFile()
*/ */
Containers::Array<char> convertToData(const ImageView3D& image); #if !defined(MAGNUM_BUILD_DEPRECATED) || defined(DOXYGEN_GENERATING_OUTPUT)
Containers::Optional<Containers::Array<char>>
#else
Implementation::ImageConverterOptionalButAlsoArray<char>
#endif
convertToData(const ImageView3D& image);
/** /**
* @brief Convert a compressed 1D image to a raw data * @brief Convert a compressed 1D image to a raw data
@ -918,12 +953,17 @@ class MAGNUM_TRADE_EXPORT AbstractImageConverter: public PluginManager::Abstract
* or @ref ImageConverterFeature::ConvertCompressedLevels1DToData is * or @ref ImageConverterFeature::ConvertCompressedLevels1DToData is
* supported. The image view is expected to not be @cpp nullptr @ce and * supported. The image view is expected to not be @cpp nullptr @ce and
* to have a non-zero size. On failure prints a message to * to have a non-zero size. On failure prints a message to
* @relativeref{Magnum,Error} and returns @cpp nullptr @ce. * @relativeref{Magnum,Error} and returns @ref Containers::NullOpt.
* @see @ref features(), @ref convertToData(const ImageView1D&), * @see @ref features(), @ref convertToData(const ImageView1D&),
* @ref convertToData(const ImageData1D&), @ref convert(), * @ref convertToData(const ImageData1D&), @ref convert(),
* @ref convertToFile() * @ref convertToFile()
*/ */
Containers::Array<char> convertToData(const CompressedImageView1D& image); #if !defined(MAGNUM_BUILD_DEPRECATED) || defined(DOXYGEN_GENERATING_OUTPUT)
Containers::Optional<Containers::Array<char>>
#else
Implementation::ImageConverterOptionalButAlsoArray<char>
#endif
convertToData(const CompressedImageView1D& image);
/** /**
* @brief Convert a compressed 2D image to a raw data * @brief Convert a compressed 2D image to a raw data
@ -933,12 +973,18 @@ class MAGNUM_TRADE_EXPORT AbstractImageConverter: public PluginManager::Abstract
* or @ref ImageConverterFeature::ConvertCompressedLevels2DToData is * or @ref ImageConverterFeature::ConvertCompressedLevels2DToData is
* supported. The image view is expected to not be @cpp nullptr @ce and * supported. The image view is expected to not be @cpp nullptr @ce and
* to have a non-zero size in all dimensions. On failure prints a * to have a non-zero size in all dimensions. On failure prints a
* message to @relativeref{Magnum,Error} and returns @cpp nullptr @ce. * message to @relativeref{Magnum,Error} and returns
* @ref Containers::NullOpt.
* @see @ref features(), @ref convertToData(const ImageView2D&), * @see @ref features(), @ref convertToData(const ImageView2D&),
* @ref convertToData(const ImageData2D&), @ref convert(), * @ref convertToData(const ImageData2D&), @ref convert(),
* @ref convertToFile() * @ref convertToFile()
*/ */
Containers::Array<char> convertToData(const CompressedImageView2D& image); #if !defined(MAGNUM_BUILD_DEPRECATED) || defined(DOXYGEN_GENERATING_OUTPUT)
Containers::Optional<Containers::Array<char>>
#else
Implementation::ImageConverterOptionalButAlsoArray<char>
#endif
convertToData(const CompressedImageView2D& image);
#ifdef MAGNUM_BUILD_DEPRECATED #ifdef MAGNUM_BUILD_DEPRECATED
/** /**
@ -957,12 +1003,18 @@ class MAGNUM_TRADE_EXPORT AbstractImageConverter: public PluginManager::Abstract
* or @ref ImageConverterFeature::ConvertCompressedLevels3DToData is * or @ref ImageConverterFeature::ConvertCompressedLevels3DToData is
* supported. The image view is expected to not be @cpp nullptr @ce and * supported. The image view is expected to not be @cpp nullptr @ce and
* to have a non-zero size in all dimensions. On failure prints a * to have a non-zero size in all dimensions. On failure prints a
* message to @relativeref{Magnum,Error} and returns @cpp nullptr @ce. * message to @relativeref{Magnum,Error} and returns
* @ref Containers::NullOpt.
* @see @ref features(), @ref convertToData(const ImageView3D&), * @see @ref features(), @ref convertToData(const ImageView3D&),
* @ref convertToData(const ImageData3D&), @ref convert(), * @ref convertToData(const ImageData3D&), @ref convert(),
* @ref convertToFile() * @ref convertToFile()
*/ */
Containers::Array<char> convertToData(const CompressedImageView3D& image); #if !defined(MAGNUM_BUILD_DEPRECATED) || defined(DOXYGEN_GENERATING_OUTPUT)
Containers::Optional<Containers::Array<char>>
#else
Implementation::ImageConverterOptionalButAlsoArray<char>
#endif
convertToData(const CompressedImageView3D& image);
/** /**
* @brief Convert a 1D image data to a raw data * @brief Convert a 1D image data to a raw data
@ -974,7 +1026,12 @@ class MAGNUM_TRADE_EXPORT AbstractImageConverter: public PluginManager::Abstract
* of these two functions for details. * of these two functions for details.
* @see @ref ImageData::isCompressed() * @see @ref ImageData::isCompressed()
*/ */
Containers::Array<char> convertToData(const ImageData1D& image); #if !defined(MAGNUM_BUILD_DEPRECATED) || defined(DOXYGEN_GENERATING_OUTPUT)
Containers::Optional<Containers::Array<char>>
#else
Implementation::ImageConverterOptionalButAlsoArray<char>
#endif
convertToData(const ImageData1D& image);
/** /**
* @brief Convert a 2D image data to a raw data * @brief Convert a 2D image data to a raw data
@ -986,7 +1043,12 @@ class MAGNUM_TRADE_EXPORT AbstractImageConverter: public PluginManager::Abstract
* of these two functions for details. * of these two functions for details.
* @see @ref ImageData::isCompressed() * @see @ref ImageData::isCompressed()
*/ */
Containers::Array<char> convertToData(const ImageData2D& image); #if !defined(MAGNUM_BUILD_DEPRECATED) || defined(DOXYGEN_GENERATING_OUTPUT)
Containers::Optional<Containers::Array<char>>
#else
Implementation::ImageConverterOptionalButAlsoArray<char>
#endif
convertToData(const ImageData2D& image);
#ifdef MAGNUM_BUILD_DEPRECATED #ifdef MAGNUM_BUILD_DEPRECATED
/** /**
@ -1007,7 +1069,12 @@ class MAGNUM_TRADE_EXPORT AbstractImageConverter: public PluginManager::Abstract
* of these two functions for details. * of these two functions for details.
* @see @ref ImageData::isCompressed() * @see @ref ImageData::isCompressed()
*/ */
Containers::Array<char> convertToData(const ImageData3D& image); #if !defined(MAGNUM_BUILD_DEPRECATED) || defined(DOXYGEN_GENERATING_OUTPUT)
Containers::Optional<Containers::Array<char>>
#else
Implementation::ImageConverterOptionalButAlsoArray<char>
#endif
convertToData(const ImageData3D& image);
/** /**
* @brief Convert a set of 1D image levels to a raw data * @brief Convert a set of 1D image levels to a raw data
@ -1020,13 +1087,23 @@ class MAGNUM_TRADE_EXPORT AbstractImageConverter: public PluginManager::Abstract
* that certain converters may impose additional size and order * that certain converters may impose additional size and order
* restrictions on the images, see documentation of a particular plugin * restrictions on the images, see documentation of a particular plugin
* for more information. On failure prints a message to * for more information. On failure prints a message to
* @relativeref{Magnum,Error} and returns @cpp nullptr @ce. * @relativeref{Magnum,Error} and returns @ref Containers::NullOpt.
* @see @ref features(), @ref convertToData(Containers::ArrayView<const CompressedImageView1D>), * @see @ref features(), @ref convertToData(Containers::ArrayView<const CompressedImageView1D>),
* @ref convert(), @ref convertToFile() * @ref convert(), @ref convertToFile()
*/ */
Containers::Array<char> convertToData(Containers::ArrayView<const ImageView1D> imageLevels); #if !defined(MAGNUM_BUILD_DEPRECATED) || defined(DOXYGEN_GENERATING_OUTPUT)
Containers::Optional<Containers::Array<char>>
#else
Implementation::ImageConverterOptionalButAlsoArray<char>
#endif
convertToData(Containers::ArrayView<const ImageView1D> imageLevels);
/** @overload */ /** @overload */
Containers::Array<char> convertToData(std::initializer_list<ImageView1D> imageLevels); #if !defined(MAGNUM_BUILD_DEPRECATED) || defined(DOXYGEN_GENERATING_OUTPUT)
Containers::Optional<Containers::Array<char>>
#else
Implementation::ImageConverterOptionalButAlsoArray<char>
#endif
convertToData(std::initializer_list<ImageView1D> imageLevels);
/** /**
* @brief Convert a set of 2D image levels to a raw data * @brief Convert a set of 2D image levels to a raw data
@ -1039,13 +1116,23 @@ class MAGNUM_TRADE_EXPORT AbstractImageConverter: public PluginManager::Abstract
* pixel format. Note that certain converters may impose additional * pixel format. Note that certain converters may impose additional
* size and order restrictions on the images, see documentation of a * size and order restrictions on the images, see documentation of a
* particular plugin for more information. On failure prints a message * particular plugin for more information. On failure prints a message
* to @relativeref{Magnum,Error} and returns @cpp nullptr @ce. * to @relativeref{Magnum,Error} and returns @ref Containers::NullOpt.
* @see @ref features(), @ref convertToData(Containers::ArrayView<const CompressedImageView2D>), * @see @ref features(), @ref convertToData(Containers::ArrayView<const CompressedImageView2D>),
* @ref convert(), @ref convertToFile() * @ref convert(), @ref convertToFile()
*/ */
Containers::Array<char> convertToData(Containers::ArrayView<const ImageView2D> imageLevels); #if !defined(MAGNUM_BUILD_DEPRECATED) || defined(DOXYGEN_GENERATING_OUTPUT)
Containers::Optional<Containers::Array<char>>
#else
Implementation::ImageConverterOptionalButAlsoArray<char>
#endif
convertToData(Containers::ArrayView<const ImageView2D> imageLevels);
/** @overload */ /** @overload */
Containers::Array<char> convertToData(std::initializer_list<ImageView2D> imageLevels); #if !defined(MAGNUM_BUILD_DEPRECATED) || defined(DOXYGEN_GENERATING_OUTPUT)
Containers::Optional<Containers::Array<char>>
#else
Implementation::ImageConverterOptionalButAlsoArray<char>
#endif
convertToData(std::initializer_list<ImageView2D> imageLevels);
/** /**
* @brief Convert a set of 3D image levels to a raw data * @brief Convert a set of 3D image levels to a raw data
@ -1058,13 +1145,23 @@ class MAGNUM_TRADE_EXPORT AbstractImageConverter: public PluginManager::Abstract
* pixel format. Note that certain converters may impose additional * pixel format. Note that certain converters may impose additional
* size and order restrictions on the images, see documentation of a * size and order restrictions on the images, see documentation of a
* particular plugin for more information. On failure prints a message * particular plugin for more information. On failure prints a message
* to @relativeref{Magnum,Error} and returns @cpp nullptr @ce. * to @relativeref{Magnum,Error} and returns @ref Containers::NullOpt.
* @see @ref features(), @ref convertToData(Containers::ArrayView<const CompressedImageView3D>), * @see @ref features(), @ref convertToData(Containers::ArrayView<const CompressedImageView3D>),
* @ref convert(), @ref convertToFile() * @ref convert(), @ref convertToFile()
*/ */
Containers::Array<char> convertToData(Containers::ArrayView<const ImageView3D> imageLevels); #if !defined(MAGNUM_BUILD_DEPRECATED) || defined(DOXYGEN_GENERATING_OUTPUT)
Containers::Optional<Containers::Array<char>>
#else
Implementation::ImageConverterOptionalButAlsoArray<char>
#endif
convertToData(Containers::ArrayView<const ImageView3D> imageLevels);
/** @overload */ /** @overload */
Containers::Array<char> convertToData(std::initializer_list<ImageView3D> imageLevels); #if !defined(MAGNUM_BUILD_DEPRECATED) || defined(DOXYGEN_GENERATING_OUTPUT)
Containers::Optional<Containers::Array<char>>
#else
Implementation::ImageConverterOptionalButAlsoArray<char>
#endif
convertToData(std::initializer_list<ImageView3D> imageLevels);
/** /**
* @brief Convert a set of compressed 1D image levels to a raw data * @brief Convert a set of compressed 1D image levels to a raw data
@ -1077,13 +1174,23 @@ class MAGNUM_TRADE_EXPORT AbstractImageConverter: public PluginManager::Abstract
* that certain converters may impose additional size and order * that certain converters may impose additional size and order
* restrictions on the images, see documentation of a particular plugin * restrictions on the images, see documentation of a particular plugin
* for more information. On failure prints a message to * for more information. On failure prints a message to
* @relativeref{Magnum,Error} and returns @cpp nullptr @ce. * @relativeref{Magnum,Error} and returns @ref Containers::NullOpt.
* @see @ref features(), @ref convertToData(Containers::ArrayView<const ImageView1D>), * @see @ref features(), @ref convertToData(Containers::ArrayView<const ImageView1D>),
* @ref convert(), @ref convertToFile() * @ref convert(), @ref convertToFile()
*/ */
Containers::Array<char> convertToData(Containers::ArrayView<const CompressedImageView1D> imageLevels); #if !defined(MAGNUM_BUILD_DEPRECATED) || defined(DOXYGEN_GENERATING_OUTPUT)
Containers::Optional<Containers::Array<char>>
#else
Implementation::ImageConverterOptionalButAlsoArray<char>
#endif
convertToData(Containers::ArrayView<const CompressedImageView1D> imageLevels);
/** @overload */ /** @overload */
Containers::Array<char> convertToData(std::initializer_list<CompressedImageView1D> imageLevels); #if !defined(MAGNUM_BUILD_DEPRECATED) || defined(DOXYGEN_GENERATING_OUTPUT)
Containers::Optional<Containers::Array<char>>
#else
Implementation::ImageConverterOptionalButAlsoArray<char>
#endif
convertToData(std::initializer_list<CompressedImageView1D> imageLevels);
/** /**
* @brief Convert a set of compressed 2D image levels to a raw data * @brief Convert a set of compressed 2D image levels to a raw data
@ -1096,13 +1203,23 @@ class MAGNUM_TRADE_EXPORT AbstractImageConverter: public PluginManager::Abstract
* pixel format. Note that certain converters may impose additional * pixel format. Note that certain converters may impose additional
* size and order restrictions on the images, see documentation of a * size and order restrictions on the images, see documentation of a
* particular plugin for more information. On failure prints a message * particular plugin for more information. On failure prints a message
* to @relativeref{Magnum,Error} and returns @cpp nullptr @ce. * to @relativeref{Magnum,Error} and returns @ref Containers::NullOpt.
* @see @ref features(), @ref convertToData(Containers::ArrayView<const ImageView2D>), * @see @ref features(), @ref convertToData(Containers::ArrayView<const ImageView2D>),
* @ref convert(), @ref convertToFile() * @ref convert(), @ref convertToFile()
*/ */
Containers::Array<char> convertToData(Containers::ArrayView<const CompressedImageView2D> imageLevels); #if !defined(MAGNUM_BUILD_DEPRECATED) || defined(DOXYGEN_GENERATING_OUTPUT)
Containers::Optional<Containers::Array<char>>
#else
Implementation::ImageConverterOptionalButAlsoArray<char>
#endif
convertToData(Containers::ArrayView<const CompressedImageView2D> imageLevels);
/** @overload */ /** @overload */
Containers::Array<char> convertToData(std::initializer_list<CompressedImageView2D> imageLevels); #if !defined(MAGNUM_BUILD_DEPRECATED) || defined(DOXYGEN_GENERATING_OUTPUT)
Containers::Optional<Containers::Array<char>>
#else
Implementation::ImageConverterOptionalButAlsoArray<char>
#endif
convertToData(std::initializer_list<CompressedImageView2D> imageLevels);
/** /**
* @brief Convert a set of compressed 3D image levels to a raw data * @brief Convert a set of compressed 3D image levels to a raw data
@ -1115,13 +1232,23 @@ class MAGNUM_TRADE_EXPORT AbstractImageConverter: public PluginManager::Abstract
* pixel format. Note that certain converters may impose additional * pixel format. Note that certain converters may impose additional
* size and order restrictions on the images, see documentation of a * size and order restrictions on the images, see documentation of a
* particular plugin for more information. On failure prints a message * particular plugin for more information. On failure prints a message
* to @relativeref{Magnum,Error} and returns @cpp nullptr @ce. * to @relativeref{Magnum,Error} and returns @ref Containers::NullOpt.
* @see @ref features(), @ref convertToData(Containers::ArrayView<const ImageView3D>), * @see @ref features(), @ref convertToData(Containers::ArrayView<const ImageView3D>),
* @ref convert(), @ref convertToFile() * @ref convert(), @ref convertToFile()
*/ */
Containers::Array<char> convertToData(Containers::ArrayView<const CompressedImageView3D> images); #if !defined(MAGNUM_BUILD_DEPRECATED) || defined(DOXYGEN_GENERATING_OUTPUT)
Containers::Optional<Containers::Array<char>>
#else
Implementation::ImageConverterOptionalButAlsoArray<char>
#endif
convertToData(Containers::ArrayView<const CompressedImageView3D> images);
/** @overload */ /** @overload */
Containers::Array<char> convertToData(std::initializer_list<CompressedImageView3D> images); #if !defined(MAGNUM_BUILD_DEPRECATED) || defined(DOXYGEN_GENERATING_OUTPUT)
Containers::Optional<Containers::Array<char>>
#else
Implementation::ImageConverterOptionalButAlsoArray<char>
#endif
convertToData(std::initializer_list<CompressedImageView3D> images);
/** /**
* @brief Convert a 1D image to a file * @brief Convert a 1D image to a file
@ -1648,7 +1775,7 @@ class MAGNUM_TRADE_EXPORT AbstractImageConverter: public PluginManager::Abstract
* default implementation calls @ref doConvertToData(Containers::ArrayView<const ImageView1D>) * default implementation calls @ref doConvertToData(Containers::ArrayView<const ImageView1D>)
* with just the single @p image and propagates the result back. * with just the single @p image and propagates the result back.
*/ */
virtual Containers::Array<char> doConvertToData(const ImageView1D& image); virtual Containers::Optional<Containers::Array<char>> doConvertToData(const ImageView1D& image);
/** /**
* @brief Implementation for @ref convertToData(const ImageView2D&) * @brief Implementation for @ref convertToData(const ImageView2D&)
@ -1658,7 +1785,7 @@ class MAGNUM_TRADE_EXPORT AbstractImageConverter: public PluginManager::Abstract
* default implementation calls @ref doConvertToData(Containers::ArrayView<const ImageView2D>) * default implementation calls @ref doConvertToData(Containers::ArrayView<const ImageView2D>)
* with just the single @p image and propagates the result back. * with just the single @p image and propagates the result back.
*/ */
virtual Containers::Array<char> doConvertToData(const ImageView2D& image); virtual Containers::Optional<Containers::Array<char>> doConvertToData(const ImageView2D& image);
/** /**
* @brief Implementation for @ref convertToData(const ImageView3D&) * @brief Implementation for @ref convertToData(const ImageView3D&)
@ -1668,7 +1795,7 @@ class MAGNUM_TRADE_EXPORT AbstractImageConverter: public PluginManager::Abstract
* default implementation calls @ref doConvertToData(Containers::ArrayView<const ImageView3D>) * default implementation calls @ref doConvertToData(Containers::ArrayView<const ImageView3D>)
* with just the single @p image and propagates the result back. * with just the single @p image and propagates the result back.
*/ */
virtual Containers::Array<char> doConvertToData(const ImageView3D& image); virtual Containers::Optional<Containers::Array<char>> doConvertToData(const ImageView3D& image);
/** /**
* @brief Implementation for @ref convertToData(const CompressedImageView1D&) * @brief Implementation for @ref convertToData(const CompressedImageView1D&)
@ -1679,7 +1806,7 @@ class MAGNUM_TRADE_EXPORT AbstractImageConverter: public PluginManager::Abstract
* @ref doConvertToData(Containers::ArrayView<const CompressedImageView1D>) * @ref doConvertToData(Containers::ArrayView<const CompressedImageView1D>)
* with just the single @p image and propagates the result back. * with just the single @p image and propagates the result back.
*/ */
virtual Containers::Array<char> doConvertToData(const CompressedImageView1D& image); virtual Containers::Optional<Containers::Array<char>> doConvertToData(const CompressedImageView1D& image);
/** /**
* @brief Implementation for @ref convertToData(const CompressedImageView2D&) * @brief Implementation for @ref convertToData(const CompressedImageView2D&)
@ -1690,7 +1817,7 @@ class MAGNUM_TRADE_EXPORT AbstractImageConverter: public PluginManager::Abstract
* @ref doConvertToData(Containers::ArrayView<const CompressedImageView2D>) * @ref doConvertToData(Containers::ArrayView<const CompressedImageView2D>)
* with just the single @p image and propagates the result back. * with just the single @p image and propagates the result back.
*/ */
virtual Containers::Array<char> doConvertToData(const CompressedImageView2D& image); virtual Containers::Optional<Containers::Array<char>> doConvertToData(const CompressedImageView2D& image);
/** /**
* @brief Implementation for @ref convertToData(const CompressedImageView3D&) * @brief Implementation for @ref convertToData(const CompressedImageView3D&)
@ -1701,43 +1828,43 @@ class MAGNUM_TRADE_EXPORT AbstractImageConverter: public PluginManager::Abstract
* @ref doConvertToData(Containers::ArrayView<const CompressedImageView3D>) * @ref doConvertToData(Containers::ArrayView<const CompressedImageView3D>)
* with just the single @p image and propagates the result back. * with just the single @p image and propagates the result back.
*/ */
virtual Containers::Array<char> doConvertToData(const CompressedImageView3D& image); virtual Containers::Optional<Containers::Array<char>> doConvertToData(const CompressedImageView3D& image);
/** /**
* @brief Implementation for @ref convertToData(Containers::ArrayView<const ImageView1D>) * @brief Implementation for @ref convertToData(Containers::ArrayView<const ImageView1D>)
* @m_since_latest * @m_since_latest
*/ */
virtual Containers::Array<char> doConvertToData(Containers::ArrayView<const ImageView1D> imageLevels); virtual Containers::Optional<Containers::Array<char>> doConvertToData(Containers::ArrayView<const ImageView1D> imageLevels);
/** /**
* @brief Implementation for @ref convertToData(Containers::ArrayView<const ImageView2D>) * @brief Implementation for @ref convertToData(Containers::ArrayView<const ImageView2D>)
* @m_since_latest * @m_since_latest
*/ */
virtual Containers::Array<char> doConvertToData(Containers::ArrayView<const ImageView2D> imageLevels); virtual Containers::Optional<Containers::Array<char>> doConvertToData(Containers::ArrayView<const ImageView2D> imageLevels);
/** /**
* @brief Implementation for @ref convertToData(Containers::ArrayView<const ImageView3D>) * @brief Implementation for @ref convertToData(Containers::ArrayView<const ImageView3D>)
* @m_since_latest * @m_since_latest
*/ */
virtual Containers::Array<char> doConvertToData(Containers::ArrayView<const ImageView3D> imageLevels); virtual Containers::Optional<Containers::Array<char>> doConvertToData(Containers::ArrayView<const ImageView3D> imageLevels);
/** /**
* @brief Implementation for @ref convertToData(Containers::ArrayView<const CompressedImageView1D>) * @brief Implementation for @ref convertToData(Containers::ArrayView<const CompressedImageView1D>)
* @m_since_latest * @m_since_latest
*/ */
virtual Containers::Array<char> doConvertToData(Containers::ArrayView<const CompressedImageView1D> imageLevels); virtual Containers::Optional<Containers::Array<char>> doConvertToData(Containers::ArrayView<const CompressedImageView1D> imageLevels);
/** /**
* @brief Implementation for @ref convertToData(Containers::ArrayView<const CompressedImageView2D>) * @brief Implementation for @ref convertToData(Containers::ArrayView<const CompressedImageView2D>)
* @m_since_latest * @m_since_latest
*/ */
virtual Containers::Array<char> doConvertToData(Containers::ArrayView<const CompressedImageView2D> imageLevels); virtual Containers::Optional<Containers::Array<char>> doConvertToData(Containers::ArrayView<const CompressedImageView2D> imageLevels);
/** /**
* @brief Implementation for @ref convertToData(Containers::ArrayView<const CompressedImageView3D>) * @brief Implementation for @ref convertToData(Containers::ArrayView<const CompressedImageView3D>)
* @m_since_latest * @m_since_latest
*/ */
virtual Containers::Array<char> doConvertToData(Containers::ArrayView<const CompressedImageView3D> imageLevels); virtual Containers::Optional<Containers::Array<char>> doConvertToData(Containers::ArrayView<const CompressedImageView3D> imageLevels);
ImageConverterFlags _flags; ImageConverterFlags _flags;
}; };

25
src/Magnum/Trade/AbstractSceneConverter.cpp

@ -65,7 +65,7 @@ using namespace Containers::Literals;
Containers::StringView AbstractSceneConverter::pluginInterface() { Containers::StringView AbstractSceneConverter::pluginInterface() {
return return
/* [interface] */ /* [interface] */
"cz.mosra.magnum.Trade.AbstractSceneConverter/0.1.1"_s "cz.mosra.magnum.Trade.AbstractSceneConverter/0.1.2"_s
/* [interface] */ /* [interface] */
; ;
} }
@ -148,17 +148,28 @@ bool AbstractSceneConverter::doConvertInPlace(MeshData&) {
CORRADE_ASSERT_UNREACHABLE("Trade::AbstractSceneConverter::convertInPlace(): mesh conversion advertised but not implemented", {}); CORRADE_ASSERT_UNREACHABLE("Trade::AbstractSceneConverter::convertInPlace(): mesh conversion advertised but not implemented", {});
} }
Containers::Array<char> AbstractSceneConverter::convertToData(const MeshData& mesh) { #ifndef MAGNUM_BUILD_DEPRECATED
Containers::Optional<Containers::Array<char>>
#else
Implementation::SceneConverterOptionalButAlsoArray<char>
#endif
AbstractSceneConverter::convertToData(const MeshData& mesh) {
CORRADE_ASSERT(features() & SceneConverterFeature::ConvertMeshToData, CORRADE_ASSERT(features() & SceneConverterFeature::ConvertMeshToData,
"Trade::AbstractSceneConverter::convertToData(): mesh conversion not supported", {}); "Trade::AbstractSceneConverter::convertToData(): mesh conversion not supported", {});
Containers::Array<char> out = doConvertToData(mesh); Containers::Optional<Containers::Array<char>> out = doConvertToData(mesh);
CORRADE_ASSERT(!out || !out.deleter() || out.deleter() == static_cast<void(*)(char*, std::size_t)>(Implementation::nonOwnedArrayDeleter) || out.deleter() == ArrayAllocator<char>::deleter, CORRADE_ASSERT(!out || !out->deleter() || out->deleter() == static_cast<void(*)(char*, std::size_t)>(Implementation::nonOwnedArrayDeleter) || out->deleter() == ArrayAllocator<char>::deleter,
"Trade::AbstractSceneConverter::convertToData(): implementation is not allowed to use a custom Array deleter", {}); "Trade::AbstractSceneConverter::convertToData(): implementation is not allowed to use a custom Array deleter", {});
/* GCC 4.8 and Clang 3.8 need an explicit conversion here */
#ifdef MAGNUM_BUILD_DEPRECATED
return Implementation::SceneConverterOptionalButAlsoArray<char>{std::move(out)};
#else
return out; return out;
#endif
} }
Containers::Array<char> AbstractSceneConverter::doConvertToData(const MeshData&) { Containers::Optional<Containers::Array<char>> AbstractSceneConverter::doConvertToData(const MeshData&) {
CORRADE_ASSERT_UNREACHABLE("Trade::AbstractSceneConverter::convertToData(): mesh conversion advertised but not implemented", {}); CORRADE_ASSERT_UNREACHABLE("Trade::AbstractSceneConverter::convertToData(): mesh conversion advertised but not implemented", {});
} }
@ -178,11 +189,11 @@ bool AbstractSceneConverter::convertToFile(const std::string& filename, const Me
bool AbstractSceneConverter::doConvertToFile(const MeshData& mesh, const Containers::StringView filename) { bool AbstractSceneConverter::doConvertToFile(const MeshData& mesh, const Containers::StringView filename) {
CORRADE_ASSERT(features() >= SceneConverterFeature::ConvertMeshToData, "Trade::AbstractSceneConverter::convertToFile(): mesh conversion advertised but not implemented", false); CORRADE_ASSERT(features() >= SceneConverterFeature::ConvertMeshToData, "Trade::AbstractSceneConverter::convertToFile(): mesh conversion advertised but not implemented", false);
const auto data = doConvertToData(mesh); const Containers::Optional<Containers::Array<char>> data = doConvertToData(mesh);
/* No deleter checks as it doesn't matter here */ /* No deleter checks as it doesn't matter here */
if(!data) return false; if(!data) return false;
if(!Utility::Path::write(filename, data)) { if(!Utility::Path::write(filename, *data)) {
Error() << "Trade::AbstractSceneConverter::convertToFile(): cannot write to file" << filename; Error() << "Trade::AbstractSceneConverter::convertToFile(): cannot write to file" << filename;
return false; return false;
} }

31
src/Magnum/Trade/AbstractSceneConverter.h

@ -37,6 +37,9 @@
#include "Magnum/Trade/visibility.h" #include "Magnum/Trade/visibility.h"
#ifdef MAGNUM_BUILD_DEPRECATED #ifdef MAGNUM_BUILD_DEPRECATED
/* For *ToData() APIs that used to return just an Array before */
#include <Corrade/Containers/Optional.h>
/* So deprecated APIs taking a std::string don't fail to compile */ /* So deprecated APIs taking a std::string don't fail to compile */
/** @todo remove once they are gone */ /** @todo remove once they are gone */
#include <Corrade/Utility/StlForwardString.h> #include <Corrade/Utility/StlForwardString.h>
@ -135,6 +138,23 @@ MAGNUM_TRADE_EXPORT Debug& operator<<(Debug& debug, SceneConverterFlag value);
*/ */
MAGNUM_TRADE_EXPORT Debug& operator<<(Debug& debug, SceneConverterFlags value); MAGNUM_TRADE_EXPORT Debug& operator<<(Debug& debug, SceneConverterFlags value);
#ifdef MAGNUM_BUILD_DEPRECATED
namespace Implementation {
/* Could be a concrete type as it's always only char, but that would mean
I'd need to include Optional and Array here. It's named like this
because AbstractImageConverter and ShaderTools::AbstractConverter each
have its own and introducing a common header containing just deprecated
functionality seems silly. */
template<class T> struct SceneConverterOptionalButAlsoArray: Containers::Optional<Containers::Array<T>> {
/*implicit*/ SceneConverterOptionalButAlsoArray() = default;
/*implicit*/ SceneConverterOptionalButAlsoArray(Containers::Optional<Containers::Array<T>>&& optional): Containers::Optional<Containers::Array<T>>{std::move(optional)} {}
CORRADE_DEPRECATED("use Containers::Optional<Containers::Array<T>> instead") /*implicit*/ operator Containers::Array<T>() && {
return *this ? Containers::Array<T>{std::move(**this)} : nullptr;
}
};
}
#endif
/** /**
@brief Base for scene converter plugins @brief Base for scene converter plugins
@m_since{2020,06} @m_since{2020,06}
@ -380,10 +400,15 @@ class MAGNUM_TRADE_EXPORT AbstractSceneConverter: public PluginManager::Abstract
* can be saved to disk. Available only if * can be saved to disk. Available only if
* @ref SceneConverterFeature::ConvertMeshToData is supported. On * @ref SceneConverterFeature::ConvertMeshToData is supported. On
* failure prints a message to @relativeref{Magnum,Error} and returns * failure prints a message to @relativeref{Magnum,Error} and returns
* @cpp nullptr @ce. * @ref Containers::NullOpt.
* @see @ref features(), @ref convertToFile() * @see @ref features(), @ref convertToFile()
*/ */
Containers::Array<char> convertToData(const MeshData& mesh); #if !defined(MAGNUM_BUILD_DEPRECATED) || defined(DOXYGEN_GENERATING_OUTPUT)
Containers::Optional<Containers::Array<char>>
#else
Implementation::SceneConverterOptionalButAlsoArray<char>
#endif
convertToData(const MeshData& mesh);
/** /**
* @brief Convert a mesh to a file * @brief Convert a mesh to a file
@ -449,7 +474,7 @@ class MAGNUM_TRADE_EXPORT AbstractSceneConverter: public PluginManager::Abstract
virtual bool doConvertInPlace(MeshData& mesh); virtual bool doConvertInPlace(MeshData& mesh);
/** @brief Implementation for @ref convertToData(const MeshData&) */ /** @brief Implementation for @ref convertToData(const MeshData&) */
virtual Containers::Array<char> doConvertToData(const MeshData& mesh); virtual Containers::Optional<Containers::Array<char>> doConvertToData(const MeshData& mesh);
SceneConverterFlags _flags; SceneConverterFlags _flags;
}; };

204
src/Magnum/Trade/Test/AbstractImageConverterTest.cpp

@ -987,7 +987,7 @@ void AbstractImageConverterTest::convertImageData3D() {
void AbstractImageConverterTest::convert1DToData() { void AbstractImageConverterTest::convert1DToData() {
struct: AbstractImageConverter { struct: AbstractImageConverter {
ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::Convert1DToData; } ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::Convert1DToData; }
Containers::Array<char> doConvertToData(const ImageView1D& image) override { Containers::Optional<Containers::Array<char>> doConvertToData(const ImageView1D& image) override {
return Containers::Array<char>{nullptr, std::size_t(image.size().product())}; return Containers::Array<char>{nullptr, std::size_t(image.size().product())};
} }
} converter; } converter;
@ -1000,7 +1000,7 @@ void AbstractImageConverterTest::convert1DToData() {
void AbstractImageConverterTest::convert2DToData() { void AbstractImageConverterTest::convert2DToData() {
struct: AbstractImageConverter { struct: AbstractImageConverter {
ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::Convert2DToData; } ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::Convert2DToData; }
Containers::Array<char> doConvertToData(const ImageView2D& image) override { Containers::Optional<Containers::Array<char>> doConvertToData(const ImageView2D& image) override {
return Containers::Array<char>{nullptr, std::size_t(image.size().product())}; return Containers::Array<char>{nullptr, std::size_t(image.size().product())};
} }
} converter; } converter;
@ -1013,7 +1013,7 @@ void AbstractImageConverterTest::convert2DToData() {
void AbstractImageConverterTest::convert3DToData() { void AbstractImageConverterTest::convert3DToData() {
struct: AbstractImageConverter { struct: AbstractImageConverter {
ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::Convert3DToData; } ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::Convert3DToData; }
Containers::Array<char> doConvertToData(const ImageView3D& image) override { Containers::Optional<Containers::Array<char>> doConvertToData(const ImageView3D& image) override {
return Containers::Array<char>{nullptr, std::size_t(image.size().product())}; return Containers::Array<char>{nullptr, std::size_t(image.size().product())};
} }
} converter; } converter;
@ -1139,7 +1139,7 @@ void AbstractImageConverterTest::convert1DToDataCustomDeleter() {
struct: AbstractImageConverter { struct: AbstractImageConverter {
ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::Convert1DToData; } ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::Convert1DToData; }
Containers::Array<char> doConvertToData(const ImageView1D&) override { Containers::Optional<Containers::Array<char>> doConvertToData(const ImageView1D&) override {
return Containers::Array<char>{nullptr, 0, [](char*, std::size_t) {}}; return Containers::Array<char>{nullptr, 0, [](char*, std::size_t) {}};
} }
} converter; } converter;
@ -1158,7 +1158,7 @@ void AbstractImageConverterTest::convert2DToDataCustomDeleter() {
struct: AbstractImageConverter { struct: AbstractImageConverter {
ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::Convert2DToData; } ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::Convert2DToData; }
Containers::Array<char> doConvertToData(const ImageView2D&) override { Containers::Optional<Containers::Array<char>> doConvertToData(const ImageView2D&) override {
return Containers::Array<char>{nullptr, 0, [](char*, std::size_t) {}}; return Containers::Array<char>{nullptr, 0, [](char*, std::size_t) {}};
} }
} converter; } converter;
@ -1177,7 +1177,7 @@ void AbstractImageConverterTest::convert3DToDataCustomDeleter() {
struct: AbstractImageConverter { struct: AbstractImageConverter {
ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::Convert3DToData; } ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::Convert3DToData; }
Containers::Array<char> doConvertToData(const ImageView3D&) override { Containers::Optional<Containers::Array<char>> doConvertToData(const ImageView3D&) override {
return Containers::Array<char>{nullptr, 0, [](char*, std::size_t) {}}; return Containers::Array<char>{nullptr, 0, [](char*, std::size_t) {}};
} }
} converter; } converter;
@ -1192,7 +1192,7 @@ void AbstractImageConverterTest::convert3DToDataCustomDeleter() {
void AbstractImageConverterTest::convertCompressed1DToData() { void AbstractImageConverterTest::convertCompressed1DToData() {
struct: AbstractImageConverter { struct: AbstractImageConverter {
ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertCompressed1DToData; } ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertCompressed1DToData; }
Containers::Array<char> doConvertToData(const CompressedImageView1D& image) override { Containers::Optional<Containers::Array<char>> doConvertToData(const CompressedImageView1D& image) override {
return Containers::Array<char>{nullptr, std::size_t(image.size().product())}; return Containers::Array<char>{nullptr, std::size_t(image.size().product())};
} }
} converter; } converter;
@ -1205,7 +1205,7 @@ void AbstractImageConverterTest::convertCompressed1DToData() {
void AbstractImageConverterTest::convertCompressed2DToData() { void AbstractImageConverterTest::convertCompressed2DToData() {
struct: AbstractImageConverter { struct: AbstractImageConverter {
ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertCompressed2DToData; } ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertCompressed2DToData; }
Containers::Array<char> doConvertToData(const CompressedImageView2D& image) override { Containers::Optional<Containers::Array<char>> doConvertToData(const CompressedImageView2D& image) override {
return Containers::Array<char>{nullptr, std::size_t(image.size().product())}; return Containers::Array<char>{nullptr, std::size_t(image.size().product())};
} }
} converter; } converter;
@ -1218,7 +1218,7 @@ void AbstractImageConverterTest::convertCompressed2DToData() {
void AbstractImageConverterTest::convertCompressed3DToData() { void AbstractImageConverterTest::convertCompressed3DToData() {
struct: AbstractImageConverter { struct: AbstractImageConverter {
ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertCompressed3DToData; } ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertCompressed3DToData; }
Containers::Array<char> doConvertToData(const CompressedImageView3D& image) override { Containers::Optional<Containers::Array<char>> doConvertToData(const CompressedImageView3D& image) override {
return Containers::Array<char>{nullptr, std::size_t(image.size().product())}; return Containers::Array<char>{nullptr, std::size_t(image.size().product())};
} }
} converter; } converter;
@ -1328,7 +1328,7 @@ void AbstractImageConverterTest::convertCompressed1DToDataCustomDeleter() {
struct: AbstractImageConverter { struct: AbstractImageConverter {
ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertCompressed1DToData; } ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertCompressed1DToData; }
Containers::Array<char> doConvertToData(const CompressedImageView1D&) override { Containers::Optional<Containers::Array<char>> doConvertToData(const CompressedImageView1D&) override {
return Containers::Array<char>{nullptr, 0, [](char*, std::size_t) {}}; return Containers::Array<char>{nullptr, 0, [](char*, std::size_t) {}};
} }
} converter; } converter;
@ -1347,7 +1347,7 @@ void AbstractImageConverterTest::convertCompressed2DToDataCustomDeleter() {
struct: AbstractImageConverter { struct: AbstractImageConverter {
ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertCompressed2DToData; } ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertCompressed2DToData; }
Containers::Array<char> doConvertToData(const CompressedImageView2D&) override { Containers::Optional<Containers::Array<char>> doConvertToData(const CompressedImageView2D&) override {
return Containers::Array<char>{nullptr, 0, [](char*, std::size_t) {}}; return Containers::Array<char>{nullptr, 0, [](char*, std::size_t) {}};
} }
} converter; } converter;
@ -1366,7 +1366,7 @@ void AbstractImageConverterTest::convertCompressed3DToDataCustomDeleter() {
struct: AbstractImageConverter { struct: AbstractImageConverter {
ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertCompressed3DToData; } ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertCompressed3DToData; }
Containers::Array<char> doConvertToData(const CompressedImageView3D&) override { Containers::Optional<Containers::Array<char>> doConvertToData(const CompressedImageView3D&) override {
return Containers::Array<char>{nullptr, 0, [](char*, std::size_t) {}}; return Containers::Array<char>{nullptr, 0, [](char*, std::size_t) {}};
} }
} converter; } converter;
@ -1383,11 +1383,11 @@ class ImageData1DConverter: public Trade::AbstractImageConverter {
private: private:
ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::Convert1DToData|ImageConverterFeature::ConvertCompressed1DToData; } ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::Convert1DToData|ImageConverterFeature::ConvertCompressed1DToData; }
Containers::Array<char> doConvertToData(const ImageView1D&) override { Containers::Optional<Containers::Array<char>> doConvertToData(const ImageView1D&) override {
return Containers::array({'B'}); return Containers::array({'B'});
}; };
Containers::Array<char> doConvertToData(const CompressedImageView1D&) override { Containers::Optional<Containers::Array<char>> doConvertToData(const CompressedImageView1D&) override {
return Containers::array({'C'}); return Containers::array({'C'});
}; };
}; };
@ -1395,11 +1395,11 @@ class ImageData2DConverter: public Trade::AbstractImageConverter {
private: private:
ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::Convert2DToData|ImageConverterFeature::ConvertCompressed2DToData; } ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::Convert2DToData|ImageConverterFeature::ConvertCompressed2DToData; }
Containers::Array<char> doConvertToData(const ImageView2D&) override { Containers::Optional<Containers::Array<char>> doConvertToData(const ImageView2D&) override {
return Containers::array({'B'}); return Containers::array({'B'});
}; };
Containers::Array<char> doConvertToData(const CompressedImageView2D&) override { Containers::Optional<Containers::Array<char>> doConvertToData(const CompressedImageView2D&) override {
return Containers::array({'C'}); return Containers::array({'C'});
}; };
}; };
@ -1407,11 +1407,11 @@ class ImageData3DConverter: public Trade::AbstractImageConverter {
private: private:
ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::Convert3DToData|ImageConverterFeature::ConvertCompressed3DToData; } ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::Convert3DToData|ImageConverterFeature::ConvertCompressed3DToData; }
Containers::Array<char> doConvertToData(const ImageView3D&) override { Containers::Optional<Containers::Array<char>> doConvertToData(const ImageView3D&) override {
return Containers::array({'B'}); return Containers::array({'B'});
}; };
Containers::Array<char> doConvertToData(const CompressedImageView3D&) override { Containers::Optional<Containers::Array<char>> doConvertToData(const CompressedImageView3D&) override {
return Containers::array({'C'}); return Containers::array({'C'});
}; };
}; };
@ -1420,48 +1420,72 @@ void AbstractImageConverterTest::convertImageData1DToData() {
ImageData1DConverter converter; ImageData1DConverter converter;
/* Should get "B" when converting uncompressed */ /* Should get "B" when converting uncompressed */
CORRADE_COMPARE_AS(converter.convertToData(ImageData1D{PixelFormat::RGBA8Unorm, 1, Containers::Array<char>{4}}), {
Containers::arrayView({'B'}), Containers::Optional<Containers::Array<char>> out = converter.convertToData(ImageData1D{PixelFormat::RGBA8Unorm, 1, Containers::Array<char>{4}});
TestSuite::Compare::Container); CORRADE_VERIFY(out);
CORRADE_COMPARE_AS(*out,
Containers::arrayView({'B'}),
TestSuite::Compare::Container);
}
/* Should get "C" when converting compressed */ /* Should get "C" when converting compressed */
CORRADE_COMPARE_AS(converter.convertToData(ImageData1D{CompressedPixelFormat::Bc1RGBUnorm, 4, Containers::Array<char>{8}}), {
Containers::arrayView({'C'}), Containers::Optional<Containers::Array<char>> out = converter.convertToData(ImageData1D{CompressedPixelFormat::Bc1RGBUnorm, 4, Containers::Array<char>{8}});
TestSuite::Compare::Container); CORRADE_VERIFY(out);
CORRADE_COMPARE_AS(*out,
Containers::arrayView({'C'}),
TestSuite::Compare::Container);
}
} }
void AbstractImageConverterTest::convertImageData2DToData() { void AbstractImageConverterTest::convertImageData2DToData() {
ImageData2DConverter converter; ImageData2DConverter converter;
/* Should get "B" when converting uncompressed */ /* Should get "B" when converting uncompressed */
CORRADE_COMPARE_AS(converter.convertToData(ImageData2D{PixelFormat::RGBA8Unorm, {1, 1}, Containers::Array<char>{4}}), {
Containers::arrayView({'B'}), Containers::Optional<Containers::Array<char>> out = converter.convertToData(ImageData2D{PixelFormat::RGBA8Unorm, {1, 1}, Containers::Array<char>{4}});
TestSuite::Compare::Container); CORRADE_VERIFY(out);
CORRADE_COMPARE_AS(*out,
Containers::arrayView({'B'}),
TestSuite::Compare::Container);
}
/* Should get "C" when converting compressed */ /* Should get "C" when converting compressed */
CORRADE_COMPARE_AS(converter.convertToData(ImageData2D{CompressedPixelFormat::Bc1RGBUnorm, {4, 4}, Containers::Array<char>{4}}), {
Containers::arrayView({'C'}), Containers::Optional<Containers::Array<char>> out = converter.convertToData(ImageData2D{CompressedPixelFormat::Bc1RGBUnorm, {4, 4}, Containers::Array<char>{4}});
TestSuite::Compare::Container); CORRADE_VERIFY(out);
CORRADE_COMPARE_AS(*out,
Containers::arrayView({'C'}),
TestSuite::Compare::Container);
}
} }
void AbstractImageConverterTest::convertImageData3DToData() { void AbstractImageConverterTest::convertImageData3DToData() {
ImageData3DConverter converter; ImageData3DConverter converter;
/* Should get "B" when converting uncompressed */ /* Should get "B" when converting uncompressed */
CORRADE_COMPARE_AS(converter.convertToData(ImageData3D{PixelFormat::RGBA8Unorm, {1, 1, 1}, Containers::Array<char>{4}}), {
Containers::arrayView({'B'}), Containers::Optional<Containers::Array<char>> out = converter.convertToData(ImageData3D{PixelFormat::RGBA8Unorm, {1, 1, 1}, Containers::Array<char>{4}});
TestSuite::Compare::Container); CORRADE_VERIFY(out);
CORRADE_COMPARE_AS(*out,
Containers::arrayView({'B'}),
TestSuite::Compare::Container);
}
/* Should get "C" when converting compressed */ /* Should get "C" when converting compressed */
CORRADE_COMPARE_AS(converter.convertToData(ImageData3D{CompressedPixelFormat::Bc1RGBUnorm, {4, 4, 1}, Containers::Array<char>{4}}), {
Containers::arrayView({'C'}), Containers::Optional<Containers::Array<char>> out = converter.convertToData(ImageData3D{CompressedPixelFormat::Bc1RGBUnorm, {4, 4, 1}, Containers::Array<char>{4}});
TestSuite::Compare::Container); CORRADE_VERIFY(out);
CORRADE_COMPARE_AS(*out,
Containers::arrayView({'C'}),
TestSuite::Compare::Container);
}
} }
void AbstractImageConverterTest::convertLevels1DToData() { void AbstractImageConverterTest::convertLevels1DToData() {
struct: AbstractImageConverter { struct: AbstractImageConverter {
ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertLevels1DToData; } ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertLevels1DToData; }
Containers::Array<char> doConvertToData(Containers::ArrayView<const ImageView1D> imageLevels) override { Containers::Optional<Containers::Array<char>> doConvertToData(Containers::ArrayView<const ImageView1D> imageLevels) override {
return Containers::Array<char>{nullptr, std::size_t(imageLevels[0].size().product()*imageLevels.size())}; return Containers::Array<char>{nullptr, std::size_t(imageLevels[0].size().product()*imageLevels.size())};
} }
} converter; } converter;
@ -1479,7 +1503,7 @@ void AbstractImageConverterTest::convertLevels1DToData() {
void AbstractImageConverterTest::convertLevels2DToData() { void AbstractImageConverterTest::convertLevels2DToData() {
struct: AbstractImageConverter { struct: AbstractImageConverter {
ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertLevels2DToData; } ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertLevels2DToData; }
Containers::Array<char> doConvertToData(Containers::ArrayView<const ImageView2D> imageLevels) override { Containers::Optional<Containers::Array<char>> doConvertToData(Containers::ArrayView<const ImageView2D> imageLevels) override {
return Containers::Array<char>{nullptr, std::size_t(imageLevels[0].size().product()*imageLevels.size())}; return Containers::Array<char>{nullptr, std::size_t(imageLevels[0].size().product()*imageLevels.size())};
} }
} converter; } converter;
@ -1497,7 +1521,7 @@ void AbstractImageConverterTest::convertLevels2DToData() {
void AbstractImageConverterTest::convertLevels3DToData() { void AbstractImageConverterTest::convertLevels3DToData() {
struct: AbstractImageConverter { struct: AbstractImageConverter {
ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertLevels3DToData; } ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertLevels3DToData; }
Containers::Array<char> doConvertToData(Containers::ArrayView<const ImageView3D> imageLevels) override { Containers::Optional<Containers::Array<char>> doConvertToData(Containers::ArrayView<const ImageView3D> imageLevels) override {
return Containers::Array<char>{nullptr, std::size_t(imageLevels[0].size().product()*imageLevels.size())}; return Containers::Array<char>{nullptr, std::size_t(imageLevels[0].size().product()*imageLevels.size())};
} }
} converter; } converter;
@ -1690,7 +1714,7 @@ void AbstractImageConverterTest::convertLevels1DToDataCustomDeleter() {
struct: AbstractImageConverter { struct: AbstractImageConverter {
ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertLevels1DToData; } ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertLevels1DToData; }
Containers::Array<char> doConvertToData(Containers::ArrayView<const ImageView1D>) override { Containers::Optional<Containers::Array<char>> doConvertToData(Containers::ArrayView<const ImageView1D>) override {
return Containers::Array<char>{nullptr, 0, [](char*, std::size_t) {}}; return Containers::Array<char>{nullptr, 0, [](char*, std::size_t) {}};
} }
} converter; } converter;
@ -1709,7 +1733,7 @@ void AbstractImageConverterTest::convertLevels2DToDataCustomDeleter() {
struct: AbstractImageConverter { struct: AbstractImageConverter {
ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertLevels2DToData; } ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertLevels2DToData; }
Containers::Array<char> doConvertToData(Containers::ArrayView<const ImageView2D>) override { Containers::Optional<Containers::Array<char>> doConvertToData(Containers::ArrayView<const ImageView2D>) override {
return Containers::Array<char>{nullptr, 0, [](char*, std::size_t) {}}; return Containers::Array<char>{nullptr, 0, [](char*, std::size_t) {}};
} }
} converter; } converter;
@ -1728,7 +1752,7 @@ void AbstractImageConverterTest::convertLevels3DToDataCustomDeleter() {
struct: AbstractImageConverter { struct: AbstractImageConverter {
ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertLevels3DToData; } ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertLevels3DToData; }
Containers::Array<char> doConvertToData(Containers::ArrayView<const ImageView3D>) override { Containers::Optional<Containers::Array<char>> doConvertToData(Containers::ArrayView<const ImageView3D>) override {
return Containers::Array<char>{nullptr, 0, [](char*, std::size_t) {}}; return Containers::Array<char>{nullptr, 0, [](char*, std::size_t) {}};
} }
} converter; } converter;
@ -1743,7 +1767,7 @@ void AbstractImageConverterTest::convertLevels3DToDataCustomDeleter() {
void AbstractImageConverterTest::convertCompressedLevels1DToData() { void AbstractImageConverterTest::convertCompressedLevels1DToData() {
struct: AbstractImageConverter { struct: AbstractImageConverter {
ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertCompressedLevels1DToData; } ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertCompressedLevels1DToData; }
Containers::Array<char> doConvertToData(Containers::ArrayView<const CompressedImageView1D> imageLevels) override { Containers::Optional<Containers::Array<char>> doConvertToData(Containers::ArrayView<const CompressedImageView1D> imageLevels) override {
return Containers::Array<char>{nullptr, std::size_t(imageLevels[0].size().product()*imageLevels.size())}; return Containers::Array<char>{nullptr, std::size_t(imageLevels[0].size().product()*imageLevels.size())};
} }
} converter; } converter;
@ -1761,7 +1785,7 @@ void AbstractImageConverterTest::convertCompressedLevels1DToData() {
void AbstractImageConverterTest::convertCompressedLevels2DToData() { void AbstractImageConverterTest::convertCompressedLevels2DToData() {
struct: AbstractImageConverter { struct: AbstractImageConverter {
ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertCompressedLevels2DToData; } ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertCompressedLevels2DToData; }
Containers::Array<char> doConvertToData(Containers::ArrayView<const CompressedImageView2D> imageLevels) override { Containers::Optional<Containers::Array<char>> doConvertToData(Containers::ArrayView<const CompressedImageView2D> imageLevels) override {
return Containers::Array<char>{nullptr, std::size_t(imageLevels[0].size().product()*imageLevels.size())}; return Containers::Array<char>{nullptr, std::size_t(imageLevels[0].size().product()*imageLevels.size())};
} }
} converter; } converter;
@ -1779,7 +1803,7 @@ void AbstractImageConverterTest::convertCompressedLevels2DToData() {
void AbstractImageConverterTest::convertCompressedLevels3DToData() { void AbstractImageConverterTest::convertCompressedLevels3DToData() {
struct: AbstractImageConverter { struct: AbstractImageConverter {
ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertCompressedLevels3DToData; } ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertCompressedLevels3DToData; }
Containers::Array<char> doConvertToData(Containers::ArrayView<const CompressedImageView3D> imageLevels) override { Containers::Optional<Containers::Array<char>> doConvertToData(Containers::ArrayView<const CompressedImageView3D> imageLevels) override {
return Containers::Array<char>{nullptr, std::size_t(imageLevels[0].size().product()*imageLevels.size())}; return Containers::Array<char>{nullptr, std::size_t(imageLevels[0].size().product()*imageLevels.size())};
} }
} converter; } converter;
@ -1952,7 +1976,7 @@ void AbstractImageConverterTest::convertCompressedLevels1DToDataCustomDeleter()
struct: AbstractImageConverter { struct: AbstractImageConverter {
ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertCompressedLevels1DToData; } ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertCompressedLevels1DToData; }
Containers::Array<char> doConvertToData(Containers::ArrayView<const CompressedImageView1D>) override { Containers::Optional<Containers::Array<char>> doConvertToData(Containers::ArrayView<const CompressedImageView1D>) override {
return Containers::Array<char>{nullptr, 0, [](char*, std::size_t) {}}; return Containers::Array<char>{nullptr, 0, [](char*, std::size_t) {}};
} }
} converter; } converter;
@ -1971,7 +1995,7 @@ void AbstractImageConverterTest::convertCompressedLevels2DToDataCustomDeleter()
struct: AbstractImageConverter { struct: AbstractImageConverter {
ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertCompressedLevels2DToData; } ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertCompressedLevels2DToData; }
Containers::Array<char> doConvertToData(Containers::ArrayView<const CompressedImageView2D>) override { Containers::Optional<Containers::Array<char>> doConvertToData(Containers::ArrayView<const CompressedImageView2D>) override {
return Containers::Array<char>{nullptr, 0, [](char*, std::size_t) {}}; return Containers::Array<char>{nullptr, 0, [](char*, std::size_t) {}};
} }
} converter; } converter;
@ -1990,7 +2014,7 @@ void AbstractImageConverterTest::convertCompressedLevels3DToDataCustomDeleter()
struct: AbstractImageConverter { struct: AbstractImageConverter {
ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertCompressedLevels3DToData; } ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertCompressedLevels3DToData; }
Containers::Array<char> doConvertToData(Containers::ArrayView<const CompressedImageView3D>) override { Containers::Optional<Containers::Array<char>> doConvertToData(Containers::ArrayView<const CompressedImageView3D>) override {
return Containers::Array<char>{nullptr, 0, [](char*, std::size_t) {}}; return Containers::Array<char>{nullptr, 0, [](char*, std::size_t) {}};
} }
} converter; } converter;
@ -2005,7 +2029,7 @@ void AbstractImageConverterTest::convertCompressedLevels3DToDataCustomDeleter()
void AbstractImageConverterTest::convert1DToDataThroughLevels() { void AbstractImageConverterTest::convert1DToDataThroughLevels() {
struct: AbstractImageConverter { struct: AbstractImageConverter {
ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertLevels1DToData; } ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertLevels1DToData; }
Containers::Array<char> doConvertToData(Containers::ArrayView<const ImageView1D> imageLevels) override { Containers::Optional<Containers::Array<char>> doConvertToData(Containers::ArrayView<const ImageView1D> imageLevels) override {
return Containers::Array<char>{nullptr, std::size_t(imageLevels[0].size().product()*imageLevels.size())}; return Containers::Array<char>{nullptr, std::size_t(imageLevels[0].size().product()*imageLevels.size())};
} }
} converter; } converter;
@ -2018,7 +2042,7 @@ void AbstractImageConverterTest::convert1DToDataThroughLevels() {
void AbstractImageConverterTest::convert2DToDataThroughLevels() { void AbstractImageConverterTest::convert2DToDataThroughLevels() {
struct: AbstractImageConverter { struct: AbstractImageConverter {
ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertLevels2DToData; } ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertLevels2DToData; }
Containers::Array<char> doConvertToData(Containers::ArrayView<const ImageView2D> imageLevels) override { Containers::Optional<Containers::Array<char>> doConvertToData(Containers::ArrayView<const ImageView2D> imageLevels) override {
return Containers::Array<char>{nullptr, std::size_t(imageLevels[0].size().product()*imageLevels.size())}; return Containers::Array<char>{nullptr, std::size_t(imageLevels[0].size().product()*imageLevels.size())};
} }
} converter; } converter;
@ -2031,7 +2055,7 @@ void AbstractImageConverterTest::convert2DToDataThroughLevels() {
void AbstractImageConverterTest::convert3DToDataThroughLevels() { void AbstractImageConverterTest::convert3DToDataThroughLevels() {
struct: AbstractImageConverter { struct: AbstractImageConverter {
ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertLevels3DToData; } ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertLevels3DToData; }
Containers::Array<char> doConvertToData(Containers::ArrayView<const ImageView3D> imageLevels) override { Containers::Optional<Containers::Array<char>> doConvertToData(Containers::ArrayView<const ImageView3D> imageLevels) override {
return Containers::Array<char>{nullptr, std::size_t(imageLevels[0].size().product()*imageLevels.size())}; return Containers::Array<char>{nullptr, std::size_t(imageLevels[0].size().product()*imageLevels.size())};
} }
} converter; } converter;
@ -2044,7 +2068,7 @@ void AbstractImageConverterTest::convert3DToDataThroughLevels() {
void AbstractImageConverterTest::convertCompressed1DToDataThroughLevels() { void AbstractImageConverterTest::convertCompressed1DToDataThroughLevels() {
struct: AbstractImageConverter { struct: AbstractImageConverter {
ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertCompressedLevels1DToData; } ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertCompressedLevels1DToData; }
Containers::Array<char> doConvertToData(Containers::ArrayView<const CompressedImageView1D> imageLevels) override { Containers::Optional<Containers::Array<char>> doConvertToData(Containers::ArrayView<const CompressedImageView1D> imageLevels) override {
return Containers::Array<char>{nullptr, std::size_t(imageLevels[0].size().product()*imageLevels.size())}; return Containers::Array<char>{nullptr, std::size_t(imageLevels[0].size().product()*imageLevels.size())};
} }
} converter; } converter;
@ -2057,7 +2081,7 @@ void AbstractImageConverterTest::convertCompressed1DToDataThroughLevels() {
void AbstractImageConverterTest::convertCompressed2DToDataThroughLevels() { void AbstractImageConverterTest::convertCompressed2DToDataThroughLevels() {
struct: AbstractImageConverter { struct: AbstractImageConverter {
ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertCompressedLevels2DToData; } ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertCompressedLevels2DToData; }
Containers::Array<char> doConvertToData(Containers::ArrayView<const CompressedImageView2D> imageLevels) override { Containers::Optional<Containers::Array<char>> doConvertToData(Containers::ArrayView<const CompressedImageView2D> imageLevels) override {
return Containers::Array<char>{nullptr, std::size_t(imageLevels[0].size().product()*imageLevels.size())}; return Containers::Array<char>{nullptr, std::size_t(imageLevels[0].size().product()*imageLevels.size())};
} }
} converter; } converter;
@ -2070,7 +2094,7 @@ void AbstractImageConverterTest::convertCompressed2DToDataThroughLevels() {
void AbstractImageConverterTest::convertCompressed3DToDataThroughLevels() { void AbstractImageConverterTest::convertCompressed3DToDataThroughLevels() {
struct: AbstractImageConverter { struct: AbstractImageConverter {
ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertCompressedLevels3DToData; } ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertCompressedLevels3DToData; }
Containers::Array<char> doConvertToData(Containers::ArrayView<const CompressedImageView3D> imageLevels) override { Containers::Optional<Containers::Array<char>> doConvertToData(Containers::ArrayView<const CompressedImageView3D> imageLevels) override {
return Containers::Array<char>{nullptr, std::size_t(imageLevels[0].size().product()*imageLevels.size())}; return Containers::Array<char>{nullptr, std::size_t(imageLevels[0].size().product()*imageLevels.size())};
} }
} converter; } converter;
@ -2141,7 +2165,7 @@ void AbstractImageConverterTest::convert1DToFileThroughData() {
struct: AbstractImageConverter { struct: AbstractImageConverter {
ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::Convert1DToData; } ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::Convert1DToData; }
Containers::Array<char> doConvertToData(const ImageView1D& image) override { Containers::Optional<Containers::Array<char>> doConvertToData(const ImageView1D& image) override {
return Containers::array({char(image.size()[0])}); return Containers::array({char(image.size()[0])});
}; };
} converter; } converter;
@ -2161,7 +2185,7 @@ void AbstractImageConverterTest::convert2DToFileThroughData() {
struct: AbstractImageConverter { struct: AbstractImageConverter {
ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::Convert2DToData; } ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::Convert2DToData; }
Containers::Array<char> doConvertToData(const ImageView2D& image) override { Containers::Optional<Containers::Array<char>> doConvertToData(const ImageView2D& image) override {
return Containers::array({char(image.size().x()), char(image.size().y())}); return Containers::array({char(image.size().x()), char(image.size().y())});
}; };
} converter; } converter;
@ -2181,7 +2205,7 @@ void AbstractImageConverterTest::convert3DToFileThroughData() {
struct: AbstractImageConverter { struct: AbstractImageConverter {
ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::Convert3DToData; } ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::Convert3DToData; }
Containers::Array<char> doConvertToData(const ImageView3D& image) override { Containers::Optional<Containers::Array<char>> doConvertToData(const ImageView3D& image) override {
return Containers::array({char(image.size().x()), char(image.size().y()), char(image.size().z())}); return Containers::array({char(image.size().x()), char(image.size().y()), char(image.size().z())});
}; };
} converter; } converter;
@ -2201,7 +2225,7 @@ void AbstractImageConverterTest::convert1DToFileThroughDataFailed() {
struct: AbstractImageConverter { struct: AbstractImageConverter {
ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::Convert1DToData; } ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::Convert1DToData; }
Containers::Array<char> doConvertToData(const ImageView1D&) override { Containers::Optional<Containers::Array<char>> doConvertToData(const ImageView1D&) override {
return {}; return {};
}; };
} converter; } converter;
@ -2226,7 +2250,7 @@ void AbstractImageConverterTest::convert2DToFileThroughDataFailed() {
struct: AbstractImageConverter { struct: AbstractImageConverter {
ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::Convert2DToData; } ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::Convert2DToData; }
Containers::Array<char> doConvertToData(const ImageView2D&) override { Containers::Optional<Containers::Array<char>> doConvertToData(const ImageView2D&) override {
return {}; return {};
}; };
} converter; } converter;
@ -2251,7 +2275,7 @@ void AbstractImageConverterTest::convert3DToFileThroughDataFailed() {
struct: AbstractImageConverter { struct: AbstractImageConverter {
ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::Convert3DToData; } ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::Convert3DToData; }
Containers::Array<char> doConvertToData(const ImageView3D&) override { Containers::Optional<Containers::Array<char>> doConvertToData(const ImageView3D&) override {
return {}; return {};
}; };
} converter; } converter;
@ -2276,7 +2300,7 @@ void AbstractImageConverterTest::convert1DToFileThroughDataNotWritable() {
struct: AbstractImageConverter { struct: AbstractImageConverter {
ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::Convert1DToData; } ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::Convert1DToData; }
Containers::Array<char> doConvertToData(const ImageView1D&) override { Containers::Optional<Containers::Array<char>> doConvertToData(const ImageView1D&) override {
return Containers::array({'\x00'}); return Containers::array({'\x00'});
}; };
} converter; } converter;
@ -2294,7 +2318,7 @@ void AbstractImageConverterTest::convert2DToFileThroughDataNotWritable() {
struct: AbstractImageConverter { struct: AbstractImageConverter {
ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::Convert2DToData; } ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::Convert2DToData; }
Containers::Array<char> doConvertToData(const ImageView2D&) override { Containers::Optional<Containers::Array<char>> doConvertToData(const ImageView2D&) override {
return Containers::array({'\x00'}); return Containers::array({'\x00'});
}; };
} converter; } converter;
@ -2312,7 +2336,7 @@ void AbstractImageConverterTest::convert3DToFileThroughDataNotWritable() {
struct: AbstractImageConverter { struct: AbstractImageConverter {
ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::Convert3DToData; } ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::Convert3DToData; }
Containers::Array<char> doConvertToData(const ImageView3D&) override { Containers::Optional<Containers::Array<char>> doConvertToData(const ImageView3D&) override {
return Containers::array({'\x00'}); return Containers::array({'\x00'});
}; };
} converter; } converter;
@ -2480,7 +2504,7 @@ void AbstractImageConverterTest::convertCompressed1DToFileThroughData() {
struct: AbstractImageConverter { struct: AbstractImageConverter {
ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertCompressed1DToData; } ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertCompressed1DToData; }
Containers::Array<char> doConvertToData(const CompressedImageView1D& image) override { Containers::Optional<Containers::Array<char>> doConvertToData(const CompressedImageView1D& image) override {
return Containers::array({char(image.size()[0])}); return Containers::array({char(image.size()[0])});
}; };
} converter; } converter;
@ -2500,7 +2524,7 @@ void AbstractImageConverterTest::convertCompressed2DToFileThroughData() {
struct: AbstractImageConverter { struct: AbstractImageConverter {
ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertCompressed2DToData; } ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertCompressed2DToData; }
Containers::Array<char> doConvertToData(const CompressedImageView2D& image) override { Containers::Optional<Containers::Array<char>> doConvertToData(const CompressedImageView2D& image) override {
return Containers::array({char(image.size().x()), char(image.size().y())}); return Containers::array({char(image.size().x()), char(image.size().y())});
}; };
} converter; } converter;
@ -2520,7 +2544,7 @@ void AbstractImageConverterTest::convertCompressed3DToFileThroughData() {
struct: AbstractImageConverter { struct: AbstractImageConverter {
ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertCompressed3DToData; } ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertCompressed3DToData; }
Containers::Array<char> doConvertToData(const CompressedImageView3D& image) override { Containers::Optional<Containers::Array<char>> doConvertToData(const CompressedImageView3D& image) override {
return Containers::array({char(image.size().x()), char(image.size().y()), char(image.size().z())}); return Containers::array({char(image.size().x()), char(image.size().y()), char(image.size().z())});
}; };
} converter; } converter;
@ -2540,7 +2564,7 @@ void AbstractImageConverterTest::convertCompressed1DToFileThroughDataFailed() {
struct: AbstractImageConverter { struct: AbstractImageConverter {
ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertCompressed1DToData; } ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertCompressed1DToData; }
Containers::Array<char> doConvertToData(const CompressedImageView1D&) override { Containers::Optional<Containers::Array<char>> doConvertToData(const CompressedImageView1D&) override {
return {}; return {};
}; };
} converter; } converter;
@ -2565,7 +2589,7 @@ void AbstractImageConverterTest::convertCompressed2DToFileThroughDataFailed() {
struct: AbstractImageConverter { struct: AbstractImageConverter {
ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertCompressed2DToData; } ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertCompressed2DToData; }
Containers::Array<char> doConvertToData(const CompressedImageView2D&) override { Containers::Optional<Containers::Array<char>> doConvertToData(const CompressedImageView2D&) override {
return {}; return {};
}; };
} converter; } converter;
@ -2590,7 +2614,7 @@ void AbstractImageConverterTest::convertCompressed3DToFileThroughDataFailed() {
struct: AbstractImageConverter { struct: AbstractImageConverter {
ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertCompressed3DToData; } ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertCompressed3DToData; }
Containers::Array<char> doConvertToData(const CompressedImageView3D&) override { Containers::Optional<Containers::Array<char>> doConvertToData(const CompressedImageView3D&) override {
return {}; return {};
}; };
} converter; } converter;
@ -2615,7 +2639,7 @@ void AbstractImageConverterTest::convertCompressed1DToFileThroughDataNotWritable
struct: AbstractImageConverter { struct: AbstractImageConverter {
ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertCompressed1DToData; } ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertCompressed1DToData; }
Containers::Array<char> doConvertToData(const CompressedImageView1D&) override { Containers::Optional<Containers::Array<char>> doConvertToData(const CompressedImageView1D&) override {
return Containers::array({'\x00'}); return Containers::array({'\x00'});
}; };
} converter; } converter;
@ -2633,7 +2657,7 @@ void AbstractImageConverterTest::convertCompressed2DToFileThroughDataNotWritable
struct: AbstractImageConverter { struct: AbstractImageConverter {
ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertCompressed2DToData; } ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertCompressed2DToData; }
Containers::Array<char> doConvertToData(const CompressedImageView2D&) override { Containers::Optional<Containers::Array<char>> doConvertToData(const CompressedImageView2D&) override {
return Containers::array({'\x00'}); return Containers::array({'\x00'});
}; };
} converter; } converter;
@ -2651,7 +2675,7 @@ void AbstractImageConverterTest::convertCompressed3DToFileThroughDataNotWritable
struct: AbstractImageConverter { struct: AbstractImageConverter {
ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertCompressed3DToData; } ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertCompressed3DToData; }
Containers::Array<char> doConvertToData(const CompressedImageView3D&) override { Containers::Optional<Containers::Array<char>> doConvertToData(const CompressedImageView3D&) override {
return Containers::array({'\x00'}); return Containers::array({'\x00'});
}; };
} converter; } converter;
@ -2876,7 +2900,7 @@ void AbstractImageConverterTest::convertLevels1DToFileThroughData() {
struct: AbstractImageConverter { struct: AbstractImageConverter {
ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertLevels1DToData; } ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertLevels1DToData; }
Containers::Array<char> doConvertToData(Containers::ArrayView<const ImageView1D> imageLevels) override { Containers::Optional<Containers::Array<char>> doConvertToData(Containers::ArrayView<const ImageView1D> imageLevels) override {
return Containers::array({char(imageLevels[0].size()[0]), char(imageLevels.size())}); return Containers::array({char(imageLevels[0].size()[0]), char(imageLevels.size())});
}; };
} converter; } converter;
@ -2902,7 +2926,7 @@ void AbstractImageConverterTest::convertLevels2DToFileThroughData() {
struct: AbstractImageConverter { struct: AbstractImageConverter {
ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertLevels2DToData; } ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertLevels2DToData; }
Containers::Array<char> doConvertToData(Containers::ArrayView<const ImageView2D> imageLevels) override { Containers::Optional<Containers::Array<char>> doConvertToData(Containers::ArrayView<const ImageView2D> imageLevels) override {
return Containers::array({char(imageLevels[0].size().x()), char(imageLevels[0].size().y()), char(imageLevels.size())}); return Containers::array({char(imageLevels[0].size().x()), char(imageLevels[0].size().y()), char(imageLevels.size())});
}; };
} converter; } converter;
@ -2927,7 +2951,7 @@ void AbstractImageConverterTest::convertLevels3DToFileThroughData() {
struct: AbstractImageConverter { struct: AbstractImageConverter {
ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertLevels3DToData; } ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertLevels3DToData; }
Containers::Array<char> doConvertToData(Containers::ArrayView<const ImageView3D> imageLevels) override { Containers::Optional<Containers::Array<char>> doConvertToData(Containers::ArrayView<const ImageView3D> imageLevels) override {
return Containers::array({char(imageLevels[0].size().x()), char(imageLevels[0].size().y()), char(imageLevels[0].size().z()), char(imageLevels.size())}); return Containers::array({char(imageLevels[0].size().x()), char(imageLevels[0].size().y()), char(imageLevels[0].size().z()), char(imageLevels.size())});
}; };
} converter; } converter;
@ -2952,7 +2976,7 @@ void AbstractImageConverterTest::convertLevels1DToFileThroughDataFailed() {
struct: AbstractImageConverter { struct: AbstractImageConverter {
ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertLevels1DToData; } ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertLevels1DToData; }
Containers::Array<char> doConvertToData(Containers::ArrayView<const ImageView1D>) override { Containers::Optional<Containers::Array<char>> doConvertToData(Containers::ArrayView<const ImageView1D>) override {
return {}; return {};
}; };
} converter; } converter;
@ -2977,7 +3001,7 @@ void AbstractImageConverterTest::convertLevels2DToFileThroughDataFailed() {
struct: AbstractImageConverter { struct: AbstractImageConverter {
ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertLevels2DToData; } ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertLevels2DToData; }
Containers::Array<char> doConvertToData(Containers::ArrayView<const ImageView2D>) override { Containers::Optional<Containers::Array<char>> doConvertToData(Containers::ArrayView<const ImageView2D>) override {
return {}; return {};
}; };
} converter; } converter;
@ -3002,7 +3026,7 @@ void AbstractImageConverterTest::convertLevels3DToFileThroughDataFailed() {
struct: AbstractImageConverter { struct: AbstractImageConverter {
ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertLevels3DToData; } ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertLevels3DToData; }
Containers::Array<char> doConvertToData(Containers::ArrayView<const ImageView3D>) override { Containers::Optional<Containers::Array<char>> doConvertToData(Containers::ArrayView<const ImageView3D>) override {
return {}; return {};
}; };
} converter; } converter;
@ -3026,7 +3050,7 @@ void AbstractImageConverterTest::convertLevels3DToFileThroughDataFailed() {
void AbstractImageConverterTest::convertLevels1DToFileThroughDataNotWritable() { void AbstractImageConverterTest::convertLevels1DToFileThroughDataNotWritable() {
struct: AbstractImageConverter { struct: AbstractImageConverter {
ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertLevels1DToData; } ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertLevels1DToData; }
Containers::Array<char> doConvertToData(Containers::ArrayView<const ImageView1D>) override { Containers::Optional<Containers::Array<char>> doConvertToData(Containers::ArrayView<const ImageView1D>) override {
return Containers::array({'\x00'}); return Containers::array({'\x00'});
}; };
} converter; } converter;
@ -3044,7 +3068,7 @@ void AbstractImageConverterTest::convertLevels2DToFileThroughDataNotWritable() {
struct: AbstractImageConverter { struct: AbstractImageConverter {
ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertLevels2DToData; } ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertLevels2DToData; }
Containers::Array<char> doConvertToData(Containers::ArrayView<const ImageView2D>) override { Containers::Optional<Containers::Array<char>> doConvertToData(Containers::ArrayView<const ImageView2D>) override {
return Containers::array({'\x00'}); return Containers::array({'\x00'});
}; };
} converter; } converter;
@ -3062,7 +3086,7 @@ void AbstractImageConverterTest::convertLevels3DToFileThroughDataNotWritable() {
struct: AbstractImageConverter { struct: AbstractImageConverter {
ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertLevels3DToData; } ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertLevels3DToData; }
Containers::Array<char> doConvertToData(Containers::ArrayView<const ImageView3D>) override { Containers::Optional<Containers::Array<char>> doConvertToData(Containers::ArrayView<const ImageView3D>) override {
return Containers::array({'\x00'}); return Containers::array({'\x00'});
}; };
} converter; } converter;
@ -3242,7 +3266,7 @@ void AbstractImageConverterTest::convertCompressedLevels1DToFileThroughData() {
struct: AbstractImageConverter { struct: AbstractImageConverter {
ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertCompressedLevels1DToData; } ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertCompressedLevels1DToData; }
Containers::Array<char> doConvertToData(Containers::ArrayView<const CompressedImageView1D> imageLevels) override { Containers::Optional<Containers::Array<char>> doConvertToData(Containers::ArrayView<const CompressedImageView1D> imageLevels) override {
return Containers::array({char(imageLevels[0].size()[0]), char(imageLevels.size())}); return Containers::array({char(imageLevels[0].size()[0]), char(imageLevels.size())});
}; };
} converter; } converter;
@ -3267,7 +3291,7 @@ void AbstractImageConverterTest::convertCompressedLevels2DToFileThroughData() {
struct: AbstractImageConverter { struct: AbstractImageConverter {
ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertCompressedLevels2DToData; } ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertCompressedLevels2DToData; }
Containers::Array<char> doConvertToData(Containers::ArrayView<const CompressedImageView2D> imageLevels) override { Containers::Optional<Containers::Array<char>> doConvertToData(Containers::ArrayView<const CompressedImageView2D> imageLevels) override {
return Containers::array({char(imageLevels[0].size().x()), char(imageLevels[0].size().y()), char(imageLevels.size())}); return Containers::array({char(imageLevels[0].size().x()), char(imageLevels[0].size().y()), char(imageLevels.size())});
}; };
} converter; } converter;
@ -3292,7 +3316,7 @@ void AbstractImageConverterTest::convertCompressedLevels3DToFileThroughData() {
struct: AbstractImageConverter { struct: AbstractImageConverter {
ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertCompressedLevels3DToData; } ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertCompressedLevels3DToData; }
Containers::Array<char> doConvertToData(Containers::ArrayView<const CompressedImageView3D> imageLevels) override { Containers::Optional<Containers::Array<char>> doConvertToData(Containers::ArrayView<const CompressedImageView3D> imageLevels) override {
return Containers::array({char(imageLevels[0].size().x()), char(imageLevels[0].size().y()), char(imageLevels[0].size().z()), char(imageLevels.size())}); return Containers::array({char(imageLevels[0].size().x()), char(imageLevels[0].size().y()), char(imageLevels[0].size().z()), char(imageLevels.size())});
}; };
} converter; } converter;
@ -3317,7 +3341,7 @@ void AbstractImageConverterTest::convertCompressedLevels1DToFileThroughDataFaile
struct: AbstractImageConverter { struct: AbstractImageConverter {
ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertCompressedLevels1DToData; } ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertCompressedLevels1DToData; }
Containers::Array<char> doConvertToData(Containers::ArrayView<const CompressedImageView1D>) override { Containers::Optional<Containers::Array<char>> doConvertToData(Containers::ArrayView<const CompressedImageView1D>) override {
return {}; return {};
}; };
} converter; } converter;
@ -3342,7 +3366,7 @@ void AbstractImageConverterTest::convertCompressedLevels2DToFileThroughDataFaile
struct: AbstractImageConverter { struct: AbstractImageConverter {
ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertCompressedLevels2DToData; } ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertCompressedLevels2DToData; }
Containers::Array<char> doConvertToData(Containers::ArrayView<const CompressedImageView2D>) override { Containers::Optional<Containers::Array<char>> doConvertToData(Containers::ArrayView<const CompressedImageView2D>) override {
return {}; return {};
}; };
} converter; } converter;
@ -3367,7 +3391,7 @@ void AbstractImageConverterTest::convertCompressedLevels3DToFileThroughDataFaile
struct: AbstractImageConverter { struct: AbstractImageConverter {
ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertCompressedLevels3DToData; } ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertCompressedLevels3DToData; }
Containers::Array<char> doConvertToData(Containers::ArrayView<const CompressedImageView3D>) override { Containers::Optional<Containers::Array<char>> doConvertToData(Containers::ArrayView<const CompressedImageView3D>) override {
return {}; return {};
}; };
} converter; } converter;
@ -3392,7 +3416,7 @@ void AbstractImageConverterTest::convertCompressedLevels1DToFileThroughDataNotWr
struct: AbstractImageConverter { struct: AbstractImageConverter {
ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertCompressedLevels1DToData; } ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertCompressedLevels1DToData; }
Containers::Array<char> doConvertToData(Containers::ArrayView<const CompressedImageView1D>) override { Containers::Optional<Containers::Array<char>> doConvertToData(Containers::ArrayView<const CompressedImageView1D>) override {
return Containers::array({'\x00'}); return Containers::array({'\x00'});
}; };
} converter; } converter;
@ -3410,7 +3434,7 @@ void AbstractImageConverterTest::convertCompressedLevels2DToFileThroughDataNotWr
struct: AbstractImageConverter { struct: AbstractImageConverter {
ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertCompressedLevels2DToData; } ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertCompressedLevels2DToData; }
Containers::Array<char> doConvertToData(Containers::ArrayView<const CompressedImageView2D>) override { Containers::Optional<Containers::Array<char>> doConvertToData(Containers::ArrayView<const CompressedImageView2D>) override {
return Containers::array({'\x00'}); return Containers::array({'\x00'});
}; };
} converter; } converter;
@ -3428,7 +3452,7 @@ void AbstractImageConverterTest::convertCompressedLevels3DToFileThroughDataNotWr
struct: AbstractImageConverter { struct: AbstractImageConverter {
ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertCompressedLevels3DToData; } ImageConverterFeatures doFeatures() const override { return ImageConverterFeature::ConvertCompressedLevels3DToData; }
Containers::Array<char> doConvertToData(Containers::ArrayView<const CompressedImageView3D>) override { Containers::Optional<Containers::Array<char>> doConvertToData(Containers::ArrayView<const CompressedImageView3D>) override {
return Containers::array({'\x00'}); return Containers::array({'\x00'});
}; };
} converter; } converter;

10
src/Magnum/Trade/Test/AbstractSceneConverterTest.cpp

@ -396,7 +396,7 @@ void AbstractSceneConverterTest::convertMeshToData() {
struct: AbstractSceneConverter { struct: AbstractSceneConverter {
SceneConverterFeatures doFeatures() const override { return SceneConverterFeature::ConvertMeshToData; } SceneConverterFeatures doFeatures() const override { return SceneConverterFeature::ConvertMeshToData; }
Containers::Array<char> doConvertToData(const MeshData& mesh) override { Containers::Optional<Containers::Array<char>> doConvertToData(const MeshData& mesh) override {
return Containers::Array<char>{nullptr, mesh.vertexCount()}; return Containers::Array<char>{nullptr, mesh.vertexCount()};
} }
} converter; } converter;
@ -428,7 +428,7 @@ void AbstractSceneConverterTest::convertMeshToDataCustomDeleter() {
struct: AbstractSceneConverter { struct: AbstractSceneConverter {
SceneConverterFeatures doFeatures() const override { return SceneConverterFeature::ConvertMeshToData; } SceneConverterFeatures doFeatures() const override { return SceneConverterFeature::ConvertMeshToData; }
Containers::Array<char> doConvertToData(const MeshData&) override { Containers::Optional<Containers::Array<char>> doConvertToData(const MeshData&) override {
return Containers::Array<char>{data, 1, [](char*, std::size_t) {}}; return Containers::Array<char>{data, 1, [](char*, std::size_t) {}};
} }
@ -464,7 +464,7 @@ void AbstractSceneConverterTest::convertMeshToFileThroughData() {
struct: AbstractSceneConverter { struct: AbstractSceneConverter {
SceneConverterFeatures doFeatures() const override { return SceneConverterFeature::ConvertMeshToData; } SceneConverterFeatures doFeatures() const override { return SceneConverterFeature::ConvertMeshToData; }
Containers::Array<char> doConvertToData(const MeshData& mesh) override { Containers::Optional<Containers::Array<char>> doConvertToData(const MeshData& mesh) override {
return Containers::array({char(mesh.vertexCount())}); return Containers::array({char(mesh.vertexCount())});
} }
} converter; } converter;
@ -484,7 +484,7 @@ void AbstractSceneConverterTest::convertMeshToFileThroughDataFailed() {
struct: AbstractSceneConverter { struct: AbstractSceneConverter {
SceneConverterFeatures doFeatures() const override { return SceneConverterFeature::ConvertMeshToData; } SceneConverterFeatures doFeatures() const override { return SceneConverterFeature::ConvertMeshToData; }
Containers::Array<char> doConvertToData(const MeshData&) override { Containers::Optional<Containers::Array<char>> doConvertToData(const MeshData&) override {
return {}; return {};
} }
} converter; } converter;
@ -507,7 +507,7 @@ void AbstractSceneConverterTest::convertMeshToFileThroughDataNotWritable() {
struct: AbstractSceneConverter { struct: AbstractSceneConverter {
SceneConverterFeatures doFeatures() const override { return SceneConverterFeature::ConvertMeshToData; } SceneConverterFeatures doFeatures() const override { return SceneConverterFeature::ConvertMeshToData; }
Containers::Array<char> doConvertToData(const MeshData& mesh) override { Containers::Optional<Containers::Array<char>> doConvertToData(const MeshData& mesh) override {
return Containers::array({char(mesh.vertexCount())}); return Containers::array({char(mesh.vertexCount())});
} }
} converter; } converter;

2
src/MagnumPlugins/AnyImageConverter/AnyImageConverter.cpp

@ -625,4 +625,4 @@ bool AnyImageConverter::doConvertToFile(const Containers::ArrayView<const Compre
}} }}
CORRADE_PLUGIN_REGISTER(AnyImageConverter, Magnum::Trade::AnyImageConverter, CORRADE_PLUGIN_REGISTER(AnyImageConverter, Magnum::Trade::AnyImageConverter,
"cz.mosra.magnum.Trade.AbstractImageConverter/0.3.1") "cz.mosra.magnum.Trade.AbstractImageConverter/0.3.2")

2
src/MagnumPlugins/AnySceneConverter/AnySceneConverter.cpp

@ -98,4 +98,4 @@ bool AnySceneConverter::doConvertToFile(const MeshData& mesh, const Containers::
}} }}
CORRADE_PLUGIN_REGISTER(AnySceneConverter, Magnum::Trade::AnySceneConverter, CORRADE_PLUGIN_REGISTER(AnySceneConverter, Magnum::Trade::AnySceneConverter,
"cz.mosra.magnum.Trade.AbstractSceneConverter/0.1.1") "cz.mosra.magnum.Trade.AbstractSceneConverter/0.1.2")

7
src/MagnumPlugins/AnyShaderConverter/AnyConverter.cpp

@ -26,6 +26,7 @@
#include "AnyConverter.h" #include "AnyConverter.h"
#include <Corrade/Containers/Array.h> #include <Corrade/Containers/Array.h>
#include <Corrade/Containers/Optional.h>
#include <Corrade/Containers/String.h> #include <Corrade/Containers/String.h>
#include <Corrade/PluginManager/Manager.h> #include <Corrade/PluginManager/Manager.h>
#include <Corrade/PluginManager/PluginMetadata.h> #include <Corrade/PluginManager/PluginMetadata.h>
@ -375,7 +376,7 @@ bool AnyConverter::doConvertFileToFile(const Stage stage, const Containers::Stri
return converter->convertFileToFile(stage, from, to); return converter->convertFileToFile(stage, from, to);
} }
Containers::Array<char> AnyConverter::doConvertFileToData(const Stage stage, const Containers::StringView filename) { Containers::Optional<Containers::Array<char>> AnyConverter::doConvertFileToData(const Stage stage, const Containers::StringView filename) {
CORRADE_INTERNAL_ASSERT(manager()); CORRADE_INTERNAL_ASSERT(manager());
/* Prefer the explicitly set input format. If not set, fall back to /* Prefer the explicitly set input format. If not set, fall back to
@ -460,7 +461,7 @@ Containers::Array<char> AnyConverter::doConvertFileToData(const Stage stage, con
return converter->convertFileToData(stage, filename); return converter->convertFileToData(stage, filename);
} }
Containers::Array<char> AnyConverter::doConvertDataToData(const Stage stage, const Containers::ArrayView<const char> from) { Containers::Optional<Containers::Array<char>> AnyConverter::doConvertDataToData(const Stage stage, const Containers::ArrayView<const char> from) {
CORRADE_INTERNAL_ASSERT(manager()); CORRADE_INTERNAL_ASSERT(manager());
/* Decide on a plugin name based on the format. This might result in /* Decide on a plugin name based on the format. This might result in
@ -546,4 +547,4 @@ Containers::Array<char> AnyConverter::doConvertDataToData(const Stage stage, con
}} }}
CORRADE_PLUGIN_REGISTER(AnyShaderConverter, Magnum::ShaderTools::AnyConverter, CORRADE_PLUGIN_REGISTER(AnyShaderConverter, Magnum::ShaderTools::AnyConverter,
"cz.mosra.magnum.ShaderTools.AbstractConverter/0.1") "cz.mosra.magnum.ShaderTools.AbstractConverter/0.1.1")

4
src/MagnumPlugins/AnyShaderConverter/AnyConverter.h

@ -162,8 +162,8 @@ class MAGNUM_ANYSHADERCONVERTER_EXPORT AnyConverter: public AbstractConverter {
MAGNUM_ANYSHADERCONVERTER_LOCAL std::pair<bool, Containers::String> doValidateFile(Stage stage, Containers::StringView filename) override; MAGNUM_ANYSHADERCONVERTER_LOCAL std::pair<bool, Containers::String> doValidateFile(Stage stage, Containers::StringView filename) override;
MAGNUM_ANYSHADERCONVERTER_LOCAL std::pair<bool, Containers::String> doValidateData(Stage stage, Containers::ArrayView<const char> data) override; MAGNUM_ANYSHADERCONVERTER_LOCAL std::pair<bool, Containers::String> doValidateData(Stage stage, Containers::ArrayView<const char> data) override;
MAGNUM_ANYSHADERCONVERTER_LOCAL bool doConvertFileToFile(Stage stage, Containers::StringView from, Containers::StringView to) override; MAGNUM_ANYSHADERCONVERTER_LOCAL bool doConvertFileToFile(Stage stage, Containers::StringView from, Containers::StringView to) override;
MAGNUM_ANYSHADERCONVERTER_LOCAL Containers::Array<char> doConvertFileToData(Magnum::ShaderTools::Stage stage, Containers::StringView filename) override; MAGNUM_ANYSHADERCONVERTER_LOCAL Containers::Optional<Containers::Array<char>> doConvertFileToData(Magnum::ShaderTools::Stage stage, Containers::StringView filename) override;
MAGNUM_ANYSHADERCONVERTER_LOCAL Containers::Array<char> doConvertDataToData(Magnum::ShaderTools::Stage stage, Containers::ArrayView<const char> data) override; MAGNUM_ANYSHADERCONVERTER_LOCAL Containers::Optional<Containers::Array<char>> doConvertDataToData(Magnum::ShaderTools::Stage stage, Containers::ArrayView<const char> data) override;
struct State; struct State;
Containers::Pointer<State> _state; Containers::Pointer<State> _state;

1
src/MagnumPlugins/MagnumFontConverter/MagnumFontConverter.cpp

@ -28,6 +28,7 @@
#include <algorithm> /* std::sort() */ #include <algorithm> /* std::sort() */
#include <sstream> #include <sstream>
#include <Corrade/Containers/Array.h> #include <Corrade/Containers/Array.h>
#include <Corrade/Containers/Optional.h>
#include <Corrade/Containers/Pair.h> #include <Corrade/Containers/Pair.h>
#include <Corrade/Utility/Configuration.h> #include <Corrade/Utility/Configuration.h>
#include <Corrade/Utility/Path.h> #include <Corrade/Utility/Path.h>

10
src/MagnumPlugins/TgaImageConverter/TgaImageConverter.cpp

@ -28,6 +28,7 @@
#include <fstream> #include <fstream>
#include <tuple> #include <tuple>
#include <Corrade/Containers/Array.h> #include <Corrade/Containers/Array.h>
#include <Corrade/Containers/Optional.h>
#include <Corrade/Utility/Algorithms.h> #include <Corrade/Utility/Algorithms.h>
#include <Corrade/Utility/Endianness.h> #include <Corrade/Utility/Endianness.h>
@ -45,7 +46,7 @@ TgaImageConverter::TgaImageConverter(PluginManager::AbstractManager& manager, co
ImageConverterFeatures TgaImageConverter::doFeatures() const { return ImageConverterFeature::Convert2DToData; } ImageConverterFeatures TgaImageConverter::doFeatures() const { return ImageConverterFeature::Convert2DToData; }
Containers::Array<char> TgaImageConverter::doConvertToData(const ImageView2D& image) { Containers::Optional<Containers::Array<char>> TgaImageConverter::doConvertToData(const ImageView2D& image) {
/* Initialize data buffer */ /* Initialize data buffer */
const auto pixelSize = UnsignedByte(image.pixelSize()); const auto pixelSize = UnsignedByte(image.pixelSize());
Containers::Array<char> data{ValueInit, sizeof(Implementation::TgaHeader) + pixelSize*image.size().product()}; Containers::Array<char> data{ValueInit, sizeof(Implementation::TgaHeader) + pixelSize*image.size().product()};
@ -62,7 +63,7 @@ Containers::Array<char> TgaImageConverter::doConvertToData(const ImageView2D& im
break; break;
default: default:
Error() << "Trade::TgaImageConverter::convertToData(): unsupported pixel format" << image.format(); Error() << "Trade::TgaImageConverter::convertToData(): unsupported pixel format" << image.format();
return nullptr; return {};
} }
header->bpp = pixelSize*8; header->bpp = pixelSize*8;
header->width = UnsignedShort(Utility::Endianness::littleEndian(image.size().x())); header->width = UnsignedShort(Utility::Endianness::littleEndian(image.size().x()));
@ -85,10 +86,11 @@ Containers::Array<char> TgaImageConverter::doConvertToData(const ImageView2D& im
pixel = Math::gather<'b', 'g', 'r', 'a'>(pixel); pixel = Math::gather<'b', 'g', 'r', 'a'>(pixel);
} }
return data; /* GCC 4.8 and Clang 3.8 needs extra help here */
return Containers::optional(std::move(data));
} }
}} }}
CORRADE_PLUGIN_REGISTER(TgaImageConverter, Magnum::Trade::TgaImageConverter, CORRADE_PLUGIN_REGISTER(TgaImageConverter, Magnum::Trade::TgaImageConverter,
"cz.mosra.magnum.Trade.AbstractImageConverter/0.3.1") "cz.mosra.magnum.Trade.AbstractImageConverter/0.3.2")

2
src/MagnumPlugins/TgaImageConverter/TgaImageConverter.h

@ -104,7 +104,7 @@ class MAGNUM_TGAIMAGECONVERTER_EXPORT TgaImageConverter: public AbstractImageCon
private: private:
ImageConverterFeatures MAGNUM_TGAIMAGECONVERTER_LOCAL doFeatures() const override; ImageConverterFeatures MAGNUM_TGAIMAGECONVERTER_LOCAL doFeatures() const override;
Containers::Array<char> MAGNUM_TGAIMAGECONVERTER_LOCAL doConvertToData(const ImageView2D& image) override; Containers::Optional<Containers::Array<char>> MAGNUM_TGAIMAGECONVERTER_LOCAL doConvertToData(const ImageView2D& image) override;
}; };
}} }}

Loading…
Cancel
Save