Browse Source

Trade: support 1D and 3D images in AbstractImageConverter.

I wanted just 3D at first, but then thought why not do 1D as well. Lots
of dry copypasted code, nothing interesting to see here.
pull/504/head
Vladimír Vondruš 5 years ago
parent
commit
2df2a47007
  1. 1
      doc/changelog.dox
  2. 242
      src/Magnum/Trade/AbstractImageConverter.cpp
  3. 422
      src/Magnum/Trade/AbstractImageConverter.h
  4. 1102
      src/Magnum/Trade/Test/AbstractImageConverterTest.cpp

1
doc/changelog.dox

@ -179,6 +179,7 @@ See also:
- New @ref Trade::SkinData class and @ref Trade::AbstractImporter::skin2D() / - New @ref Trade::SkinData class and @ref Trade::AbstractImporter::skin2D() /
@ref Trade::AbstractImporter::skin3D() family of APIs for skin import, as @ref Trade::AbstractImporter::skin3D() family of APIs for skin import, as
well as support in @ref Trade::AnySceneImporter "AnySceneImporter" well as support in @ref Trade::AnySceneImporter "AnySceneImporter"
- 1D and 3D image support in @ref Trade::AbstractImageConverter
- @ref Trade::LightData got extended to support light attenuation and range - @ref Trade::LightData got extended to support light attenuation and range
parameters as well and spot light inner and outer angle parameters as well and spot light inner and outer angle
- @ref Trade::AbstractImporter, @ref Trade::AbstractImageConverter and - @ref Trade::AbstractImporter, @ref Trade::AbstractImageConverter and

242
src/Magnum/Trade/AbstractImageConverter.cpp

@ -95,6 +95,19 @@ void AbstractImageConverter::clearFlags(ImageConverterFlags flags) {
setFlags(_flags & ~flags); setFlags(_flags & ~flags);
} }
Containers::Optional<ImageData1D> AbstractImageConverter::convert(const ImageView1D& image) {
CORRADE_ASSERT(features() & ImageConverterFeature::Convert1D,
"Trade::AbstractImageConverter::convert(): 1D image conversion not supported", {});
Containers::Optional<ImageData1D> out = doConvert(image);
CORRADE_ASSERT(!out || !out->_data.deleter(), "Trade::AbstractImageConverter::convert(): implementation is not allowed to use a custom Array deleter", {});
return out;
}
Containers::Optional<ImageData1D> AbstractImageConverter::doConvert(const ImageView1D&) {
CORRADE_ASSERT_UNREACHABLE("Trade::AbstractImageConverter::convert(): 1D image conversion advertised but not implemented", {});
}
Containers::Optional<ImageData2D> AbstractImageConverter::convert(const ImageView2D& image) { Containers::Optional<ImageData2D> AbstractImageConverter::convert(const ImageView2D& image) {
CORRADE_ASSERT(features() & ImageConverterFeature::Convert2D, CORRADE_ASSERT(features() & ImageConverterFeature::Convert2D,
"Trade::AbstractImageConverter::convert(): 2D image conversion not supported", {}); "Trade::AbstractImageConverter::convert(): 2D image conversion not supported", {});
@ -140,6 +153,32 @@ Containers::Optional<CompressedImage2D> AbstractImageConverter::exportToCompress
} }
#endif #endif
Containers::Optional<ImageData3D> AbstractImageConverter::convert(const ImageView3D& image) {
CORRADE_ASSERT(features() & ImageConverterFeature::Convert3D,
"Trade::AbstractImageConverter::convert(): 3D image conversion not supported", {});
Containers::Optional<ImageData3D> out = doConvert(image);
CORRADE_ASSERT(!out || !out->_data.deleter(), "Trade::AbstractImageConverter::convert(): implementation is not allowed to use a custom Array deleter", {});
return out;
}
Containers::Optional<ImageData3D> AbstractImageConverter::doConvert(const ImageView3D&) {
CORRADE_ASSERT_UNREACHABLE("Trade::AbstractImageConverter::convert(): 3D image conversion advertised but not implemented", {});
}
Containers::Optional<ImageData1D> AbstractImageConverter::convert(const CompressedImageView1D& image) {
CORRADE_ASSERT(features() & ImageConverterFeature::ConvertCompressed1D,
"Trade::AbstractImageConverter::convert(): compressed 1D image conversion not supported", {});
Containers::Optional<ImageData1D> out = doConvert(image);
CORRADE_ASSERT(!out || !out->_data.deleter(), "Trade::AbstractImageConverter::convert(): implementation is not allowed to use a custom Array deleter", {});
return out;
}
Containers::Optional<ImageData1D> AbstractImageConverter::doConvert(const CompressedImageView1D&) {
CORRADE_ASSERT_UNREACHABLE("Trade::AbstractImageConverter::convert(): compressed 1D image conversion advertised but not implemented", {});
}
Containers::Optional<ImageData2D> AbstractImageConverter::convert(const CompressedImageView2D& image) { Containers::Optional<ImageData2D> AbstractImageConverter::convert(const CompressedImageView2D& image) {
CORRADE_ASSERT(features() & ImageConverterFeature::ConvertCompressed2D, CORRADE_ASSERT(features() & ImageConverterFeature::ConvertCompressed2D,
"Trade::AbstractImageConverter::convert(): compressed 2D image conversion not supported", {}); "Trade::AbstractImageConverter::convert(): compressed 2D image conversion not supported", {});
@ -153,10 +192,44 @@ Containers::Optional<ImageData2D> AbstractImageConverter::doConvert(const Compre
CORRADE_ASSERT_UNREACHABLE("Trade::AbstractImageConverter::convert(): compressed 2D image conversion advertised but not implemented", {}); CORRADE_ASSERT_UNREACHABLE("Trade::AbstractImageConverter::convert(): compressed 2D image conversion advertised but not implemented", {});
} }
Containers::Optional<ImageData3D> AbstractImageConverter::convert(const CompressedImageView3D& image) {
CORRADE_ASSERT(features() & ImageConverterFeature::ConvertCompressed3D,
"Trade::AbstractImageConverter::convert(): compressed 3D image conversion not supported", {});
Containers::Optional<ImageData3D> out = doConvert(image);
CORRADE_ASSERT(!out || !out->_data.deleter(), "Trade::AbstractImageConverter::convert(): implementation is not allowed to use a custom Array deleter", {});
return out;
}
Containers::Optional<ImageData3D> AbstractImageConverter::doConvert(const CompressedImageView3D&) {
CORRADE_ASSERT_UNREACHABLE("Trade::AbstractImageConverter::convert(): compressed 3D image conversion advertised but not implemented", {});
}
Containers::Optional<ImageData1D> AbstractImageConverter::convert(const ImageData1D& image) {
return image.isCompressed() ? convert(CompressedImageView1D(image)) : convert(ImageView1D(image));
}
Containers::Optional<ImageData2D> AbstractImageConverter::convert(const ImageData2D& image) { Containers::Optional<ImageData2D> AbstractImageConverter::convert(const ImageData2D& image) {
return image.isCompressed() ? convert(CompressedImageView2D(image)) : convert(ImageView2D(image)); return image.isCompressed() ? convert(CompressedImageView2D(image)) : convert(ImageView2D(image));
} }
Containers::Optional<ImageData3D> AbstractImageConverter::convert(const ImageData3D& image) {
return image.isCompressed() ? convert(CompressedImageView3D(image)) : convert(ImageView3D(image));
}
Containers::Array<char> AbstractImageConverter::convertToData(const ImageView1D& image) {
CORRADE_ASSERT(features() >= ImageConverterFeature::Convert1DToData,
"Trade::AbstractImageConverter::convertToData(): 1D image conversion not supported", nullptr);
Containers::Array<char> out = doConvertToData(image);
CORRADE_ASSERT(!out.deleter(), "Trade::AbstractImageConverter::convertToData(): implementation is not allowed to use a custom Array deleter", {});
return out;
}
Containers::Array<char> AbstractImageConverter::doConvertToData(const ImageView1D&) {
CORRADE_ASSERT_UNREACHABLE("Trade::AbstractImageConverter::convertToData(): 1D image conversion advertised but not implemented", nullptr);
}
Containers::Array<char> AbstractImageConverter::convertToData(const ImageView2D& image) { Containers::Array<char> 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", nullptr);
@ -176,6 +249,32 @@ Containers::Array<char> AbstractImageConverter::exportToData(const ImageView2D&
} }
#endif #endif
Containers::Array<char> AbstractImageConverter::convertToData(const ImageView3D& image) {
CORRADE_ASSERT(features() >= ImageConverterFeature::Convert3DToData,
"Trade::AbstractImageConverter::convertToData(): 3D image conversion not supported", nullptr);
Containers::Array<char> out = doConvertToData(image);
CORRADE_ASSERT(!out.deleter(), "Trade::AbstractImageConverter::convertToData(): implementation is not allowed to use a custom Array deleter", {});
return out;
}
Containers::Array<char> AbstractImageConverter::doConvertToData(const ImageView3D&) {
CORRADE_ASSERT_UNREACHABLE("Trade::AbstractImageConverter::convertToData(): 3D image conversion advertised but not implemented", nullptr);
}
Containers::Array<char> AbstractImageConverter::convertToData(const CompressedImageView1D& image) {
CORRADE_ASSERT(features() >= ImageConverterFeature::ConvertCompressed1DToData,
"Trade::AbstractImageConverter::convertToData(): compressed 1D image conversion not supported", nullptr);
Containers::Array<char> out = doConvertToData(image);
CORRADE_ASSERT(!out.deleter(), "Trade::AbstractImageConverter::convertToData(): implementation is not allowed to use a custom Array deleter", {});
return out;
}
Containers::Array<char> AbstractImageConverter::doConvertToData(const CompressedImageView1D&) {
CORRADE_ASSERT_UNREACHABLE("Trade::AbstractImageConverter::convertToData(): compressed 1D image conversion advertised but not implemented", nullptr);
}
Containers::Array<char> AbstractImageConverter::convertToData(const CompressedImageView2D& image) { Containers::Array<char> 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", nullptr);
@ -195,6 +294,23 @@ Containers::Array<char> AbstractImageConverter::exportToData(const CompressedIma
} }
#endif #endif
Containers::Array<char> AbstractImageConverter::convertToData(const CompressedImageView3D& image) {
CORRADE_ASSERT(features() >= ImageConverterFeature::ConvertCompressed3DToData,
"Trade::AbstractImageConverter::convertToData(): compressed 3D image conversion not supported", nullptr);
Containers::Array<char> out = doConvertToData(image);
CORRADE_ASSERT(!out.deleter(), "Trade::AbstractImageConverter::convertToData(): implementation is not allowed to use a custom Array deleter", {});
return out;
}
Containers::Array<char> AbstractImageConverter::doConvertToData(const CompressedImageView3D&) {
CORRADE_ASSERT_UNREACHABLE("Trade::AbstractImageConverter::convertToData(): compressed 3D image conversion advertised but not implemented", nullptr);
}
Containers::Array<char> AbstractImageConverter::convertToData(const ImageData1D& image) {
return image.isCompressed() ? convertToData(CompressedImageView1D(image)) : convertToData(ImageView1D(image));
}
Containers::Array<char> AbstractImageConverter::convertToData(const ImageData2D& image) { Containers::Array<char> AbstractImageConverter::convertToData(const ImageData2D& image) {
return image.isCompressed() ? convertToData(CompressedImageView2D(image)) : convertToData(ImageView2D(image)); return image.isCompressed() ? convertToData(CompressedImageView2D(image)) : convertToData(ImageView2D(image));
} }
@ -205,6 +321,32 @@ Containers::Array<char> AbstractImageConverter::exportToData(const ImageData2D&
} }
#endif #endif
Containers::Array<char> AbstractImageConverter::convertToData(const ImageData3D& image) {
return image.isCompressed() ? convertToData(CompressedImageView3D(image)) : convertToData(ImageView3D(image));
}
bool AbstractImageConverter::convertToFile(const ImageView1D& image, const Containers::StringView filename) {
CORRADE_ASSERT(features() & ImageConverterFeature::Convert1DToFile,
"Trade::AbstractImageConverter::convertToFile(): 1D image conversion not supported", {});
return doConvertToFile(image, filename);
}
bool AbstractImageConverter::doConvertToFile(const ImageView1D& image, const Containers::StringView filename) {
CORRADE_ASSERT(features() >= ImageConverterFeature::Convert1DToData, "Trade::AbstractImageConverter::convertToFile(): 1D image conversion advertised but not implemented", false);
const auto data = doConvertToData(image);
/* No deleter checks as it doesn't matter here */
if(!data) return false;
if(!Utility::Directory::write(filename, data)) {
Error() << "Trade::AbstractImageConverter::convertToFile(): cannot write to file" << filename;
return false;
}
return true;
}
bool AbstractImageConverter::convertToFile(const ImageView2D& image, const Containers::StringView filename) { bool AbstractImageConverter::convertToFile(const ImageView2D& image, const Containers::StringView filename) {
CORRADE_ASSERT(features() & ImageConverterFeature::Convert2DToFile, CORRADE_ASSERT(features() & ImageConverterFeature::Convert2DToFile,
"Trade::AbstractImageConverter::convertToFile(): 2D image conversion not supported", {}); "Trade::AbstractImageConverter::convertToFile(): 2D image conversion not supported", {});
@ -233,6 +375,50 @@ bool AbstractImageConverter::exportToFile(const ImageView2D& image, const std::s
} }
#endif #endif
bool AbstractImageConverter::convertToFile(const ImageView3D& image, const Containers::StringView filename) {
CORRADE_ASSERT(features() & ImageConverterFeature::Convert3DToFile,
"Trade::AbstractImageConverter::convertToFile(): 3D image conversion not supported", {});
return doConvertToFile(image, filename);
}
bool AbstractImageConverter::doConvertToFile(const ImageView3D& image, const Containers::StringView filename) {
CORRADE_ASSERT(features() >= ImageConverterFeature::Convert3DToData, "Trade::AbstractImageConverter::convertToFile(): 3D image conversion advertised but not implemented", false);
const auto data = doConvertToData(image);
/* No deleter checks as it doesn't matter here */
if(!data) return false;
if(!Utility::Directory::write(filename, data)) {
Error() << "Trade::AbstractImageConverter::convertToFile(): cannot write to file" << filename;
return false;
}
return true;
}
bool AbstractImageConverter::convertToFile(const CompressedImageView1D& image, const Containers::StringView filename) {
CORRADE_ASSERT(features() & ImageConverterFeature::ConvertCompressed1DToFile,
"Trade::AbstractImageConverter::convertToFile(): compressed 1D image conversion not supported", {});
return doConvertToFile(image, filename);
}
bool AbstractImageConverter::doConvertToFile(const CompressedImageView1D& image, Containers::StringView filename) {
CORRADE_ASSERT(features() >= ImageConverterFeature::ConvertCompressed1DToData, "Trade::AbstractImageConverter::convertToFile(): compressed 1D image conversion advertised but not implemented", false);
const auto data = doConvertToData(image);
/* No deleter checks as it doesn't matter here */
if(!data) return false;
if(!Utility::Directory::write(filename, data)) {
Error() << "Trade::AbstractImageConverter::convertToFile(): cannot write to file" << filename;
return false;
}
return true;
}
bool AbstractImageConverter::convertToFile(const CompressedImageView2D& image, const Containers::StringView filename) { bool AbstractImageConverter::convertToFile(const CompressedImageView2D& image, const Containers::StringView filename) {
CORRADE_ASSERT(features() & ImageConverterFeature::ConvertCompressed2DToFile, CORRADE_ASSERT(features() & ImageConverterFeature::ConvertCompressed2DToFile,
"Trade::AbstractImageConverter::convertToFile(): compressed 2D image conversion not supported", {}); "Trade::AbstractImageConverter::convertToFile(): compressed 2D image conversion not supported", {});
@ -261,6 +447,32 @@ bool AbstractImageConverter::exportToFile(const CompressedImageView2D& image, co
} }
#endif #endif
bool AbstractImageConverter::convertToFile(const CompressedImageView3D& image, const Containers::StringView filename) {
CORRADE_ASSERT(features() & ImageConverterFeature::ConvertCompressed3DToFile,
"Trade::AbstractImageConverter::convertToFile(): compressed 3D image conversion not supported", {});
return doConvertToFile(image, filename);
}
bool AbstractImageConverter::doConvertToFile(const CompressedImageView3D& image, Containers::StringView filename) {
CORRADE_ASSERT(features() >= ImageConverterFeature::ConvertCompressed3DToData, "Trade::AbstractImageConverter::convertToFile(): compressed 3D image conversion advertised but not implemented", false);
const auto data = doConvertToData(image);
/* No deleter checks as it doesn't matter here */
if(!data) return false;
if(!Utility::Directory::write(filename, data)) {
Error() << "Trade::AbstractImageConverter::convertToFile(): cannot write to file" << filename;
return false;
}
return true;
}
bool AbstractImageConverter::convertToFile(const ImageData1D& image, const Containers::StringView filename) {
return image.isCompressed() ? convertToFile(CompressedImageView1D(image), filename) : convertToFile(ImageView1D(image), filename);
}
bool AbstractImageConverter::convertToFile(const ImageData2D& image, const Containers::StringView filename) { bool AbstractImageConverter::convertToFile(const ImageData2D& image, const Containers::StringView filename) {
return image.isCompressed() ? convertToFile(CompressedImageView2D(image), filename) : convertToFile(ImageView2D(image), filename); return image.isCompressed() ? convertToFile(CompressedImageView2D(image), filename) : convertToFile(ImageView2D(image), filename);
} }
@ -271,18 +483,34 @@ bool AbstractImageConverter::exportToFile(const ImageData2D& image, const std::s
} }
#endif #endif
bool AbstractImageConverter::convertToFile(const ImageData3D& image, const Containers::StringView filename) {
return image.isCompressed() ? convertToFile(CompressedImageView3D(image), filename) : convertToFile(ImageView3D(image), filename);
}
Debug& operator<<(Debug& debug, const ImageConverterFeature value) { Debug& operator<<(Debug& debug, const ImageConverterFeature value) {
debug << "Trade::ImageConverterFeature" << Debug::nospace; debug << "Trade::ImageConverterFeature" << Debug::nospace;
switch(value) { switch(value) {
/* LCOV_EXCL_START */ /* LCOV_EXCL_START */
#define _c(v) case ImageConverterFeature::v: return debug << "::" #v; #define _c(v) case ImageConverterFeature::v: return debug << "::" #v;
_c(Convert1D)
_c(Convert2D) _c(Convert2D)
_c(Convert3D)
_c(ConvertCompressed1D)
_c(ConvertCompressed2D) _c(ConvertCompressed2D)
_c(ConvertCompressed3D)
_c(Convert1DToFile)
_c(Convert2DToFile) _c(Convert2DToFile)
_c(Convert3DToFile)
_c(ConvertCompressed1DToFile)
_c(ConvertCompressed2DToFile) _c(ConvertCompressed2DToFile)
_c(ConvertCompressed3DToFile)
_c(Convert1DToData)
_c(Convert2DToData) _c(Convert2DToData)
_c(Convert3DToData)
_c(ConvertCompressed1DToData)
_c(ConvertCompressed2DToData) _c(ConvertCompressed2DToData)
_c(ConvertCompressed3DToData)
#undef _c #undef _c
/* LCOV_EXCL_STOP */ /* LCOV_EXCL_STOP */
} }
@ -292,13 +520,25 @@ Debug& operator<<(Debug& debug, const ImageConverterFeature value) {
Debug& operator<<(Debug& debug, const ImageConverterFeatures value) { Debug& operator<<(Debug& debug, const ImageConverterFeatures value) {
return Containers::enumSetDebugOutput(debug, value, "Trade::ImageConverterFeatures{}", { return Containers::enumSetDebugOutput(debug, value, "Trade::ImageConverterFeatures{}", {
ImageConverterFeature::Convert1D,
ImageConverterFeature::Convert2D, ImageConverterFeature::Convert2D,
ImageConverterFeature::Convert3D,
ImageConverterFeature::ConvertCompressed1D,
ImageConverterFeature::ConvertCompressed2D, ImageConverterFeature::ConvertCompressed2D,
ImageConverterFeature::ConvertCompressed3D,
ImageConverterFeature::Convert1DToData,
ImageConverterFeature::Convert2DToData, ImageConverterFeature::Convert2DToData,
ImageConverterFeature::Convert3DToData,
ImageConverterFeature::ConvertCompressed1DToData,
ImageConverterFeature::ConvertCompressed2DToData, ImageConverterFeature::ConvertCompressed2DToData,
ImageConverterFeature::ConvertCompressed3DToData,
/* These are implied by Convert[Compressed]ToData, so have to be last */ /* These are implied by Convert[Compressed]ToData, so have to be last */
ImageConverterFeature::Convert1DToFile,
ImageConverterFeature::Convert2DToFile, ImageConverterFeature::Convert2DToFile,
ImageConverterFeature::ConvertCompressed2DToFile}); ImageConverterFeature::Convert3DToFile,
ImageConverterFeature::ConvertCompressed1DToFile,
ImageConverterFeature::ConvertCompressed2DToFile,
ImageConverterFeature::ConvertCompressed3DToFile});
} }
Debug& operator<<(Debug& debug, const ImageConverterFlag value) { Debug& operator<<(Debug& debug, const ImageConverterFlag value) {

422
src/Magnum/Trade/AbstractImageConverter.h

@ -44,12 +44,19 @@ namespace Magnum { namespace Trade {
@see @ref ImageConverterFeatures, @ref AbstractImageConverter::features() @see @ref ImageConverterFeatures, @ref AbstractImageConverter::features()
*/ */
enum class ImageConverterFeature: UnsignedInt { enum class ImageConverterFeature: UnsignedInt {
/**
* Convert a 1D image with
* @ref AbstractImageConverter::convert(const ImageView1D&)
* @m_since_latest
*/
Convert1D = 1 << 0,
/** /**
* Convert a 2D image with * Convert a 2D image with
* @ref AbstractImageConverter::convert(const ImageView2D&) * @ref AbstractImageConverter::convert(const ImageView2D&)
* @m_since_latest * @m_since_latest
*/ */
Convert2D = 1 << 0, Convert2D = 1 << 1,
#ifdef MAGNUM_BUILD_DEPRECATED #ifdef MAGNUM_BUILD_DEPRECATED
/** /**
@ -71,19 +78,47 @@ enum class ImageConverterFeature: UnsignedInt {
ConvertCompressedImage CORRADE_DEPRECATED_ENUM("use ImageConverterFeature::Convert2D instead") = Convert2D, ConvertCompressedImage CORRADE_DEPRECATED_ENUM("use ImageConverterFeature::Convert2D instead") = Convert2D,
#endif #endif
/**
* Convert a 3D image with
* @ref AbstractImageConverter::convert(const ImageView3D&)
* @m_since_latest
*/
Convert3D = 1 << 3,
/**
* Convert a compressed 1D image with
* @ref AbstractImageConverter::convert(const CompressedImageView1D&)
* @m_since_latest
*/
ConvertCompressed1D = 1 << 4,
/** /**
* Convert a compressed 2D image with * Convert a compressed 2D image with
* @ref AbstractImageConverter::convert(const CompressedImageView2D&) * @ref AbstractImageConverter::convert(const CompressedImageView2D&)
* @m_since_latest * @m_since_latest
*/ */
ConvertCompressed2D = 1 << 1, ConvertCompressed2D = 1 << 5,
/**
* Convert a compressed 3D image with
* @ref AbstractImageConverter::convert(const CompressedImageView3D&)
* @m_since_latest
*/
ConvertCompressed3D = 1 << 6,
/**
* Convert a 1D image to a file with
* @ref AbstractImageConverter::convertToFile(const ImageView1D&, Containers::StringView)
* @m_since_latest
*/
Convert1DToFile = 1 << 7,
/** /**
* Convert a 2D image to a file with * Convert a 2D image to a file with
* @ref AbstractImageConverter::convertToFile(const ImageView2D&, Containers::StringView) * @ref AbstractImageConverter::convertToFile(const ImageView2D&, Containers::StringView)
* @m_since_latest * @m_since_latest
*/ */
Convert2DToFile = 1 << 2, Convert2DToFile = 1 << 8,
#ifdef MAGNUM_BUILD_DEPRECATED #ifdef MAGNUM_BUILD_DEPRECATED
/** /**
@ -94,12 +129,26 @@ enum class ImageConverterFeature: UnsignedInt {
ConvertFile CORRADE_DEPRECATED_ENUM("use ImageConverterFeature::Convert2DToFile instead") = Convert2DToFile, ConvertFile CORRADE_DEPRECATED_ENUM("use ImageConverterFeature::Convert2DToFile instead") = Convert2DToFile,
#endif #endif
/**
* Convert a 3D image to a file with
* @ref AbstractImageConverter::convertToFile(const ImageView3D&, Containers::StringView)
* @m_since_latest
*/
Convert3DToFile = 1 << 9,
/**
* Convert a compressed 1D image to a file with
* @ref AbstractImageConverter::convertToFile(const CompressedImageView1D&, Containers::StringView)
* @m_since_latest
*/
ConvertCompressed1DToFile = 1 << 10,
/** /**
* Convert a compressed 2D image to a file with * Convert a compressed 2D image to a file with
* @ref AbstractImageConverter::convertToFile(const CompressedImageView2D&, Containers::StringView) * @ref AbstractImageConverter::convertToFile(const CompressedImageView2D&, Containers::StringView)
* @m_since_latest * @m_since_latest
*/ */
ConvertCompressed2DToFile = 1 << 3, ConvertCompressed2DToFile = 1 << 11,
#ifdef MAGNUM_BUILD_DEPRECATED #ifdef MAGNUM_BUILD_DEPRECATED
/** /**
@ -110,13 +159,28 @@ enum class ImageConverterFeature: UnsignedInt {
ConvertCompressedFile CORRADE_DEPRECATED_ENUM("use ImageConverterFeature::ConvertCompressed2DToFile instead") = ConvertCompressed2DToFile, ConvertCompressedFile CORRADE_DEPRECATED_ENUM("use ImageConverterFeature::ConvertCompressed2DToFile instead") = ConvertCompressed2DToFile,
#endif #endif
/**
* Convert a compressed 3D image to a file with
* @ref AbstractImageConverter::convertToFile(const CompressedImageView3D&, Containers::StringView)
* @m_since_latest
*/
ConvertCompressed3DToFile = 1 << 12,
/**
* Convert a 1D image to raw data with
* @ref AbstractImageConverter::convertToData(const ImageView1D&).
* Implies @ref ImageConverterFeature::Convert1DToFile.
* @m_since_latest
*/
Convert1DToData = Convert1DToFile|(1 << 13),
/** /**
* Convert a 2D image to raw data with * Convert a 2D image to raw data with
* @ref AbstractImageConverter::convertToData(const ImageView2D&). * @ref AbstractImageConverter::convertToData(const ImageView2D&).
* Implies @ref ImageConverterFeature::Convert2DToFile. * Implies @ref ImageConverterFeature::Convert2DToFile.
* @m_since_latest * @m_since_latest
*/ */
Convert2DToData = Convert2DToFile|(1 << 4), Convert2DToData = Convert2DToFile|(1 << 13),
#ifdef MAGNUM_BUILD_DEPRECATED #ifdef MAGNUM_BUILD_DEPRECATED
/** /**
@ -127,13 +191,29 @@ enum class ImageConverterFeature: UnsignedInt {
ConvertData CORRADE_DEPRECATED_ENUM("use ImageConverterFeature::Convert2DToData instead") = Convert2DToData, ConvertData CORRADE_DEPRECATED_ENUM("use ImageConverterFeature::Convert2DToData instead") = Convert2DToData,
#endif #endif
/**
* Convert a 3D image to raw data with
* @ref AbstractImageConverter::convertToData(const ImageView3D&).
* Implies @ref ImageConverterFeature::Convert3DToFile.
* @m_since_latest
*/
Convert3DToData = Convert3DToFile|(1 << 13),
/**
* Convert a compressed 1D image to raw data with
* @ref AbstractImageConverter::convertToData(const CompressedImageView1D&).
* Implies @ref ImageConverterFeature::ConvertCompressed1DToFile.
* @m_since_latest
*/
ConvertCompressed1DToData = ConvertCompressed1DToFile|(1 << 13),
/** /**
* Convert a compressed 2D image to raw data with * Convert a compressed 2D image to raw data with
* @ref AbstractImageConverter::convertToData(const CompressedImageView2D&). * @ref AbstractImageConverter::convertToData(const CompressedImageView2D&).
* Implies @ref ImageConverterFeature::ConvertCompressed2DToFile. * Implies @ref ImageConverterFeature::ConvertCompressed2DToFile.
* @m_since_latest * @m_since_latest
*/ */
ConvertCompressed2DToData = ConvertCompressed2DToFile|(1 << 4), ConvertCompressed2DToData = ConvertCompressed2DToFile|(1 << 13),
#ifdef MAGNUM_BUILD_DEPRECATED #ifdef MAGNUM_BUILD_DEPRECATED
/** /**
@ -143,6 +223,14 @@ enum class ImageConverterFeature: UnsignedInt {
*/ */
ConvertCompressedData CORRADE_DEPRECATED_ENUM("use ImageConverterFeature::ConvertCompressed2DToData instead") = ConvertCompressed2DToData, ConvertCompressedData CORRADE_DEPRECATED_ENUM("use ImageConverterFeature::ConvertCompressed2DToData instead") = ConvertCompressed2DToData,
#endif #endif
/**
* Convert a compressed 3D image to raw data with
* @ref AbstractImageConverter::convertToData(const CompressedImageView3D&).
* Implies @ref ImageConverterFeature::ConvertCompressed3DToFile.
* @m_since_latest
*/
ConvertCompressed3DToData = ConvertCompressed3DToFile|(1 << 13)
}; };
/** /**
@ -353,6 +441,21 @@ class MAGNUM_TRADE_EXPORT AbstractImageConverter: public PluginManager::Abstract
*/ */
void clearFlags(ImageConverterFlags flags); void clearFlags(ImageConverterFlags flags);
/**
* @brief Convert a 1D image
* @m_since_latest
*
* Available only if @ref ImageConverterFeature::Convert1D is
* supported. Returns converted image on success,
* @ref Containers::NullOpt otherwise. The implementation is allowed to
* return both a compressed an an uncompressed image, see documentation
* of a particular converter for more information.
* @see @ref features(), @ref convert(const CompressedImageView1D&),
* @ref convert(const ImageData1D&), @ref convertToData(),
* @ref convertToFile(), @ref ImageData::isCompressed()
*/
Containers::Optional<ImageData1D> convert(const ImageView1D& image);
/** /**
* @brief Convert a 2D image * @brief Convert a 2D image
* @m_since_latest * @m_since_latest
@ -384,6 +487,36 @@ class MAGNUM_TRADE_EXPORT AbstractImageConverter: public PluginManager::Abstract
CORRADE_DEPRECATED("use convert(const ImageView2D&) instead") Containers::Optional<CompressedImage2D> exportToCompressedImage(const ImageView2D& image); CORRADE_DEPRECATED("use convert(const ImageView2D&) instead") Containers::Optional<CompressedImage2D> exportToCompressedImage(const ImageView2D& image);
#endif #endif
/**
* @brief Convert a 3D image
* @m_since_latest
*
* Available only if @ref ImageConverterFeature::Convert3D is
* supported. Returns converted image on success,
* @ref Containers::NullOpt otherwise. The implementation is allowed to
* return both a compressed an an uncompressed image, see documentation
* of a particular converter for more information.
* @see @ref features(), @ref convert(const CompressedImageView3D&),
* @ref convert(const ImageData3D&), @ref convertToData(),
* @ref convertToFile(), @ref ImageData::isCompressed()
*/
Containers::Optional<ImageData3D> convert(const ImageView3D& image);
/**
* @brief Convert a compressed 1D image
* @m_since_latest
*
* Available only if @ref ImageConverterFeature::ConvertCompressed1D is
* supported. Returns converted image on success,
* @ref Containers::NullOpt otherwise. The implementation is allowed to
* return both a compressed an an uncompressed image, see documentation
* of a particular converter for more information.
* @see @ref features(), @ref convert(const ImageView1D&),
* @ref convert(const ImageData1D&), @ref convertToData(),
* @ref convertToFile(), @ref ImageData::isCompressed()
*/
Containers::Optional<ImageData1D> convert(const CompressedImageView1D& image);
/** /**
* @brief Convert a compressed 2D image * @brief Convert a compressed 2D image
* @m_since_latest * @m_since_latest
@ -399,6 +532,33 @@ class MAGNUM_TRADE_EXPORT AbstractImageConverter: public PluginManager::Abstract
*/ */
Containers::Optional<ImageData2D> convert(const CompressedImageView2D& image); Containers::Optional<ImageData2D> convert(const CompressedImageView2D& image);
/**
* @brief Convert a compressed 3D image
* @m_since_latest
*
* Available only if @ref ImageConverterFeature::ConvertCompressed3D is
* supported. Returns converted image on success,
* @ref Containers::NullOpt otherwise. The implementation is allowed to
* return both a compressed an an uncompressed image, see documentation
* of a particular converter for more information.
* @see @ref features(), @ref convert(const ImageView3D&),
* @ref convert(const ImageData3D&), @ref convertToData(),
* @ref convertToFile(), @ref ImageData::isCompressed()
*/
Containers::Optional<ImageData3D> convert(const CompressedImageView3D& image);
/**
* @brief Convert a 1D image data
* @m_since_latest
*
* Based on whether the image is compressed or not, calls either
* @ref convert(const ImageView1D&) or
* @ref convert(const CompressedImageView1D&). See documentation of
* these two functions for details.
* @see @ref ImageData::isCompressed()
*/
Containers::Optional<ImageData1D> convert(const ImageData1D& image);
/** /**
* @brief Convert a 2D image data * @brief Convert a 2D image data
* @m_since_latest * @m_since_latest
@ -411,6 +571,30 @@ class MAGNUM_TRADE_EXPORT AbstractImageConverter: public PluginManager::Abstract
*/ */
Containers::Optional<ImageData2D> convert(const ImageData2D& image); Containers::Optional<ImageData2D> convert(const ImageData2D& image);
/**
* @brief Convert a 3D image data
* @m_since_latest
*
* Based on whether the image is compressed or not, calls either
* @ref convert(const ImageView3D&) or
* @ref convert(const CompressedImageView3D&). See documentation of
* these two functions for details.
* @see @ref ImageData::isCompressed()
*/
Containers::Optional<ImageData3D> convert(const ImageData3D& image);
/**
* @brief Convert a 1D image to a raw data
* @m_since_latest
*
* Available only if @ref ImageConverterFeature::Convert1DToData is
* supported. Returns data on success, @cpp nullptr @ce otherwise.
* @see @ref features(), @ref convertToData(const CompressedImageView1D&),
* @ref convertToData(const ImageData1D&), @ref convert(),
* @ref convertToFile()
*/
Containers::Array<char> convertToData(const ImageView1D& image);
/** /**
* @brief Convert a 2D image to a raw data * @brief Convert a 2D image to a raw data
* @m_since_latest * @m_since_latest
@ -432,6 +616,30 @@ class MAGNUM_TRADE_EXPORT AbstractImageConverter: public PluginManager::Abstract
CORRADE_DEPRECATED("use convertToData(const ImageView2D&) instead") Containers::Array<char> exportToData(const ImageView2D& image); CORRADE_DEPRECATED("use convertToData(const ImageView2D&) instead") Containers::Array<char> exportToData(const ImageView2D& image);
#endif #endif
/**
* @brief Convert a 3D image to a raw data
* @m_since_latest
*
* Available only if @ref ImageConverterFeature::Convert3DToData is
* supported. Returns data on success, @cpp nullptr @ce otherwise.
* @see @ref features(), @ref convertToData(const CompressedImageView3D&),
* @ref convertToData(const ImageData3D&), @ref convert(),
* @ref convertToFile()
*/
Containers::Array<char> convertToData(const ImageView3D& image);
/**
* @brief Convert a compressed 1D image to a raw data
* @m_since_latest
*
* Available only if @ref ImageConverterFeature::ConvertCompressed1DToData
* is supported. Returns data on success, @cpp nullptr @ce otherwise.
* @see @ref features(), @ref convertToData(const ImageView1D&),
* @ref convertToData(const ImageData1D&), @ref convert(),
* @ref convertToFile()
*/
Containers::Array<char> convertToData(const CompressedImageView1D& image);
/** /**
* @brief Convert a compressed 2D image to a raw data * @brief Convert a compressed 2D image to a raw data
* @m_since_latest * @m_since_latest
@ -453,6 +661,30 @@ class MAGNUM_TRADE_EXPORT AbstractImageConverter: public PluginManager::Abstract
CORRADE_DEPRECATED("use convertToData(const CompressedImageView2D&) instead") Containers::Array<char> exportToData(const CompressedImageView2D& image); CORRADE_DEPRECATED("use convertToData(const CompressedImageView2D&) instead") Containers::Array<char> exportToData(const CompressedImageView2D& image);
#endif #endif
/**
* @brief Convert a compressed 3D image to a raw data
* @m_since_latest
*
* Available only if @ref ImageConverterFeature::ConvertCompressed3DToData
* is supported. Returns data on success, @cpp nullptr @ce otherwise.
* @see @ref features(), @ref convertToData(const ImageView3D&),
* @ref convertToData(const ImageData3D&), @ref convert()
* @ref convertToFile()
*/
Containers::Array<char> convertToData(const CompressedImageView3D& image);
/**
* @brief Convert a 1D image data to a raw data
* @m_since_latest
*
* Based on whether the image is compressed or not, calls either
* @ref convertToData(const ImageView1D&) or
* @ref convertToData(const CompressedImageView1D&). See documentation
* of these two functions for details.
* @see @ref ImageData::isCompressed()
*/
Containers::Array<char> convertToData(const ImageData1D& image);
/** /**
* @brief Convert a 2D image data to a raw data * @brief Convert a 2D image data to a raw data
* @m_since_latest * @m_since_latest
@ -474,6 +706,31 @@ class MAGNUM_TRADE_EXPORT AbstractImageConverter: public PluginManager::Abstract
CORRADE_DEPRECATED("use convertToData(const ImageView2D&) instead") Containers::Array<char> exportToData(const ImageData2D& image); CORRADE_DEPRECATED("use convertToData(const ImageView2D&) instead") Containers::Array<char> exportToData(const ImageData2D& image);
#endif #endif
/**
* @brief Convert a 3D image data to a raw data
* @m_since_latest
*
* Based on whether the image is compressed or not, calls either
* @ref convertToData(const ImageView3D&) or
* @ref convertToData(const CompressedImageView3D&). See documentation
* of these two functions for details.
* @see @ref ImageData::isCompressed()
*/
Containers::Array<char> convertToData(const ImageData3D& image);
/**
* @brief Convert a 1D image to a file
* @m_since_latest
*
* Available only if @ref ImageConverterFeature::Convert1DToFile or
* @ref ImageConverterFeature::Convert1DToData is supported. Returns
* @cpp true @ce on success, @cpp false @ce otherwise.
* @see @ref features(), @ref convertToFile(const CompressedImageView1D&, Containers::StringView),
* @ref convertToFile(const ImageData1D&, Containers::StringView),
* @ref convert(), @ref convertToData()
*/
bool convertToFile(const ImageView1D& image, Containers::StringView filename);
/** /**
* @brief Convert a 2D image to a file * @brief Convert a 2D image to a file
* @m_since_latest * @m_since_latest
@ -497,6 +754,33 @@ class MAGNUM_TRADE_EXPORT AbstractImageConverter: public PluginManager::Abstract
CORRADE_DEPRECATED("use convertToFile(const ImageView2D&, Containers::StringView) instead") bool exportToFile(const ImageView2D& image, const std::string& filename); CORRADE_DEPRECATED("use convertToFile(const ImageView2D&, Containers::StringView) instead") bool exportToFile(const ImageView2D& image, const std::string& filename);
#endif #endif
/**
* @brief Convert a 3D image to a file
* @m_since_latest
*
* Available only if @ref ImageConverterFeature::Convert3DToFile or
* @ref ImageConverterFeature::Convert3DToData is supported. Returns
* @cpp true @ce on success, @cpp false @ce otherwise.
* @see @ref features(), @ref convertToFile(const CompressedImageView3D&, Containers::StringView),
* @ref convertToFile(const ImageData3D&, Containers::StringView),
* @ref convert(), @ref convertToData()
*/
bool convertToFile(const ImageView3D& image, Containers::StringView filename);
/**
* @brief Convert a compressed 1D image to a file
* @m_since_latest
*
* Available only if @ref ImageConverterFeature::ConvertCompressed1DToFile
* or @ref ImageConverterFeature::ConvertCompressed1DToData is
* supported. Returns @cpp true @ce on success, @cpp false @ce
* otherwise.
* @see @ref features(), @ref convertToFile(const ImageView1D&, Containers::StringView),
* @ref convertToFile(const ImageData1D&, Containers::StringView),
* @ref convert(), @ref convertToData()
*/
bool convertToFile(const CompressedImageView1D& image, Containers::StringView filename);
/** /**
* @brief Convert a compressed 2D image to a file * @brief Convert a compressed 2D image to a file
* @m_since_latest * @m_since_latest
@ -521,6 +805,32 @@ class MAGNUM_TRADE_EXPORT AbstractImageConverter: public PluginManager::Abstract
CORRADE_DEPRECATED("use convertToFile(const CompressedImageView2D&, Containers::StringView) instead") bool exportToFile(const CompressedImageView2D& image, const std::string& filename); CORRADE_DEPRECATED("use convertToFile(const CompressedImageView2D&, Containers::StringView) instead") bool exportToFile(const CompressedImageView2D& image, const std::string& filename);
#endif #endif
/**
* @brief Convert a compressed 3D image to a file
* @m_since_latest
*
* Available only if @ref ImageConverterFeature::ConvertCompressed3DToFile
* or @ref ImageConverterFeature::ConvertCompressed3DToData is
* supported. Returns @cpp true @ce on success, @cpp false @ce
* otherwise.
* @see @ref features(), @ref convertToFile(const ImageView3D&, Containers::StringView),
* @ref convertToFile(const ImageData3D&, Containers::StringView),
* @ref convert(), @ref convertToData()
*/
bool convertToFile(const CompressedImageView3D& image, Containers::StringView filename);
/**
* @brief Convert a 1D image data to a file
* @m_since_latest
*
* Based on whether the image is compressed or not, calls either
* @ref convertToFile(const ImageView1D&, Containers::StringView) or
* @ref convertToFile(const CompressedImageView1D&, Containers::StringView).
* See documentation of these two functions for details.
* @see @ref ImageData::isCompressed()
*/
bool convertToFile(const ImageData1D& image, Containers::StringView filename);
/** /**
* @brief Convert a 2D image data to a file * @brief Convert a 2D image data to a file
* @m_since_latest * @m_since_latest
@ -543,6 +853,18 @@ class MAGNUM_TRADE_EXPORT AbstractImageConverter: public PluginManager::Abstract
CORRADE_DEPRECATED("use convertToFile(const ImageData2D&, Containers::StringView) instead") bool exportToFile(const ImageData2D& image, const std::string& filename); CORRADE_DEPRECATED("use convertToFile(const ImageData2D&, Containers::StringView) instead") bool exportToFile(const ImageData2D& image, const std::string& filename);
#endif #endif
/**
* @brief Convert a 3D image data to a file
* @m_since_latest
*
* Based on whether the image is compressed or not, calls either
* @ref convertToFile(const ImageView3D&, Containers::StringView) or
* @ref convertToFile(const CompressedImageView3D&, Containers::StringView).
* See documentation of these two functions for details.
* @see @ref ImageData::isCompressed()
*/
bool convertToFile(const ImageData3D& image, Containers::StringView filename);
private: private:
/** @brief Implementation for @ref features() */ /** @brief Implementation for @ref features() */
virtual ImageConverterFeatures doFeatures() const = 0; virtual ImageConverterFeatures doFeatures() const = 0;
@ -563,30 +885,88 @@ class MAGNUM_TRADE_EXPORT AbstractImageConverter: public PluginManager::Abstract
*/ */
virtual void doSetFlags(ImageConverterFlags flags); virtual void doSetFlags(ImageConverterFlags flags);
/**
* @brief Implementation for @ref convert(const ImageView1D&)
* @m_since_latest
*/
virtual Containers::Optional<ImageData1D> doConvert(const ImageView1D& image);
/** /**
* @brief Implementation for @ref convert(const ImageView2D&) * @brief Implementation for @ref convert(const ImageView2D&)
* @m_since_latest * @m_since_latest
*/ */
virtual Containers::Optional<ImageData2D> doConvert(const ImageView2D& image); virtual Containers::Optional<ImageData2D> doConvert(const ImageView2D& image);
/**
* @brief Implementation for @ref convert(const ImageView3D&)
* @m_since_latest
*/
virtual Containers::Optional<ImageData3D> doConvert(const ImageView3D& image);
/**
* @brief Implementation for @ref convert(const CompressedImageView1D&)
* @m_since_latest
*/
virtual Containers::Optional<ImageData1D> doConvert(const CompressedImageView1D& image);
/** /**
* @brief Implementation for @ref convert(const CompressedImageView2D&) * @brief Implementation for @ref convert(const CompressedImageView2D&)
* @m_since_latest * @m_since_latest
*/ */
virtual Containers::Optional<ImageData2D> doConvert(const CompressedImageView2D& image); virtual Containers::Optional<ImageData2D> doConvert(const CompressedImageView2D& image);
/**
* @brief Implementation for @ref convert(const CompressedImageView3D&)
* @m_since_latest
*/
virtual Containers::Optional<ImageData3D> doConvert(const CompressedImageView3D& image);
/**
* @brief Implementation for @ref convertToData(const ImageView1D&)
* @m_since_latest
*/
virtual Containers::Array<char> doConvertToData(const ImageView1D& image);
/** /**
* @brief Implementation for @ref convertToData(const ImageView2D&) * @brief Implementation for @ref convertToData(const ImageView2D&)
* @m_since_latest * @m_since_latest
*/ */
virtual Containers::Array<char> doConvertToData(const ImageView2D& image); virtual Containers::Array<char> doConvertToData(const ImageView2D& image);
/**
* @brief Implementation for @ref convertToData(const ImageView3D&)
* @m_since_latest
*/
virtual Containers::Array<char> doConvertToData(const ImageView3D& image);
/**
* @brief Implementation for @ref convertToData(const CompressedImageView1D&)
* @m_since_latest
*/
virtual Containers::Array<char> doConvertToData(const CompressedImageView1D& image);
/** /**
* @brief Implementation for @ref convertToData(const CompressedImageView2D&) * @brief Implementation for @ref convertToData(const CompressedImageView2D&)
* @m_since_latest * @m_since_latest
*/ */
virtual Containers::Array<char> doConvertToData(const CompressedImageView2D& image); virtual Containers::Array<char> doConvertToData(const CompressedImageView2D& image);
/**
* @brief Implementation for @ref convertToData(const CompressedImageView3D&)
* @m_since_latest
*/
virtual Containers::Array<char> doConvertToData(const CompressedImageView3D& image);
/**
* @brief Implementation for @ref convertToFile(const ImageView1D&, Containers::StringView)
* @m_since_latest
*
* If @ref ImageConverterFeature::Convert1DToData is supported, default
* implementation calls @ref doConvertToData(const ImageView1D&) and
* saves the result to given file.
*/
virtual bool doConvertToFile(const ImageView1D& image, Containers::StringView filename);
/** /**
* @brief Implementation for @ref convertToFile(const ImageView2D&, Containers::StringView) * @brief Implementation for @ref convertToFile(const ImageView2D&, Containers::StringView)
* @m_since_latest * @m_since_latest
@ -597,6 +977,26 @@ class MAGNUM_TRADE_EXPORT AbstractImageConverter: public PluginManager::Abstract
*/ */
virtual bool doConvertToFile(const ImageView2D& image, Containers::StringView filename); virtual bool doConvertToFile(const ImageView2D& image, Containers::StringView filename);
/**
* @brief Implementation for @ref convertToFile(const ImageView3D&, Containers::StringView)
* @m_since_latest
*
* If @ref ImageConverterFeature::Convert3DToData is supported, default
* implementation calls @ref doConvertToData(const ImageView3D&) and
* saves the result to given file.
*/
virtual bool doConvertToFile(const ImageView3D& image, Containers::StringView filename);
/**
* @brief Implementation for @ref convertToFile(const CompressedImageView1D&, Containers::StringView)
* @m_since_latest
*
* If @ref ImageConverterFeature::ConvertCompressed1DToData is
* supported, default implementation calls @ref doConvertToData(const CompressedImageView1D&)
* and saves the result to given file.
*/
virtual bool doConvertToFile(const CompressedImageView1D& image, Containers::StringView filename);
/** /**
* @brief Implementation for @ref convertToFile(const CompressedImageView2D&, Containers::StringView) * @brief Implementation for @ref convertToFile(const CompressedImageView2D&, Containers::StringView)
* @m_since_latest * @m_since_latest
@ -607,6 +1007,16 @@ class MAGNUM_TRADE_EXPORT AbstractImageConverter: public PluginManager::Abstract
*/ */
virtual bool doConvertToFile(const CompressedImageView2D& image, Containers::StringView filename); virtual bool doConvertToFile(const CompressedImageView2D& image, Containers::StringView filename);
/**
* @brief Implementation for @ref convertToFile(const CompressedImageView3D&, Containers::StringView)
* @m_since_latest
*
* If @ref ImageConverterFeature::ConvertCompressed3DToData is
* supported, default implementation calls @ref doConvertToData(const CompressedImageView3D&)
* and saves the result to given file.
*/
virtual bool doConvertToFile(const CompressedImageView3D& image, Containers::StringView filename);
ImageConverterFlags _flags; ImageConverterFlags _flags;
}; };

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

File diff suppressed because it is too large Load Diff
Loading…
Cancel
Save