Browse Source

Any{Image,Scene}Importer: propagate importerState() as well.

Is critically needed for the GltfImporter now, as the per-data importer
state is not useful on its own anymore and needs the Utility::Json
instance as well. And doing the same for AnyImageImporter as well for
feature parity.
pull/660/merge
Vladimír Vondruš 11 months ago
parent
commit
31381371e8
  1. 2
      doc/changelog.dox
  2. 2
      src/MagnumPlugins/AnyImageImporter/AnyImageImporter.cpp
  3. 11
      src/MagnumPlugins/AnyImageImporter/AnyImageImporter.h
  4. 35
      src/MagnumPlugins/AnyImageImporter/Test/AnyImageImporterTest.cpp
  5. 2
      src/MagnumPlugins/AnyImageImporter/Test/CMakeLists.txt
  6. BIN
      src/MagnumPlugins/AnyImageImporter/Test/dispose_bgnd.gif
  7. 2
      src/MagnumPlugins/AnySceneImporter/AnySceneImporter.cpp
  8. 10
      src/MagnumPlugins/AnySceneImporter/AnySceneImporter.h
  9. 24
      src/MagnumPlugins/AnySceneImporter/Test/AnySceneImporterTest.cpp

2
doc/changelog.dox

@ -1020,7 +1020,7 @@ See also:
the target implementation. the target implementation.
- @relativeref{Trade,AnyImageImporter} and - @relativeref{Trade,AnyImageImporter} and
@relativeref{Trade,AnySceneImporter} now can propagate also file callbacks @relativeref{Trade,AnySceneImporter} now can propagate also file callbacks
to the concrete plugin. and @ref Trade::AbstractImporter::importerState() to the concrete plugin
- @relativeref{Trade,AnyImageConverter} now implements also conversion of 3D - @relativeref{Trade,AnyImageConverter} now implements also conversion of 3D
and multi-level 2D/3D images for formats that support it (such as Basis and multi-level 2D/3D images for formats that support it (such as Basis
Universal or OpenEXR) Universal or OpenEXR)

2
src/MagnumPlugins/AnyImageImporter/AnyImageImporter.cpp

@ -345,6 +345,8 @@ UnsignedInt AnyImageImporter::doImage3DLevelCount(UnsignedInt id) { return _in->
Containers::Optional<ImageData3D> AnyImageImporter::doImage3D(const UnsignedInt id, const UnsignedInt level) { return _in->image3D(id, level); } Containers::Optional<ImageData3D> AnyImageImporter::doImage3D(const UnsignedInt id, const UnsignedInt level) { return _in->image3D(id, level); }
const void* AnyImageImporter::doImporterState() const { return _in->importerState(); }
}} }}
CORRADE_PLUGIN_REGISTER(AnyImageImporter, Magnum::Trade::AnyImageImporter, CORRADE_PLUGIN_REGISTER(AnyImageImporter, Magnum::Trade::AnyImageImporter,

11
src/MagnumPlugins/AnyImageImporter/AnyImageImporter.h

@ -157,10 +157,11 @@ propagated to the concrete implementation. A warning is emitted in case an
option set is not present in the default configuration of the target plugin. option set is not present in the default configuration of the target plugin.
Calls to the @ref image1DCount() / @ref image2DCount() / @ref image3DCount(), Calls to the @ref image1DCount() / @ref image2DCount() / @ref image3DCount(),
@ref image1DLevelCount() / @ref image2DLevelCount() / @ref image3DLevelCount() @ref image1DLevelCount() / @ref image2DLevelCount() / @ref image3DLevelCount(),
and @ref image1D() / @ref image2D() / @ref image3D() functions are then proxied @ref image1D() / @ref image2D() / @ref image3D() and @ref importerState()
to the concrete implementation. The @ref close() function closes and discards functions are then proxied to the concrete implementation. The @ref close()
the internally instantiated plugin; @ref isOpened() works as usual. function closes and discards the internally instantiated plugin;
@ref isOpened() works as usual.
Besides delegating the flags, the @ref AnyImageImporter itself recognizes Besides delegating the flags, the @ref AnyImageImporter itself recognizes
@ref ImporterFlag::Verbose, printing info about the concrete plugin being used @ref ImporterFlag::Verbose, printing info about the concrete plugin being used
@ -213,6 +214,8 @@ class MAGNUM_ANYIMAGEIMPORTER_EXPORT AnyImageImporter: public AbstractImporter {
MAGNUM_ANYIMAGEIMPORTER_LOCAL UnsignedInt doImage3DLevelCount(UnsignedInt id) override; MAGNUM_ANYIMAGEIMPORTER_LOCAL UnsignedInt doImage3DLevelCount(UnsignedInt id) override;
MAGNUM_ANYIMAGEIMPORTER_LOCAL Containers::Optional<ImageData3D> doImage3D(UnsignedInt id, UnsignedInt level) override; MAGNUM_ANYIMAGEIMPORTER_LOCAL Containers::Optional<ImageData3D> doImage3D(UnsignedInt id, UnsignedInt level) override;
MAGNUM_ANYIMAGEIMPORTER_LOCAL const void* doImporterState() const override;
Containers::Pointer<AbstractImporter> _in; Containers::Pointer<AbstractImporter> _in;
}; };

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

@ -26,9 +26,11 @@
*/ */
#include <Corrade/Containers/Optional.h> #include <Corrade/Containers/Optional.h>
#include <Corrade/Containers/StringIterable.h>
#include <Corrade/Containers/StringView.h> #include <Corrade/Containers/StringView.h>
#include <Corrade/PluginManager/Manager.h> #include <Corrade/PluginManager/Manager.h>
#include <Corrade/TestSuite/Tester.h> #include <Corrade/TestSuite/Tester.h>
#include <Corrade/TestSuite/Compare/Container.h>
#include <Corrade/TestSuite/Compare/String.h> #include <Corrade/TestSuite/Compare/String.h>
#include <Corrade/Utility/ConfigurationGroup.h> #include <Corrade/Utility/ConfigurationGroup.h>
#include <Corrade/Utility/Format.h> #include <Corrade/Utility/Format.h>
@ -70,6 +72,8 @@ struct AnyImageImporterTest: TestSuite::Tester {
void imageLevels2D(); void imageLevels2D();
void imageLevels3D(); void imageLevels3D();
void importerState();
/* Explicitly forbid system-wide plugin dependencies */ /* Explicitly forbid system-wide plugin dependencies */
PluginManager::Manager<AbstractImporter> _manager{"nonexistent"}; PluginManager::Manager<AbstractImporter> _manager{"nonexistent"};
}; };
@ -242,7 +246,9 @@ AnyImageImporterTest::AnyImageImporterTest() {
&AnyImageImporterTest::images3D, &AnyImageImporterTest::images3D,
&AnyImageImporterTest::imageLevels1D, &AnyImageImporterTest::imageLevels1D,
&AnyImageImporterTest::imageLevels2D, &AnyImageImporterTest::imageLevels2D,
&AnyImageImporterTest::imageLevels3D}); &AnyImageImporterTest::imageLevels3D,
&AnyImageImporterTest::importerState});
/* Load the plugin directly from the build tree. Otherwise it's static and /* Load the plugin directly from the build tree. Otherwise it's static and
already loaded. */ already loaded. */
@ -653,6 +659,33 @@ void AnyImageImporterTest::imageLevels3D() {
CORRADE_COMPARE(image->size(), (Vector3i{2, 1, 3})); CORRADE_COMPARE(image->size(), (Vector3i{2, 1, 3}));
} }
void AnyImageImporterTest::importerState() {
PluginManager::Manager<AbstractImporter> manager{MAGNUM_PLUGINS_IMPORTER_INSTALL_DIR};
#ifdef ANYIMAGEIMPORTER_PLUGIN_FILENAME
CORRADE_VERIFY(manager.load(ANYIMAGEIMPORTER_PLUGIN_FILENAME) & PluginManager::LoadState::Loaded);
#endif
/* Catch also ABI and interface mismatch errors */
if(!(manager.load("StbImageImporter") & PluginManager::LoadState::Loaded))
CORRADE_SKIP("StbImageImporter plugin can't be loaded.");
/* Ensure StbImageImporter is picked, and not for example
DevIlImageImporter */
manager.setPreferredPlugins("GifImporter", {"StbImageImporter"});
Containers::Pointer<AbstractImporter> importer = manager.instantiate("AnyImageImporter");
CORRADE_VERIFY(importer->openFile(Utility::Path::join(ANYIMAGEIMPORTER_TEST_DIR, "dispose_bgnd.gif")));
/* Testing the same as in StbImageImporterTest::animatedGif(). Importer
state should expose the delays, in milliseconds. */
CORRADE_COMPARE(importer->image2DCount(), 5);
CORRADE_VERIFY(importer->importerState());
CORRADE_COMPARE_AS(
Containers::arrayView(reinterpret_cast<const Int*>(importer->importerState()), importer->image2DCount()),
Containers::arrayView<Int>({1000, 1000, 1000, 1000, 1000}),
TestSuite::Compare::Container);
}
}}}} }}}}
CORRADE_TEST_MAIN(Magnum::Trade::Test::AnyImageImporterTest) CORRADE_TEST_MAIN(Magnum::Trade::Test::AnyImageImporterTest)

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

@ -54,6 +54,8 @@ corrade_add_test(AnyImageImporterTest AnyImageImporterTest.cpp
8x8.astc 8x8.astc
# Generated by AnyImageConverterTest::propagateConfiguration2D() # Generated by AnyImageConverterTest::propagateConfiguration2D()
depth32f-custom-channels.exr depth32f-custom-channels.exr
# From StbImageImporter test data
dispose_bgnd.gif
# From KtxImporter test data # From KtxImporter test data
1d-mipmaps.ktx2 1d-mipmaps.ktx2
2d-mipmaps.ktx2 2d-mipmaps.ktx2

BIN
src/MagnumPlugins/AnyImageImporter/Test/dispose_bgnd.gif

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

2
src/MagnumPlugins/AnySceneImporter/AnySceneImporter.cpp

@ -347,6 +347,8 @@ Int AnySceneImporter::doImage3DForName(const Containers::StringView name) { retu
Containers::String AnySceneImporter::doImage3DName(const UnsignedInt id) { return _in->image3DName(id); } Containers::String AnySceneImporter::doImage3DName(const UnsignedInt id) { return _in->image3DName(id); }
Containers::Optional<ImageData3D> AnySceneImporter::doImage3D(const UnsignedInt id, const UnsignedInt level) { return _in->image3D(id, level); } Containers::Optional<ImageData3D> AnySceneImporter::doImage3D(const UnsignedInt id, const UnsignedInt level) { return _in->image3D(id, level); }
const void* AnySceneImporter::doImporterState() const { return _in->importerState(); }
}} }}
CORRADE_PLUGIN_REGISTER(AnySceneImporter, Magnum::Trade::AnySceneImporter, CORRADE_PLUGIN_REGISTER(AnySceneImporter, Magnum::Trade::AnySceneImporter,

10
src/MagnumPlugins/AnySceneImporter/AnySceneImporter.h

@ -164,10 +164,10 @@ the target plugin.
Calls to the @ref animation(), @ref scene(), @ref light(), @ref camera(), Calls to the @ref animation(), @ref scene(), @ref light(), @ref camera(),
@ref skin2D(), @ref skin3D(), @ref mesh(), @ref material(), @ref texture(), @ref skin2D(), @ref skin3D(), @ref mesh(), @ref material(), @ref texture(),
@ref image1D(), @ref image2D(), @ref image3D() and corresponding @ref image1D(), @ref image2D(), @ref image3D(), corresponding
count-/name-related functions are then proxied to the concrete implementation. count-/name-related functions and the @ref importerState() function are then
The @ref close() function closes and discards the internally instantiated proxied to the concrete implementation. The @ref close() function closes and
plugin; @ref isOpened() works as usual. discards the internally instantiated plugin; @ref isOpened() works as usual.
While the @ref meshAttributeName(), @ref meshAttributeForName(), While the @ref meshAttributeName(), @ref meshAttributeForName(),
@ref sceneFieldName() and @ref sceneFieldForName() APIs can be called without a @ref sceneFieldName() and @ref sceneFieldForName() APIs can be called without a
@ -302,6 +302,8 @@ class MAGNUM_ANYSCENEIMPORTER_EXPORT AnySceneImporter: public AbstractImporter {
MAGNUM_ANYSCENEIMPORTER_LOCAL Containers::String doImage3DName(UnsignedInt id) override; MAGNUM_ANYSCENEIMPORTER_LOCAL Containers::String doImage3DName(UnsignedInt id) override;
MAGNUM_ANYSCENEIMPORTER_LOCAL Containers::Optional<ImageData3D> doImage3D(UnsignedInt id, UnsignedInt level) override; MAGNUM_ANYSCENEIMPORTER_LOCAL Containers::Optional<ImageData3D> doImage3D(UnsignedInt id, UnsignedInt level) override;
MAGNUM_ANYSCENEIMPORTER_LOCAL const void* doImporterState() const override;
Containers::Pointer<AbstractImporter> _in; Containers::Pointer<AbstractImporter> _in;
}; };

24
src/MagnumPlugins/AnySceneImporter/Test/AnySceneImporterTest.cpp

@ -32,6 +32,7 @@
#include <Corrade/TestSuite/Compare/String.h> #include <Corrade/TestSuite/Compare/String.h>
#include <Corrade/Utility/ConfigurationGroup.h> #include <Corrade/Utility/ConfigurationGroup.h>
#include <Corrade/Utility/Format.h> #include <Corrade/Utility/Format.h>
#include <Corrade/Utility/Json.h>
#include <Corrade/Utility/Path.h> #include <Corrade/Utility/Path.h>
#include "Magnum/Math/Vector3.h" #include "Magnum/Math/Vector3.h"
@ -107,6 +108,8 @@ struct AnySceneImporterTest: TestSuite::Tester {
void imageLevels2D(); void imageLevels2D();
void imageLevels3D(); void imageLevels3D();
void importerState();
/* Explicitly forbid system-wide plugin dependencies */ /* Explicitly forbid system-wide plugin dependencies */
PluginManager::Manager<AbstractImporter> _manager{"nonexistent"}; PluginManager::Manager<AbstractImporter> _manager{"nonexistent"};
}; };
@ -240,7 +243,9 @@ AnySceneImporterTest::AnySceneImporterTest() {
&AnySceneImporterTest::images3D, &AnySceneImporterTest::images3D,
&AnySceneImporterTest::imageLevels1D, &AnySceneImporterTest::imageLevels1D,
&AnySceneImporterTest::imageLevels2D, &AnySceneImporterTest::imageLevels2D,
&AnySceneImporterTest::imageLevels3D}); &AnySceneImporterTest::imageLevels3D,
&AnySceneImporterTest::importerState});
/* Load the plugin directly from the build tree. Otherwise it's static and /* Load the plugin directly from the build tree. Otherwise it's static and
already loaded. */ already loaded. */
@ -891,6 +896,23 @@ void AnySceneImporterTest::imageLevels3D() {
CORRADE_COMPARE(image->size(), (Vector3i{1, 1, 3})); CORRADE_COMPARE(image->size(), (Vector3i{1, 1, 3}));
} }
void AnySceneImporterTest::importerState() {
PluginManager::Manager<AbstractImporter> manager{MAGNUM_PLUGINS_IMPORTER_INSTALL_DIR};
#ifdef ANYSCENEIMPORTER_PLUGIN_FILENAME
CORRADE_VERIFY(manager.load(ANYSCENEIMPORTER_PLUGIN_FILENAME) & PluginManager::LoadState::Loaded);
#endif
/* Catch also ABI and interface mismatch errors */
if(manager.load("GltfImporter") < PluginManager::LoadState::Loaded)
CORRADE_SKIP("GltfImporter plugin can't be loaded.");
Containers::Pointer<AbstractImporter> importer = manager.instantiate("AnySceneImporter");
CORRADE_VERIFY(importer->openFile(Utility::Path::join(ANYSCENEIMPORTER_TEST_DIR, "meshes.gltf")));
CORRADE_VERIFY(importer->importerState());
CORRADE_COMPARE(static_cast<const Utility::Json*>(importer->importerState())->root()["asset"]["version"].asString(), "2.0");
}
}}}} }}}}
CORRADE_TEST_MAIN(Magnum::Trade::Test::AnySceneImporterTest) CORRADE_TEST_MAIN(Magnum::Trade::Test::AnySceneImporterTest)

Loading…
Cancel
Save