Browse Source

AnyImageConverter: support KTX2 also in 3D and 2D/3D levels code paths.

And prefere to use it onver OpenEXR in most AnyImage{Converter,Importer}
tests, unless the test really needs something that only OpenEXR has
(such as the verbose output for threads or configuration that needs to
be set on both export and import to make the import succeed).
pull/542/merge
Vladimír Vondruš 4 years ago
parent
commit
1f33071b3c
  1. 6
      src/MagnumPlugins/AnyImageConverter/AnyImageConverter.cpp
  2. 147
      src/MagnumPlugins/AnyImageConverter/Test/AnyImageConverterTest.cpp
  3. 6
      src/MagnumPlugins/AnyImageConverter/Test/CMakeLists.txt
  4. 2
      src/MagnumPlugins/AnyImageConverter/Test/configure.h.cmake
  5. BIN
      src/MagnumPlugins/AnyImageImporter/Test/3d.ktx2
  6. 10
      src/MagnumPlugins/AnyImageImporter/Test/AnyImageImporterTest.cpp
  7. 10
      src/MagnumPlugins/AnyImageImporter/Test/CMakeLists.txt
  8. 2
      src/MagnumPlugins/AnyImageImporter/Test/configure.h.cmake
  9. BIN
      src/MagnumPlugins/AnyImageImporter/Test/cube.exr

6
src/MagnumPlugins/AnyImageConverter/AnyImageConverter.cpp

@ -144,6 +144,8 @@ bool AnyImageConverter::doConvertToFile(const ImageView3D& image, const Containe
Containers::StringView plugin; Containers::StringView plugin;
if(normalized.hasSuffix(".exr"_s)) if(normalized.hasSuffix(".exr"_s))
plugin = "OpenExrImageConverter"_s; plugin = "OpenExrImageConverter"_s;
else if(normalized.hasSuffix(".ktx2"_s))
plugin = "KtxImageConverter"_s;
else { else {
Error{} << "Trade::AnyImageConverter::convertToFile(): cannot determine the format of" << filename << "for a 3D image"; Error{} << "Trade::AnyImageConverter::convertToFile(): cannot determine the format of" << filename << "for a 3D image";
return false; return false;
@ -223,6 +225,8 @@ bool AnyImageConverter::doConvertToFile(const Containers::ArrayView<const ImageV
Containers::StringView plugin; Containers::StringView plugin;
if(normalized.hasSuffix(".exr"_s)) if(normalized.hasSuffix(".exr"_s))
plugin = "OpenExrImageConverter"_s; plugin = "OpenExrImageConverter"_s;
else if(normalized.hasSuffix(".ktx2"_s))
plugin = "KtxImageConverter"_s;
else { else {
Error{} << "Trade::AnyImageConverter::convertToFile(): cannot determine the format of" << filename << "for a multi-level 2D image"; Error{} << "Trade::AnyImageConverter::convertToFile(): cannot determine the format of" << filename << "for a multi-level 2D image";
return false; return false;
@ -266,6 +270,8 @@ bool AnyImageConverter::doConvertToFile(const Containers::ArrayView<const ImageV
Containers::StringView plugin; Containers::StringView plugin;
if(normalized.hasSuffix(".exr"_s)) if(normalized.hasSuffix(".exr"_s))
plugin = "OpenExrImageConverter"_s; plugin = "OpenExrImageConverter"_s;
else if(normalized.hasSuffix(".ktx2"_s))
plugin = "KtxImageConverter"_s;
else { else {
Error{} << "Trade::AnyImageConverter::convertToFile(): cannot determine the format of" << filename << "for a multi-level 3D image"; Error{} << "Trade::AnyImageConverter::convertToFile(): cannot determine the format of" << filename << "for a multi-level 3D image";
return false; return false;

147
src/MagnumPlugins/AnyImageConverter/Test/AnyImageConverterTest.cpp

@ -157,6 +157,7 @@ constexpr struct {
const char* plugin; const char* plugin;
} Detect3DData[]{ } Detect3DData[]{
{"EXR", "file.exr", "OpenExrImageConverter"}, {"EXR", "file.exr", "OpenExrImageConverter"},
{"KTX2", "file.ktx2", "KtxImageConverter"},
/* Have at least one test case with uppercase */ /* Have at least one test case with uppercase */
{"EXR uppercase", "FIL~1.EXR", "OpenExrImageConverter"} {"EXR uppercase", "FIL~1.EXR", "OpenExrImageConverter"}
}; };
@ -167,6 +168,7 @@ constexpr struct {
const char* plugin; const char* plugin;
} DetectLevels2DData[]{ } DetectLevels2DData[]{
{"EXR", "file.exr", "OpenExrImageConverter"}, {"EXR", "file.exr", "OpenExrImageConverter"},
{"KTX2", "file.ktx2", "KtxImageConverter"},
/* Have at least one test case with uppercase */ /* Have at least one test case with uppercase */
{"EXR uppercase", "FIL~1.EXR", "OpenExrImageConverter"} {"EXR uppercase", "FIL~1.EXR", "OpenExrImageConverter"}
}; };
@ -177,6 +179,7 @@ constexpr struct {
const char* plugin; const char* plugin;
} DetectLevels3DData[]{ } DetectLevels3DData[]{
{"EXR", "file.exr", "OpenExrImageConverter"}, {"EXR", "file.exr", "OpenExrImageConverter"},
{"KTX2", "file.ktx2", "KtxImageConverter"},
/* Have at least one test case with uppercase */ /* Have at least one test case with uppercase */
{"EXR uppercase", "FIL~1.EXR", "OpenExrImageConverter"} {"EXR uppercase", "FIL~1.EXR", "OpenExrImageConverter"}
}; };
@ -346,20 +349,20 @@ void AnyImageConverterTest::convert3D() {
CORRADE_VERIFY(manager.load(ANYIMAGECONVERTER_PLUGIN_FILENAME) & PluginManager::LoadState::Loaded); CORRADE_VERIFY(manager.load(ANYIMAGECONVERTER_PLUGIN_FILENAME) & PluginManager::LoadState::Loaded);
#endif #endif
if(manager.loadState("OpenExrImageConverter") < PluginManager::LoadState::Loaded) if(manager.loadState("KtxImageConverter") < PluginManager::LoadState::Loaded)
CORRADE_SKIP("OpenExrImageConverter plugin can't be loaded."); CORRADE_SKIP("KtxImageConverter plugin can't be loaded.");
const std::string filename = Utility::Directory::join(ANYIMAGECONVERTER_TEST_OUTPUT_DIR, "cube.exr"); const std::string filename = Utility::Directory::join(ANYIMAGECONVERTER_TEST_OUTPUT_DIR, "3d.ktx2");
if(Utility::Directory::exists(filename)) if(Utility::Directory::exists(filename))
CORRADE_VERIFY(Utility::Directory::rm(filename)); CORRADE_VERIFY(Utility::Directory::rm(filename));
Containers::Pointer<AbstractImageConverter> converter = manager.instantiate("AnyImageConverter"); Containers::Pointer<AbstractImageConverter> converter = manager.instantiate("AnyImageConverter");
/* Well, this is in fact the same as propagateConfiguration3D() but we CORRADE_VERIFY(converter->convertToFile(Image3D, filename));
can't really do much else. */ /* Compare to an expected output to ensure we actually saved the file
converter->configuration().setValue("envmap", "cube"); including the metadata. This also doubles as a generator for the
CORRADE_VERIFY(converter->convertToFile(ImageCube, filename)); 3d.exr file that AnyImageImporterTest uses. */
CORRADE_VERIFY(Utility::Directory::exists(filename)); CORRADE_COMPARE_AS(filename, KTX_3D_FILE, TestSuite::Compare::File);
} }
void AnyImageConverterTest::convertCompressed1D() { void AnyImageConverterTest::convertCompressed1D() {
@ -384,10 +387,10 @@ void AnyImageConverterTest::convertLevels2D() {
CORRADE_VERIFY(manager.load(ANYIMAGECONVERTER_PLUGIN_FILENAME) & PluginManager::LoadState::Loaded); CORRADE_VERIFY(manager.load(ANYIMAGECONVERTER_PLUGIN_FILENAME) & PluginManager::LoadState::Loaded);
#endif #endif
if(manager.loadState("OpenExrImageConverter") < PluginManager::LoadState::Loaded) if(manager.loadState("KtxImageConverter") < PluginManager::LoadState::Loaded)
CORRADE_SKIP("OpenExrImageConverter plugin can't be loaded."); CORRADE_SKIP("KtxImageConverter plugin can't be loaded.");
const std::string filename = Utility::Directory::join(ANYIMAGECONVERTER_TEST_OUTPUT_DIR, "output.exr"); const std::string filename = Utility::Directory::join(ANYIMAGECONVERTER_TEST_OUTPUT_DIR, "levels-2d.ktx2");
if(Utility::Directory::exists(filename)) if(Utility::Directory::exists(filename))
CORRADE_VERIFY(Utility::Directory::rm(filename)); CORRADE_VERIFY(Utility::Directory::rm(filename));
@ -396,7 +399,7 @@ void AnyImageConverterTest::convertLevels2D() {
Containers::Pointer<AbstractImageConverter> converter = manager.instantiate("AnyImageConverter"); Containers::Pointer<AbstractImageConverter> converter = manager.instantiate("AnyImageConverter");
/* Using the list API even though there's just one image, which should /* Using the list API even though there's just one image, which should
still trigger the correct code path for AnyImageConverter. */ still trigger the correct code path for AnyImageConverter. */
CORRADE_VERIFY(converter->convertToFile({Image2DFloat}, filename)); CORRADE_VERIFY(converter->convertToFile({Image2D}, filename));
CORRADE_VERIFY(Utility::Directory::exists(filename)); CORRADE_VERIFY(Utility::Directory::exists(filename));
} }
@ -406,21 +409,19 @@ void AnyImageConverterTest::convertLevels3D() {
CORRADE_VERIFY(manager.load(ANYIMAGECONVERTER_PLUGIN_FILENAME) & PluginManager::LoadState::Loaded); CORRADE_VERIFY(manager.load(ANYIMAGECONVERTER_PLUGIN_FILENAME) & PluginManager::LoadState::Loaded);
#endif #endif
if(manager.loadState("OpenExrImageConverter") < PluginManager::LoadState::Loaded) if(manager.loadState("KtxImageConverter") < PluginManager::LoadState::Loaded)
CORRADE_SKIP("OpenExrImageConverter plugin can't be loaded."); CORRADE_SKIP("KtxImageConverter plugin can't be loaded.");
const std::string filename = Utility::Directory::join(ANYIMAGECONVERTER_TEST_OUTPUT_DIR, "cube.exr"); const std::string filename = Utility::Directory::join(ANYIMAGECONVERTER_TEST_OUTPUT_DIR, "levels-3d.ktx2");
if(Utility::Directory::exists(filename)) if(Utility::Directory::exists(filename))
CORRADE_VERIFY(Utility::Directory::rm(filename)); CORRADE_VERIFY(Utility::Directory::rm(filename));
/* Just test that the exported file exists */
Containers::Pointer<AbstractImageConverter> converter = manager.instantiate("AnyImageConverter"); Containers::Pointer<AbstractImageConverter> converter = manager.instantiate("AnyImageConverter");
/* Well, this is in fact the same as propagateConfigurationLevels3D() but
we can't really do much else. */
converter->configuration().setValue("envmap", "cube");
/* Using the list API even though there's just one image, which should /* Using the list API even though there's just one image, which should
still trigger the correct code path for AnyImageConverter. */ still trigger the correct code path for AnyImageConverter. */
CORRADE_VERIFY(converter->convertToFile({ImageCube}, filename)); CORRADE_VERIFY(converter->convertToFile({Image3D}, filename));
CORRADE_VERIFY(Utility::Directory::exists(filename)); CORRADE_VERIFY(Utility::Directory::exists(filename));
} }
@ -582,8 +583,8 @@ void AnyImageConverterTest::unknown3D() {
std::ostringstream out; std::ostringstream out;
Error redirectError{&out}; Error redirectError{&out};
CORRADE_VERIFY(!converter->convertToFile(Image3D, "image.ktx2")); CORRADE_VERIFY(!converter->convertToFile(Image3D, "image.dds"));
CORRADE_COMPARE(out.str(), "Trade::AnyImageConverter::convertToFile(): cannot determine the format of image.ktx2 for a 3D image\n"); CORRADE_COMPARE(out.str(), "Trade::AnyImageConverter::convertToFile(): cannot determine the format of image.dds for a 3D image\n");
} }
void AnyImageConverterTest::unknownCompressed1D() { void AnyImageConverterTest::unknownCompressed1D() {
@ -627,8 +628,8 @@ void AnyImageConverterTest::unknownLevels2D() {
std::ostringstream out; std::ostringstream out;
Error redirectError{&out}; Error redirectError{&out};
CORRADE_VERIFY(!converter->convertToFile({Image2D}, "image.ktx2")); CORRADE_VERIFY(!converter->convertToFile({Image2D}, "image.dds"));
CORRADE_COMPARE(out.str(), "Trade::AnyImageConverter::convertToFile(): cannot determine the format of image.ktx2 for a multi-level 2D image\n"); CORRADE_COMPARE(out.str(), "Trade::AnyImageConverter::convertToFile(): cannot determine the format of image.dds for a multi-level 2D image\n");
} }
void AnyImageConverterTest::unknownLevels3D() { void AnyImageConverterTest::unknownLevels3D() {
@ -636,8 +637,8 @@ void AnyImageConverterTest::unknownLevels3D() {
std::ostringstream out; std::ostringstream out;
Error redirectError{&out}; Error redirectError{&out};
CORRADE_VERIFY(!converter->convertToFile({Image3D}, "image.ktx2")); CORRADE_VERIFY(!converter->convertToFile({Image3D}, "image.dds"));
CORRADE_COMPARE(out.str(), "Trade::AnyImageConverter::convertToFile(): cannot determine the format of image.ktx2 for a multi-level 3D image\n"); CORRADE_COMPARE(out.str(), "Trade::AnyImageConverter::convertToFile(): cannot determine the format of image.dds for a multi-level 3D image\n");
} }
void AnyImageConverterTest::unknownCompressedLevels1D() { void AnyImageConverterTest::unknownCompressedLevels1D() {
@ -868,7 +869,8 @@ void AnyImageConverterTest::propagateConfiguration2D() {
converter->configuration().setValue("depth", "height"); converter->configuration().setValue("depth", "height");
CORRADE_VERIFY(converter->convertToFile(Image2DFloat, filename)); CORRADE_VERIFY(converter->convertToFile(Image2DFloat, filename));
/* Compare to an expected output to ensure the custom channels names were /* Compare to an expected output to ensure the custom channels names were
used */ used. This also doubles as a generator for the
depth32f-custom-channels.exr file that AnyImageImporterTest uses. */
CORRADE_COMPARE_AS(filename, EXR_FILE, TestSuite::Compare::File); CORRADE_COMPARE_AS(filename, EXR_FILE, TestSuite::Compare::File);
} }
@ -878,23 +880,20 @@ void AnyImageConverterTest::propagateConfiguration3D() {
CORRADE_VERIFY(manager.load(ANYIMAGECONVERTER_PLUGIN_FILENAME) & PluginManager::LoadState::Loaded); CORRADE_VERIFY(manager.load(ANYIMAGECONVERTER_PLUGIN_FILENAME) & PluginManager::LoadState::Loaded);
#endif #endif
if(manager.loadState("OpenExrImageConverter") < PluginManager::LoadState::Loaded) if(manager.loadState("KtxImageConverter") < PluginManager::LoadState::Loaded)
CORRADE_SKIP("OpenExrImageConverter plugin can't be loaded."); CORRADE_SKIP("KtxImageConverter plugin can't be loaded.");
const std::string filename = Utility::Directory::join(ANYIMAGECONVERTER_TEST_OUTPUT_DIR, "cube.exr"); const std::string filename = Utility::Directory::join(ANYIMAGECONVERTER_TEST_OUTPUT_DIR, "custom-writer-3d.ktx2");
if(Utility::Directory::exists(filename)) if(Utility::Directory::exists(filename))
CORRADE_VERIFY(Utility::Directory::rm(filename)); CORRADE_VERIFY(Utility::Directory::rm(filename));
Containers::Pointer<AbstractImageConverter> converter = manager.instantiate("AnyImageConverter"); Containers::Pointer<AbstractImageConverter> converter = manager.instantiate("AnyImageConverter");
/* This should be enough to test -- 3D images can be saved only if this converter->configuration().setValue("writerName", "Yello this did Magnum!");
option is set */ CORRADE_VERIFY(converter->convertToFile(Image3D, filename));
converter->configuration().setValue("envmap", "cube"); CORRADE_VERIFY(Utility::Directory::exists(filename));
CORRADE_VERIFY(converter->convertToFile(ImageCube, filename)); /** @todo clean up once Directory::readString() returns our String */
/* Compare to an expected output to ensure we actually saved the file CORRADE_VERIFY(Containers::StringView{Containers::ArrayView<const char>(Utility::Directory::read(filename))}.contains("KTXwriter\0Yello this did Magnum!"));
including the metadata. This also doubles as a generator for the
cube.exr file that AnyImageImporterTest uses. */
CORRADE_COMPARE_AS(filename, EXR_CUBE_FILE, TestSuite::Compare::File);
} }
void AnyImageConverterTest::propagateConfigurationUnknown1D() { void AnyImageConverterTest::propagateConfigurationUnknown1D() {
@ -921,18 +920,17 @@ void AnyImageConverterTest::propagateConfigurationUnknown3D() {
CORRADE_VERIFY(manager.load(ANYIMAGECONVERTER_PLUGIN_FILENAME) & PluginManager::LoadState::Loaded); CORRADE_VERIFY(manager.load(ANYIMAGECONVERTER_PLUGIN_FILENAME) & PluginManager::LoadState::Loaded);
#endif #endif
if(manager.loadState("OpenExrImageConverter") < PluginManager::LoadState::Loaded) if(manager.loadState("KtxImageConverter") < PluginManager::LoadState::Loaded)
CORRADE_SKIP("OpenExrImageConverter plugin can't be loaded."); CORRADE_SKIP("KtxImageConverter plugin can't be loaded.");
/* Just test that the exported file exists */ /* Just test that the exported file exists */
Containers::Pointer<AbstractImageConverter> converter = manager.instantiate("AnyImageConverter"); Containers::Pointer<AbstractImageConverter> converter = manager.instantiate("AnyImageConverter");
converter->configuration().setValue("envmap", "cube");
converter->configuration().setValue("noSuchOption", "isHere"); converter->configuration().setValue("noSuchOption", "isHere");
std::ostringstream out; std::ostringstream out;
Warning redirectWarning{&out}; Warning redirectWarning{&out};
CORRADE_VERIFY(converter->convertToFile(ImageCube, Utility::Directory::join(ANYIMAGECONVERTER_TEST_OUTPUT_DIR, "output.exr"))); CORRADE_VERIFY(converter->convertToFile(Image3D, Utility::Directory::join(ANYIMAGECONVERTER_TEST_OUTPUT_DIR, "3d.ktx2")));
CORRADE_COMPARE(out.str(), "Trade::AnyImageConverter::convertToFile(): option noSuchOption not recognized by OpenExrImageConverter\n"); CORRADE_COMPARE(out.str(), "Trade::AnyImageConverter::convertToFile(): option noSuchOption not recognized by KtxImageConverter\n");
} }
void AnyImageConverterTest::propagateConfigurationCompressed1D() { void AnyImageConverterTest::propagateConfigurationCompressed1D() {
@ -969,25 +967,22 @@ void AnyImageConverterTest::propagateConfigurationLevels2D() {
CORRADE_VERIFY(manager.load(ANYIMAGECONVERTER_PLUGIN_FILENAME) & PluginManager::LoadState::Loaded); CORRADE_VERIFY(manager.load(ANYIMAGECONVERTER_PLUGIN_FILENAME) & PluginManager::LoadState::Loaded);
#endif #endif
if(manager.loadState("OpenExrImageConverter") < PluginManager::LoadState::Loaded) if(manager.loadState("KtxImageConverter") < PluginManager::LoadState::Loaded)
CORRADE_SKIP("OpenExrImageConverter plugin can't be loaded."); CORRADE_SKIP("KtxImageConverter plugin can't be loaded.");
const std::string filename = Utility::Directory::join(ANYIMAGECONVERTER_TEST_OUTPUT_DIR, "depth32f-custom-channels.exr"); const std::string filename = Utility::Directory::join(ANYIMAGECONVERTER_TEST_OUTPUT_DIR, "custom-writer-2d.ktx2");
if(Utility::Directory::exists(filename)) if(Utility::Directory::exists(filename))
CORRADE_VERIFY(Utility::Directory::rm(filename)); CORRADE_VERIFY(Utility::Directory::rm(filename));
Containers::Pointer<AbstractImageConverter> converter = manager.instantiate("AnyImageConverter"); Containers::Pointer<AbstractImageConverter> converter = manager.instantiate("AnyImageConverter");
converter->configuration().setValue("layer", "left"); converter->configuration().setValue("writerName", "Yello this did Magnum!");
converter->configuration().setValue("depth", "height");
/* Using the list API even though there's just one image, which should /* Using the list API even though there's just one image, which should
still trigger the correct code path for AnyImageConverter. For still trigger the correct code path for AnyImageConverter. */
OpenExrImageConverter both single and list are the same code path so we CORRADE_VERIFY(converter->convertToFile({Image2D}, filename));
can reuse the same expected file. */ CORRADE_VERIFY(Utility::Directory::exists(filename));
CORRADE_VERIFY(converter->convertToFile({Image2DFloat}, filename)); /** @todo clean up once Directory::readString() returns our String */
/* Compare to an expected output to ensure the custom channels names were CORRADE_VERIFY(Containers::StringView{Containers::ArrayView<const char>(Utility::Directory::read(filename))}.contains("KTXwriter\0Yello this did Magnum!"));
used */
CORRADE_COMPARE_AS(filename, EXR_FILE, TestSuite::Compare::File);
} }
void AnyImageConverterTest::propagateConfigurationLevels3D() { void AnyImageConverterTest::propagateConfigurationLevels3D() {
@ -996,25 +991,22 @@ void AnyImageConverterTest::propagateConfigurationLevels3D() {
CORRADE_VERIFY(manager.load(ANYIMAGECONVERTER_PLUGIN_FILENAME) & PluginManager::LoadState::Loaded); CORRADE_VERIFY(manager.load(ANYIMAGECONVERTER_PLUGIN_FILENAME) & PluginManager::LoadState::Loaded);
#endif #endif
if(manager.loadState("OpenExrImageConverter") < PluginManager::LoadState::Loaded) if(manager.loadState("KtxImageConverter") < PluginManager::LoadState::Loaded)
CORRADE_SKIP("OpenExrImageConverter plugin can't be loaded."); CORRADE_SKIP("KtxImageConverter plugin can't be loaded.");
const std::string filename = Utility::Directory::join(ANYIMAGECONVERTER_TEST_OUTPUT_DIR, "cube.exr"); const std::string filename = Utility::Directory::join(ANYIMAGECONVERTER_TEST_OUTPUT_DIR, "custom-writer-3d.ktx2");
if(Utility::Directory::exists(filename)) if(Utility::Directory::exists(filename))
CORRADE_VERIFY(Utility::Directory::rm(filename)); CORRADE_VERIFY(Utility::Directory::rm(filename));
Containers::Pointer<AbstractImageConverter> converter = manager.instantiate("AnyImageConverter"); Containers::Pointer<AbstractImageConverter> converter = manager.instantiate("AnyImageConverter");
/* This should be enough to test -- 3D images can be saved only if this converter->configuration().setValue("writerName", "Yello this did Magnum!");
option is set */
converter->configuration().setValue("envmap", "cube");
/* Using the list API even though there's just one image, which should /* Using the list API even though there's just one image, which should
still trigger the correct code path for AnyImageConverter. For still trigger the correct code path for AnyImageConverter. */
OpenExrImageConverter both single and list are the same code path so we CORRADE_VERIFY(converter->convertToFile({Image3D}, filename));
can reuse the same expected file. */ CORRADE_VERIFY(Utility::Directory::exists(filename));
CORRADE_VERIFY(converter->convertToFile({ImageCube}, filename)); /** @todo clean up once Directory::readString() returns our String */
/* Compare to an expected output to ensure we actually saved the file */ CORRADE_VERIFY(Containers::StringView{Containers::ArrayView<const char>(Utility::Directory::read(filename))}.contains("KTXwriter\0Yello this did Magnum!"));
CORRADE_COMPARE_AS(filename, EXR_CUBE_FILE, TestSuite::Compare::File);
} }
void AnyImageConverterTest::propagateConfigurationUnknownLevels1D() { void AnyImageConverterTest::propagateConfigurationUnknownLevels1D() {
@ -1027,13 +1019,8 @@ void AnyImageConverterTest::propagateConfigurationUnknownLevels2D() {
CORRADE_VERIFY(manager.load(ANYIMAGECONVERTER_PLUGIN_FILENAME) & PluginManager::LoadState::Loaded); CORRADE_VERIFY(manager.load(ANYIMAGECONVERTER_PLUGIN_FILENAME) & PluginManager::LoadState::Loaded);
#endif #endif
if(manager.loadState("OpenExrImageConverter") < PluginManager::LoadState::Loaded) if(manager.loadState("KtxImageConverter") < PluginManager::LoadState::Loaded)
CORRADE_SKIP("OpenExrImageConverter plugin can't be loaded."); CORRADE_SKIP("KtxImageConverter plugin can't be loaded.");
const std::string filename = Utility::Directory::join(ANYIMAGECONVERTER_TEST_OUTPUT_DIR, "depth32f-custom-channels.exr");
if(Utility::Directory::exists(filename))
CORRADE_VERIFY(Utility::Directory::rm(filename));
Containers::Pointer<AbstractImageConverter> converter = manager.instantiate("AnyImageConverter"); Containers::Pointer<AbstractImageConverter> converter = manager.instantiate("AnyImageConverter");
converter->configuration().setValue("noSuchOption", "isHere"); converter->configuration().setValue("noSuchOption", "isHere");
@ -1042,8 +1029,8 @@ void AnyImageConverterTest::propagateConfigurationUnknownLevels2D() {
Warning redirectWarning{&out}; Warning redirectWarning{&out};
/* Using the list API even though there's just one image, which should /* Using the list API even though there's just one image, which should
still trigger the correct code path for AnyImageConverter. */ still trigger the correct code path for AnyImageConverter. */
CORRADE_VERIFY(converter->convertToFile({Image2DFloat}, Utility::Directory::join(ANYIMAGECONVERTER_TEST_OUTPUT_DIR, "output.exr"))); CORRADE_VERIFY(converter->convertToFile({Image2D}, Utility::Directory::join(ANYIMAGECONVERTER_TEST_OUTPUT_DIR, "2d.ktx2")));
CORRADE_COMPARE(out.str(), "Trade::AnyImageConverter::convertToFile(): option noSuchOption not recognized by OpenExrImageConverter\n"); CORRADE_COMPARE(out.str(), "Trade::AnyImageConverter::convertToFile(): option noSuchOption not recognized by KtxImageConverter\n");
} }
void AnyImageConverterTest::propagateConfigurationUnknownLevels3D() { void AnyImageConverterTest::propagateConfigurationUnknownLevels3D() {
@ -1052,20 +1039,18 @@ void AnyImageConverterTest::propagateConfigurationUnknownLevels3D() {
CORRADE_VERIFY(manager.load(ANYIMAGECONVERTER_PLUGIN_FILENAME) & PluginManager::LoadState::Loaded); CORRADE_VERIFY(manager.load(ANYIMAGECONVERTER_PLUGIN_FILENAME) & PluginManager::LoadState::Loaded);
#endif #endif
if(manager.loadState("OpenExrImageConverter") < PluginManager::LoadState::Loaded) if(manager.loadState("KtxImageConverter") < PluginManager::LoadState::Loaded)
CORRADE_SKIP("OpenExrImageConverter plugin can't be loaded."); CORRADE_SKIP("KtxImageConverter plugin can't be loaded.");
/* Just test that the exported file exists */
Containers::Pointer<AbstractImageConverter> converter = manager.instantiate("AnyImageConverter"); Containers::Pointer<AbstractImageConverter> converter = manager.instantiate("AnyImageConverter");
converter->configuration().setValue("envmap", "cube");
converter->configuration().setValue("noSuchOption", "isHere"); converter->configuration().setValue("noSuchOption", "isHere");
std::ostringstream out; std::ostringstream out;
Warning redirectWarning{&out}; Warning redirectWarning{&out};
/* Using the list API even though there's just one image, which should /* Using the list API even though there's just one image, which should
still trigger the correct code path for AnyImageConverter. */ still trigger the correct code path for AnyImageConverter. */
CORRADE_VERIFY(converter->convertToFile({ImageCube}, Utility::Directory::join(ANYIMAGECONVERTER_TEST_OUTPUT_DIR, "output.exr"))); CORRADE_VERIFY(converter->convertToFile({Image3D}, Utility::Directory::join(ANYIMAGECONVERTER_TEST_OUTPUT_DIR, "3d.ktx2")));
CORRADE_COMPARE(out.str(), "Trade::AnyImageConverter::convertToFile(): option noSuchOption not recognized by OpenExrImageConverter\n"); CORRADE_COMPARE(out.str(), "Trade::AnyImageConverter::convertToFile(): option noSuchOption not recognized by KtxImageConverter\n");
} }
void AnyImageConverterTest::propagateConfigurationCompressedLevels1D() { void AnyImageConverterTest::propagateConfigurationCompressedLevels1D() {

6
src/MagnumPlugins/AnyImageConverter/Test/CMakeLists.txt

@ -29,12 +29,12 @@ find_package(Threads REQUIRED)
if(CORRADE_TARGET_EMSCRIPTEN OR CORRADE_TARGET_ANDROID) if(CORRADE_TARGET_EMSCRIPTEN OR CORRADE_TARGET_ANDROID)
set(ANYIMAGECONVERTER_TEST_OUTPUT_DIR "write") set(ANYIMAGECONVERTER_TEST_OUTPUT_DIR "write")
set(KTX_3D_FILE 3d.ktx2)
set(EXR_FILE depth32f-custom-channels.exr) set(EXR_FILE depth32f-custom-channels.exr)
set(EXR_CUBE_FILE cube.exr)
else() else()
set(ANYIMAGECONVERTER_TEST_OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR}) set(ANYIMAGECONVERTER_TEST_OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR})
set(KTX_3D_FILE ${PROJECT_SOURCE_DIR}/src/MagnumPlugins/AnyImageImporter/Test/3d.ktx2)
set(EXR_FILE ${PROJECT_SOURCE_DIR}/src/MagnumPlugins/AnyImageImporter/Test/depth32f-custom-channels.exr) set(EXR_FILE ${PROJECT_SOURCE_DIR}/src/MagnumPlugins/AnyImageImporter/Test/depth32f-custom-channels.exr)
set(EXR_CUBE_FILE ${PROJECT_SOURCE_DIR}/src/MagnumPlugins/AnyImageImporter/Test/cube.exr)
endif() endif()
# CMake before 3.8 has broken $<TARGET_FILE*> expressions for iOS (see # CMake before 3.8 has broken $<TARGET_FILE*> expressions for iOS (see
@ -62,7 +62,7 @@ corrade_add_test(AnyImageConverterTest AnyImageConverterTest.cpp
# now # now
Threads::Threads Threads::Threads
FILES FILES
../../AnyImageImporter/Test/cube.exr ../../AnyImageImporter/Test/3d.ktx2
../../AnyImageImporter/Test/depth32f-custom-channels.exr) ../../AnyImageImporter/Test/depth32f-custom-channels.exr)
target_include_directories(AnyImageConverterTest PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/$<CONFIG>) target_include_directories(AnyImageConverterTest PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/$<CONFIG>)
if(MAGNUM_ANYIMAGECONVERTER_BUILD_STATIC) if(MAGNUM_ANYIMAGECONVERTER_BUILD_STATIC)

2
src/MagnumPlugins/AnyImageConverter/Test/configure.h.cmake

@ -26,8 +26,8 @@
#cmakedefine ANYIMAGECONVERTER_PLUGIN_FILENAME "${ANYIMAGECONVERTER_PLUGIN_FILENAME}" #cmakedefine ANYIMAGECONVERTER_PLUGIN_FILENAME "${ANYIMAGECONVERTER_PLUGIN_FILENAME}"
#cmakedefine TGAIMAGECONVERTER_PLUGIN_FILENAME "${TGAIMAGECONVERTER_PLUGIN_FILENAME}" #cmakedefine TGAIMAGECONVERTER_PLUGIN_FILENAME "${TGAIMAGECONVERTER_PLUGIN_FILENAME}"
#define ANYIMAGECONVERTER_TEST_OUTPUT_DIR "${ANYIMAGECONVERTER_TEST_OUTPUT_DIR}" #define ANYIMAGECONVERTER_TEST_OUTPUT_DIR "${ANYIMAGECONVERTER_TEST_OUTPUT_DIR}"
#define KTX_3D_FILE "${KTX_3D_FILE}"
#define EXR_FILE "${EXR_FILE}" #define EXR_FILE "${EXR_FILE}"
#define EXR_CUBE_FILE "${EXR_CUBE_FILE}"
#ifdef CORRADE_TARGET_WINDOWS #ifdef CORRADE_TARGET_WINDOWS
#ifdef CORRADE_IS_DEBUG_BUILD #ifdef CORRADE_IS_DEBUG_BUILD

BIN
src/MagnumPlugins/AnyImageImporter/Test/3d.ktx2

Binary file not shown.

10
src/MagnumPlugins/AnyImageImporter/Test/AnyImageImporterTest.cpp

@ -86,8 +86,8 @@ constexpr struct {
Containers::Optional<Containers::ArrayView<const char>>(*callback)(const std::string&, InputFileCallbackPolicy, Containers::Array<char>&); Containers::Optional<Containers::ArrayView<const char>>(*callback)(const std::string&, InputFileCallbackPolicy, Containers::Array<char>&);
const char* messageFunctionName; const char* messageFunctionName;
} Load3DData[]{ } Load3DData[]{
{"EXR", EXR_CUBE_FILE, nullptr, "OpenExrImporter"}, {"KTX2", KTX_3D_FILE, nullptr, "KtxImporter"},
{"EXR data", EXR_CUBE_FILE, fileCallback, "OpenExrImporter"}, {"KTX2 data", KTX_3D_FILE, fileCallback, "KtxImporter"},
}; };
constexpr struct { constexpr struct {
@ -224,8 +224,8 @@ void AnyImageImporterTest::load3D() {
CORRADE_VERIFY(manager.load(ANYIMAGEIMPORTER_PLUGIN_FILENAME) & PluginManager::LoadState::Loaded); CORRADE_VERIFY(manager.load(ANYIMAGEIMPORTER_PLUGIN_FILENAME) & PluginManager::LoadState::Loaded);
#endif #endif
if(manager.loadState("OpenExrImporter") < PluginManager::LoadState::Loaded) if(manager.loadState("KtxImporter") < PluginManager::LoadState::Loaded)
CORRADE_SKIP("OpenExrImporter plugin can't be loaded."); CORRADE_SKIP("KtxImporter plugin can't be loaded.");
Containers::Pointer<AbstractImporter> importer = manager.instantiate("AnyImageImporter"); Containers::Pointer<AbstractImporter> importer = manager.instantiate("AnyImageImporter");
@ -238,7 +238,7 @@ void AnyImageImporterTest::load3D() {
/* Check only size, as it is good enough proof that it is working */ /* Check only size, as it is good enough proof that it is working */
Containers::Optional<ImageData3D> image = importer->image3D(0); Containers::Optional<ImageData3D> image = importer->image3D(0);
CORRADE_VERIFY(image); CORRADE_VERIFY(image);
CORRADE_COMPARE(image->size(), (Vector3i{1, 1, 6})); CORRADE_COMPARE(image->size(), (Vector3i{2, 3, 2}));
} }
void AnyImageImporterTest::detect() { void AnyImageImporterTest::detect() {

10
src/MagnumPlugins/AnyImageImporter/Test/CMakeLists.txt

@ -26,13 +26,13 @@
if(CORRADE_TARGET_EMSCRIPTEN OR CORRADE_TARGET_ANDROID) if(CORRADE_TARGET_EMSCRIPTEN OR CORRADE_TARGET_ANDROID)
set(TEST_FILE_DIR .) set(TEST_FILE_DIR .)
set(TGA_FILE rgb.tga) set(TGA_FILE rgb.tga)
set(KTX_3D_FILE 3d.ktx2)
set(EXR_FILE depth32f-custom-channels.exr) set(EXR_FILE depth32f-custom-channels.exr)
set(EXR_CUBE_FILE cube.exr)
else() else()
set(TEST_FILE_DIR ${CMAKE_CURRENT_SOURCE_DIR}) set(TEST_FILE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
set(TGA_FILE ${CMAKE_CURRENT_SOURCE_DIR}/rgb.tga) set(TGA_FILE ${CMAKE_CURRENT_SOURCE_DIR}/rgb.tga)
set(KTX_3D_FILE ${CMAKE_CURRENT_SOURCE_DIR}/3d.ktx2)
set(EXR_FILE ${CMAKE_CURRENT_SOURCE_DIR}/depth32f-custom-channels.exr) set(EXR_FILE ${CMAKE_CURRENT_SOURCE_DIR}/depth32f-custom-channels.exr)
set(EXR_CUBE_FILE ${CMAKE_CURRENT_SOURCE_DIR}/cube.exr)
endif() endif()
# CMake before 3.8 has broken $<TARGET_FILE*> expressions for iOS (see # CMake before 3.8 has broken $<TARGET_FILE*> expressions for iOS (see
@ -55,10 +55,10 @@ file(GENERATE OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/$<CONFIG>/configure.h
corrade_add_test(AnyImageImporterTest AnyImageImporterTest.cpp corrade_add_test(AnyImageImporterTest AnyImageImporterTest.cpp
LIBRARIES MagnumTrade MagnumDebugTools LIBRARIES MagnumTrade MagnumDebugTools
FILES FILES
# Taken from OpenExrImporter tests # Generated by AnyImageConverterTest::propagateConfiguration2D()
depth32f-custom-channels.exr depth32f-custom-channels.exr
# Generated by AnyImageConverterTest::propagateConfiguration3D() # Generated by AnyImageConverterTest::convert3D()
cube.exr 3d.ktx2
gray.jpg gray.jpg
image.exr image.exr
image.tiff image.tiff

2
src/MagnumPlugins/AnyImageImporter/Test/configure.h.cmake

@ -27,8 +27,8 @@
#cmakedefine TGAIMPORTER_PLUGIN_FILENAME "${TGAIMPORTER_PLUGIN_FILENAME}" #cmakedefine TGAIMPORTER_PLUGIN_FILENAME "${TGAIMPORTER_PLUGIN_FILENAME}"
#define TGA_FILE "${TGA_FILE}" #define TGA_FILE "${TGA_FILE}"
#define TEST_FILE_DIR "${TEST_FILE_DIR}" #define TEST_FILE_DIR "${TEST_FILE_DIR}"
#define KTX_3D_FILE "${KTX_3D_FILE}"
#define EXR_FILE "${EXR_FILE}" #define EXR_FILE "${EXR_FILE}"
#define EXR_CUBE_FILE "${EXR_CUBE_FILE}"
#ifdef CORRADE_TARGET_WINDOWS #ifdef CORRADE_TARGET_WINDOWS
#ifdef CORRADE_IS_DEBUG_BUILD #ifdef CORRADE_IS_DEBUG_BUILD

BIN
src/MagnumPlugins/AnyImageImporter/Test/cube.exr

Binary file not shown.
Loading…
Cancel
Save