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.
- @relativeref{Trade,AnyImageImporter} and
@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
and multi-level 2D/3D images for formats that support it (such as Basis
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); }
const void* AnyImageImporter::doImporterState() const { return _in->importerState(); }
}}
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.
Calls to the @ref image1DCount() / @ref image2DCount() / @ref image3DCount(),
@ref image1DLevelCount() / @ref image2DLevelCount() / @ref image3DLevelCount()
and @ref image1D() / @ref image2D() / @ref image3D() functions are then proxied
to the concrete implementation. The @ref close() function closes and discards
the internally instantiated plugin; @ref isOpened() works as usual.
@ref image1DLevelCount() / @ref image2DLevelCount() / @ref image3DLevelCount(),
@ref image1D() / @ref image2D() / @ref image3D() and @ref importerState()
functions are then proxied to the concrete implementation. The @ref close()
function closes and discards the internally instantiated plugin;
@ref isOpened() works as usual.
Besides delegating the flags, the @ref AnyImageImporter itself recognizes
@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 Containers::Optional<ImageData3D> doImage3D(UnsignedInt id, UnsignedInt level) override;
MAGNUM_ANYIMAGEIMPORTER_LOCAL const void* doImporterState() const override;
Containers::Pointer<AbstractImporter> _in;
};

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

@ -26,9 +26,11 @@
*/
#include <Corrade/Containers/Optional.h>
#include <Corrade/Containers/StringIterable.h>
#include <Corrade/Containers/StringView.h>
#include <Corrade/PluginManager/Manager.h>
#include <Corrade/TestSuite/Tester.h>
#include <Corrade/TestSuite/Compare/Container.h>
#include <Corrade/TestSuite/Compare/String.h>
#include <Corrade/Utility/ConfigurationGroup.h>
#include <Corrade/Utility/Format.h>
@ -70,6 +72,8 @@ struct AnyImageImporterTest: TestSuite::Tester {
void imageLevels2D();
void imageLevels3D();
void importerState();
/* Explicitly forbid system-wide plugin dependencies */
PluginManager::Manager<AbstractImporter> _manager{"nonexistent"};
};
@ -242,7 +246,9 @@ AnyImageImporterTest::AnyImageImporterTest() {
&AnyImageImporterTest::images3D,
&AnyImageImporterTest::imageLevels1D,
&AnyImageImporterTest::imageLevels2D,
&AnyImageImporterTest::imageLevels3D});
&AnyImageImporterTest::imageLevels3D,
&AnyImageImporterTest::importerState});
/* Load the plugin directly from the build tree. Otherwise it's static and
already loaded. */
@ -653,6 +659,33 @@ void AnyImageImporterTest::imageLevels3D() {
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)

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

@ -54,6 +54,8 @@ corrade_add_test(AnyImageImporterTest AnyImageImporterTest.cpp
8x8.astc
# Generated by AnyImageConverterTest::propagateConfiguration2D()
depth32f-custom-channels.exr
# From StbImageImporter test data
dispose_bgnd.gif
# From KtxImporter test data
1d-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::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,

10
src/MagnumPlugins/AnySceneImporter/AnySceneImporter.h

@ -164,10 +164,10 @@ the target plugin.
Calls to the @ref animation(), @ref scene(), @ref light(), @ref camera(),
@ref skin2D(), @ref skin3D(), @ref mesh(), @ref material(), @ref texture(),
@ref image1D(), @ref image2D(), @ref image3D() and corresponding
count-/name-related functions are then proxied to the concrete implementation.
The @ref close() function closes and discards the internally instantiated
plugin; @ref isOpened() works as usual.
@ref image1D(), @ref image2D(), @ref image3D(), corresponding
count-/name-related functions and the @ref importerState() function are then
proxied to the concrete implementation. The @ref close() function closes and
discards the internally instantiated plugin; @ref isOpened() works as usual.
While the @ref meshAttributeName(), @ref meshAttributeForName(),
@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::Optional<ImageData3D> doImage3D(UnsignedInt id, UnsignedInt level) override;
MAGNUM_ANYSCENEIMPORTER_LOCAL const void* doImporterState() const override;
Containers::Pointer<AbstractImporter> _in;
};

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

@ -32,6 +32,7 @@
#include <Corrade/TestSuite/Compare/String.h>
#include <Corrade/Utility/ConfigurationGroup.h>
#include <Corrade/Utility/Format.h>
#include <Corrade/Utility/Json.h>
#include <Corrade/Utility/Path.h>
#include "Magnum/Math/Vector3.h"
@ -107,6 +108,8 @@ struct AnySceneImporterTest: TestSuite::Tester {
void imageLevels2D();
void imageLevels3D();
void importerState();
/* Explicitly forbid system-wide plugin dependencies */
PluginManager::Manager<AbstractImporter> _manager{"nonexistent"};
};
@ -240,7 +243,9 @@ AnySceneImporterTest::AnySceneImporterTest() {
&AnySceneImporterTest::images3D,
&AnySceneImporterTest::imageLevels1D,
&AnySceneImporterTest::imageLevels2D,
&AnySceneImporterTest::imageLevels3D});
&AnySceneImporterTest::imageLevels3D,
&AnySceneImporterTest::importerState});
/* Load the plugin directly from the build tree. Otherwise it's static and
already loaded. */
@ -891,6 +896,23 @@ void AnySceneImporterTest::imageLevels3D() {
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)

Loading…
Cancel
Save