Browse Source

*converter: make these buildable on platforms w/o dynamic plugins.

Such as Emscripten or Android. The hypothetical use case is converting
shader files directly on an Android device to debug things, or having a
Node.js build of a scene/image converter for "portability".

Static plugins can be linked to these if Magnum is built together with
Magnum Plugins in a CMake superproject and the plugins are then linked
via the MAGNUM_*CONVERTER_STATIC_PLUGINS CMake variable.

The fontconverter and distanceconverter tools cause a CMake error on
Emscripten as it's not currently possible to access the GPU through a
command-line Node.js app. On Android they work though.
pull/168/head
Vladimír Vondruš 3 years ago
parent
commit
7286faf329
  1. 5
      package/archlinux/PKGBUILD-android-arm64
  2. 5
      package/archlinux/PKGBUILD-emscripten-wasm
  3. 5
      package/archlinux/PKGBUILD-emscripten-wasm-webgl2
  4. 5
      package/ci/android-x86-gles.sh
  5. 5
      package/ci/emscripten.sh
  6. 17
      src/Magnum/SceneTools/sceneconverter.cpp
  7. 7
      src/Magnum/ShaderTools/shaderconverter.cpp
  8. 3
      src/Magnum/Text/CMakeLists.txt
  9. 17
      src/Magnum/Text/fontconverter.cpp
  10. 5
      src/Magnum/TextureTools/CMakeLists.txt
  11. 12
      src/Magnum/TextureTools/distancefieldconverter.cpp
  12. 12
      src/Magnum/Trade/imageconverter.cpp

5
package/archlinux/PKGBUILD-android-arm64

@ -50,6 +50,11 @@ build() {
-DMAGNUM_WITH_ANDROIDAPPLICATION=ON \ -DMAGNUM_WITH_ANDROIDAPPLICATION=ON \
-DMAGNUM_WITH_EGLCONTEXT=ON \ -DMAGNUM_WITH_EGLCONTEXT=ON \
-DMAGNUM_WITH_WINDOWLESSEGLAPPLICATION=ON \ -DMAGNUM_WITH_WINDOWLESSEGLAPPLICATION=ON \
-DMAGNUM_WITH_DISTANCEFIELDCONVERTER=ON \
-DMAGNUM_WITH_FONTCONVERTER=ON \
-DMAGNUM_WITH_IMAGECONVERTER=ON \
-DMAGNUM_WITH_SCENECONVERTER=ON \
-DMAGNUM_WITH_SHADERCONVERTER=ON \
-DMAGNUM_WITH_GL_INFO=ON \ -DMAGNUM_WITH_GL_INFO=ON \
-DMAGNUM_WITH_VK_INFO=ON \ -DMAGNUM_WITH_VK_INFO=ON \
-DMAGNUM_TARGET_GLES2=OFF \ -DMAGNUM_TARGET_GLES2=OFF \

5
package/archlinux/PKGBUILD-emscripten-wasm

@ -52,6 +52,11 @@ build() {
-DMAGNUM_WITH_TGAIMAGECONVERTER=ON \ -DMAGNUM_WITH_TGAIMAGECONVERTER=ON \
-DMAGNUM_WITH_TGAIMPORTER=ON \ -DMAGNUM_WITH_TGAIMPORTER=ON \
-DMAGNUM_WITH_WAVAUDIOIMPORTER=ON \ -DMAGNUM_WITH_WAVAUDIOIMPORTER=ON \
-DMAGNUM_WITH_DISTANCEFIELDCONVERTER=OFF \
-DMAGNUM_WITH_FONTCONVERTER=OFF \
-DMAGNUM_WITH_IMAGECONVERTER=ON \
-DMAGNUM_WITH_SCENECONVERTER=ON \
-DMAGNUM_WITH_SHADERCONVERTER=ON \
-DMAGNUM_WITH_GL_INFO=ON \ -DMAGNUM_WITH_GL_INFO=ON \
-DMAGNUM_WITH_AL_INFO=ON \ -DMAGNUM_WITH_AL_INFO=ON \
-DMAGNUM_BUILD_TESTS=ON \ -DMAGNUM_BUILD_TESTS=ON \

5
package/archlinux/PKGBUILD-emscripten-wasm-webgl2

@ -53,6 +53,11 @@ build() {
-DMAGNUM_WITH_TGAIMAGECONVERTER=ON \ -DMAGNUM_WITH_TGAIMAGECONVERTER=ON \
-DMAGNUM_WITH_TGAIMPORTER=ON \ -DMAGNUM_WITH_TGAIMPORTER=ON \
-DMAGNUM_WITH_WAVAUDIOIMPORTER=ON \ -DMAGNUM_WITH_WAVAUDIOIMPORTER=ON \
-DMAGNUM_WITH_DISTANCEFIELDCONVERTER=OFF \
-DMAGNUM_WITH_FONTCONVERTER=OFF \
-DMAGNUM_WITH_IMAGECONVERTER=ON \
-DMAGNUM_WITH_SCENECONVERTER=ON \
-DMAGNUM_WITH_SHADERCONVERTER=ON \
-DMAGNUM_WITH_GL_INFO=ON \ -DMAGNUM_WITH_GL_INFO=ON \
-DMAGNUM_WITH_AL_INFO=ON \ -DMAGNUM_WITH_AL_INFO=ON \
-DMAGNUM_BUILD_TESTS=ON \ -DMAGNUM_BUILD_TESTS=ON \

5
package/ci/android-x86-gles.sh

@ -72,6 +72,11 @@ cmake .. \
-DMAGNUM_WITH_TGAIMAGECONVERTER=ON \ -DMAGNUM_WITH_TGAIMAGECONVERTER=ON \
-DMAGNUM_WITH_TGAIMPORTER=ON \ -DMAGNUM_WITH_TGAIMPORTER=ON \
-DMAGNUM_WITH_WAVAUDIOIMPORTER=OFF \ -DMAGNUM_WITH_WAVAUDIOIMPORTER=OFF \
-DMAGNUM_WITH_DISTANCEFIELDCONVERTER=ON \
-DMAGNUM_WITH_FONTCONVERTER=ON \
-DMAGNUM_WITH_IMAGECONVERTER=ON \
-DMAGNUM_WITH_SCENECONVERTER=ON \
-DMAGNUM_WITH_SHADERCONVERTER=ON \
-DMAGNUM_WITH_GL_INFO=ON \ -DMAGNUM_WITH_GL_INFO=ON \
-DMAGNUM_BUILD_TESTS=ON \ -DMAGNUM_BUILD_TESTS=ON \
-DMAGNUM_BUILD_GL_TESTS=ON \ -DMAGNUM_BUILD_GL_TESTS=ON \

5
package/ci/emscripten.sh

@ -63,6 +63,11 @@ cmake .. \
-DMAGNUM_WITH_TGAIMAGECONVERTER=ON \ -DMAGNUM_WITH_TGAIMAGECONVERTER=ON \
-DMAGNUM_WITH_TGAIMPORTER=ON \ -DMAGNUM_WITH_TGAIMPORTER=ON \
-DMAGNUM_WITH_WAVAUDIOIMPORTER=ON \ -DMAGNUM_WITH_WAVAUDIOIMPORTER=ON \
-DMAGNUM_WITH_DISTANCEFIELDCONVERTER=OFF \
-DMAGNUM_WITH_FONTCONVERTER=OFF \
-DMAGNUM_WITH_IMAGECONVERTER=ON \
-DMAGNUM_WITH_SCENECONVERTER=ON \
-DMAGNUM_WITH_SHADERCONVERTER=ON \
-DMAGNUM_WITH_GL_INFO=ON \ -DMAGNUM_WITH_GL_INFO=ON \
-DMAGNUM_WITH_AL_INFO=ON \ -DMAGNUM_WITH_AL_INFO=ON \
-DMAGNUM_BUILD_TESTS=ON \ -DMAGNUM_BUILD_TESTS=ON \

17
src/Magnum/SceneTools/sceneconverter.cpp

@ -418,7 +418,9 @@ int main(int argc, char** argv) {
.addArrayOption('C', "converter").setHelp("converter", "scene converter plugin(s)", "PLUGIN") .addArrayOption('C', "converter").setHelp("converter", "scene converter plugin(s)", "PLUGIN")
.addArrayOption('P', "image-converter").setHelp("image-converter", "converter plugin(s) to apply to each image in the scene", "PLUGIN") .addArrayOption('P', "image-converter").setHelp("image-converter", "converter plugin(s) to apply to each image in the scene", "PLUGIN")
.addArrayOption('M', "mesh-converter").setHelp("mesh-converter", "converter plugin(s) to apply to each mesh in the scene", "PLUGIN") .addArrayOption('M', "mesh-converter").setHelp("mesh-converter", "converter plugin(s) to apply to each mesh in the scene", "PLUGIN")
#ifndef CORRADE_PLUGINMANAGER_NO_DYNAMIC_PLUGIN_SUPPORT
.addOption("plugin-dir").setHelp("plugin-dir", "override base plugin dir", "DIR") .addOption("plugin-dir").setHelp("plugin-dir", "override base plugin dir", "DIR")
#endif
.addArrayOption("prefer").setHelp("prefer", "prefer particular plugins for given alias(es)", "alias:plugin1,plugin2,…") .addArrayOption("prefer").setHelp("prefer", "prefer particular plugins for given alias(es)", "alias:plugin1,plugin2,…")
.addArrayOption("set").setHelp("set", "set global plugin(s) options", "plugin:key=val,key2=val2,…") .addArrayOption("set").setHelp("set", "set global plugin(s) options", "plugin:key=val,key2=val2,…")
#if defined(CORRADE_TARGET_UNIX) || (defined(CORRADE_TARGET_WINDOWS) && !defined(CORRADE_TARGET_WINDOWS_RT)) #if defined(CORRADE_TARGET_UNIX) || (defined(CORRADE_TARGET_WINDOWS) && !defined(CORRADE_TARGET_WINDOWS_RT))
@ -572,20 +574,29 @@ well, the IDs reference attributes of the first mesh.)")
/* Importer manager */ /* Importer manager */
PluginManager::Manager<Trade::AbstractImporter> importerManager{ PluginManager::Manager<Trade::AbstractImporter> importerManager{
#ifndef CORRADE_PLUGINMANAGER_NO_DYNAMIC_PLUGIN_SUPPORT
args.value("plugin-dir").empty() ? Containers::String{} : args.value("plugin-dir").empty() ? Containers::String{} :
Utility::Path::join(args.value("plugin-dir"), Utility::Path::split(Trade::AbstractImporter::pluginSearchPaths().back()).second())}; Utility::Path::join(args.value("plugin-dir"), Utility::Path::split(Trade::AbstractImporter::pluginSearchPaths().back()).second())
#endif
};
/* Image converter manager for potential dependencies. Needs to be /* Image converter manager for potential dependencies. Needs to be
constructed before the scene converter manager for proper destruction constructed before the scene converter manager for proper destruction
order. */ order. */
PluginManager::Manager<Trade::AbstractImageConverter> imageConverterManager{ PluginManager::Manager<Trade::AbstractImageConverter> imageConverterManager{
#ifndef CORRADE_PLUGINMANAGER_NO_DYNAMIC_PLUGIN_SUPPORT
args.value("plugin-dir").empty() ? Containers::String{} : args.value("plugin-dir").empty() ? Containers::String{} :
Utility::Path::join(args.value("plugin-dir"), Utility::Path::split(Trade::AbstractImageConverter::pluginSearchPaths().back()).second())}; Utility::Path::join(args.value("plugin-dir"), Utility::Path::split(Trade::AbstractImageConverter::pluginSearchPaths().back()).second())
#endif
};
/* Scene converter manager, register the image converter manager with it */ /* Scene converter manager, register the image converter manager with it */
PluginManager::Manager<Trade::AbstractSceneConverter> converterManager{ PluginManager::Manager<Trade::AbstractSceneConverter> converterManager{
#ifndef CORRADE_PLUGINMANAGER_NO_DYNAMIC_PLUGIN_SUPPORT
args.value("plugin-dir").empty() ? Containers::String{} : args.value("plugin-dir").empty() ? Containers::String{} :
Utility::Path::join(args.value("plugin-dir"), Utility::Path::split(Trade::AbstractSceneConverter::pluginSearchPaths().back()).second())}; Utility::Path::join(args.value("plugin-dir"), Utility::Path::split(Trade::AbstractSceneConverter::pluginSearchPaths().back()).second())
#endif
};
converterManager.registerExternalManager(imageConverterManager); converterManager.registerExternalManager(imageConverterManager);
/* Set preferred plugins */ /* Set preferred plugins */

7
src/Magnum/ShaderTools/shaderconverter.cpp

@ -244,7 +244,9 @@ int main(int argc, char** argv) {
.addBooleanOption("validate").setHelp("validate", "validate input") .addBooleanOption("validate").setHelp("validate", "validate input")
.addBooleanOption("link").setHelp("link", "link multiple input files together") .addBooleanOption("link").setHelp("link", "link multiple input files together")
.addArrayOption('C', "converter").setHelp("converter", "shader converter plugin(s)") .addArrayOption('C', "converter").setHelp("converter", "shader converter plugin(s)")
#ifndef CORRADE_PLUGINMANAGER_NO_DYNAMIC_PLUGIN_SUPPORT
.addOption("plugin-dir").setHelp("plugin-dir", "override base plugin dir", "DIR") .addOption("plugin-dir").setHelp("plugin-dir", "override base plugin dir", "DIR")
#endif
.addArrayOption('c', "converter-options").setHelp("converter-options", "configuration options to pass to the converter(s)", "key=val,key2=val2,…") .addArrayOption('c', "converter-options").setHelp("converter-options", "configuration options to pass to the converter(s)", "key=val,key2=val2,…")
.addBooleanOption("info").setHelp("info", "print SPIR-V module info and exit") .addBooleanOption("info").setHelp("info", "print SPIR-V module info and exit")
.addBooleanOption('q', "quiet").setHelp("quiet", "quiet output from converter plugin(s)") .addBooleanOption('q', "quiet").setHelp("quiet", "quiet output from converter plugin(s)")
@ -364,8 +366,11 @@ see documentation of a particular converter for more information.)")
/* Set up a converter manager */ /* Set up a converter manager */
PluginManager::Manager<ShaderTools::AbstractConverter> converterManager{ PluginManager::Manager<ShaderTools::AbstractConverter> converterManager{
#ifndef CORRADE_PLUGINMANAGER_NO_DYNAMIC_PLUGIN_SUPPORT
args.value("plugin-dir").empty() ? Containers::String{} : args.value("plugin-dir").empty() ? Containers::String{} :
Utility::Path::join(args.value("plugin-dir"), Utility::Path::split(ShaderTools::AbstractConverter::pluginSearchPaths().back()).second())}; Utility::Path::join(args.value("plugin-dir"), Utility::Path::split(ShaderTools::AbstractConverter::pluginSearchPaths().back()).second())
#endif
};
/* Data passed from one converter to another in case there's more than one */ /* Data passed from one converter to another in case there's more than one */
Containers::Array<char> data; Containers::Array<char> data;

3
src/Magnum/Text/CMakeLists.txt

@ -112,6 +112,9 @@ if(MAGNUM_WITH_FONTCONVERTER)
if(NOT MAGNUM_TARGET_GL) if(NOT MAGNUM_TARGET_GL)
message(SEND_ERROR "magnum-fontconverter is available only if MAGNUM_TARGET_GL is enabled") message(SEND_ERROR "magnum-fontconverter is available only if MAGNUM_TARGET_GL is enabled")
endif() endif()
if(CORRADE_TARGET_EMSCRIPTEN)
message(SEND_ERROR "The magnum-fontconverter utility isn't available on Emscripten due to lack of GPU access from Node.js. Set MAGNUM_WITH_FONTCONVERTER to OFF to skip building it.")
endif()
find_package(Corrade REQUIRED Main) find_package(Corrade REQUIRED Main)

17
src/Magnum/Text/fontconverter.cpp

@ -140,7 +140,9 @@ FontConverter::FontConverter(const Arguments& arguments): Platform::WindowlessAp
.addArgument("output").setHelp("output", "output filename prefix") .addArgument("output").setHelp("output", "output filename prefix")
.addNamedArgument("font").setHelp("font", "font plugin") .addNamedArgument("font").setHelp("font", "font plugin")
.addNamedArgument("converter").setHelp("converter", "font converter plugin") .addNamedArgument("converter").setHelp("converter", "font converter plugin")
#ifndef CORRADE_PLUGINMANAGER_NO_DYNAMIC_PLUGIN_SUPPORT
.addOption("plugin-dir").setHelp("plugin-dir", "override base plugin dir", "DIR") .addOption("plugin-dir").setHelp("plugin-dir", "override base plugin dir", "DIR")
#endif
.addOption("characters", "abcdefghijklmnopqrstuvwxyz" .addOption("characters", "abcdefghijklmnopqrstuvwxyz"
"ABCDEFGHIJKLMNOPQRSTUVWXYZ" "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"0123456789?!:;,. ").setHelp("characters", "characters to include in the output") "0123456789?!:;,. ").setHelp("characters", "characters to include in the output")
@ -158,21 +160,30 @@ FontConverter::FontConverter(const Arguments& arguments): Platform::WindowlessAp
int FontConverter::exec() { int FontConverter::exec() {
/* Font converter dependencies */ /* Font converter dependencies */
PluginManager::Manager<Trade::AbstractImageConverter> imageConverterManager{ PluginManager::Manager<Trade::AbstractImageConverter> imageConverterManager{
#ifndef CORRADE_PLUGINMANAGER_NO_DYNAMIC_PLUGIN_SUPPORT
args.value("plugin-dir").empty() ? Containers::String{} : args.value("plugin-dir").empty() ? Containers::String{} :
Utility::Path::join(args.value("plugin-dir"), Utility::Path::split(Trade::AbstractImageConverter::pluginSearchPaths().back()).second())}; Utility::Path::join(args.value("plugin-dir"), Utility::Path::split(Trade::AbstractImageConverter::pluginSearchPaths().back()).second())
#endif
};
/* Load font */ /* Load font */
PluginManager::Manager<AbstractFont> fontManager{ PluginManager::Manager<AbstractFont> fontManager{
#ifndef CORRADE_PLUGINMANAGER_NO_DYNAMIC_PLUGIN_SUPPORT
args.value("plugin-dir").empty() ? Containers::String{} : args.value("plugin-dir").empty() ? Containers::String{} :
Utility::Path::join(args.value("plugin-dir"), Utility::Path::split(AbstractFont::pluginSearchPaths().back()).second())}; Utility::Path::join(args.value("plugin-dir"), Utility::Path::split(AbstractFont::pluginSearchPaths().back()).second())
#endif
};
Containers::Pointer<AbstractFont> font = fontManager.loadAndInstantiate(args.value("font")); Containers::Pointer<AbstractFont> font = fontManager.loadAndInstantiate(args.value("font"));
if(!font) return 1; if(!font) return 1;
/* Register the image converter manager for potential dependencies /* Register the image converter manager for potential dependencies
(MagnumFontConverter needs TgaImageConverter, for example) */ (MagnumFontConverter needs TgaImageConverter, for example) */
PluginManager::Manager<AbstractFontConverter> converterManager{ PluginManager::Manager<AbstractFontConverter> converterManager{
#ifndef CORRADE_PLUGINMANAGER_NO_DYNAMIC_PLUGIN_SUPPORT
args.value("plugin-dir").empty() ? Containers::String{} : args.value("plugin-dir").empty() ? Containers::String{} :
Utility::Path::join(args.value("plugin-dir"), Utility::Path::split(AbstractFontConverter::pluginSearchPaths().back()).second())}; Utility::Path::join(args.value("plugin-dir"), Utility::Path::split(AbstractFontConverter::pluginSearchPaths().back()).second())
#endif
};
converterManager.registerExternalManager(imageConverterManager); converterManager.registerExternalManager(imageConverterManager);
/* Load font converter */ /* Load font converter */

5
src/Magnum/TextureTools/CMakeLists.txt

@ -89,7 +89,10 @@ install(FILES ${MagnumTextureTools_HEADERS} DESTINATION ${MAGNUM_INCLUDE_INSTALL
if(MAGNUM_WITH_DISTANCEFIELDCONVERTER) if(MAGNUM_WITH_DISTANCEFIELDCONVERTER)
if(NOT MAGNUM_TARGET_GL) if(NOT MAGNUM_TARGET_GL)
message(SEND_ERROR "magnum-distancefieldconverter is available only if MAGNUM_TARGET_GL is enabled") message(SEND_ERROR "The magnum-distancefieldconverter utility is available only if MAGNUM_TARGET_GL is enabled")
endif()
if(CORRADE_TARGET_EMSCRIPTEN)
message(SEND_ERROR "The magnum-distancefieldconverter utility isn't available on Emscripten due to lack of GPU access from Node.js. Set MAGNUM_WITH_DISTANCEFIELDCONVERTER to OFF to skip building it.")
endif() endif()
find_package(Corrade REQUIRED Main) find_package(Corrade REQUIRED Main)

12
src/Magnum/TextureTools/distancefieldconverter.cpp

@ -144,7 +144,9 @@ DistanceFieldConverter::DistanceFieldConverter(const Arguments& arguments): Plat
.addArgument("output").setHelp("output", "output image") .addArgument("output").setHelp("output", "output image")
.addOption("importer", "AnyImageImporter").setHelp("importer", "image importer plugin") .addOption("importer", "AnyImageImporter").setHelp("importer", "image importer plugin")
.addOption("converter", "AnyImageConverter").setHelp("converter", "image converter plugin") .addOption("converter", "AnyImageConverter").setHelp("converter", "image converter plugin")
#ifndef CORRADE_PLUGINMANAGER_NO_DYNAMIC_PLUGIN_SUPPORT
.addOption("plugin-dir").setHelp("plugin-dir", "override base plugin dir", "DIR") .addOption("plugin-dir").setHelp("plugin-dir", "override base plugin dir", "DIR")
#endif
.addNamedArgument("output-size").setHelp("output-size", "size of output image", "\"X Y\"") .addNamedArgument("output-size").setHelp("output-size", "size of output image", "\"X Y\"")
.addNamedArgument("radius").setHelp("radius", "distance field computation radius", "N") .addNamedArgument("radius").setHelp("radius", "distance field computation radius", "N")
.addSkippedPrefix("magnum", "engine-specific options") .addSkippedPrefix("magnum", "engine-specific options")
@ -157,15 +159,21 @@ DistanceFieldConverter::DistanceFieldConverter(const Arguments& arguments): Plat
int DistanceFieldConverter::exec() { int DistanceFieldConverter::exec() {
/* Load importer plugin */ /* Load importer plugin */
PluginManager::Manager<Trade::AbstractImporter> importerManager{ PluginManager::Manager<Trade::AbstractImporter> importerManager{
#ifndef CORRADE_PLUGINMANAGER_NO_DYNAMIC_PLUGIN_SUPPORT
args.value("plugin-dir").empty() ? Containers::String{} : args.value("plugin-dir").empty() ? Containers::String{} :
Utility::Path::join(args.value("plugin-dir"), Utility::Path::split(Trade::AbstractImporter::pluginSearchPaths().back()).second())}; Utility::Path::join(args.value("plugin-dir"), Utility::Path::split(Trade::AbstractImporter::pluginSearchPaths().back()).second())
#endif
};
Containers::Pointer<Trade::AbstractImporter> importer = importerManager.loadAndInstantiate(args.value("importer")); Containers::Pointer<Trade::AbstractImporter> importer = importerManager.loadAndInstantiate(args.value("importer"));
if(!importer) return 1; if(!importer) return 1;
/* Load converter plugin */ /* Load converter plugin */
PluginManager::Manager<Trade::AbstractImageConverter> converterManager{ PluginManager::Manager<Trade::AbstractImageConverter> converterManager{
#ifndef CORRADE_PLUGINMANAGER_NO_DYNAMIC_PLUGIN_SUPPORT
args.value("plugin-dir").empty() ? Containers::String{} : args.value("plugin-dir").empty() ? Containers::String{} :
Utility::Path::join(args.value("plugin-dir"), Utility::Path::split(Trade::AbstractImageConverter::pluginSearchPaths().back()).second())}; Utility::Path::join(args.value("plugin-dir"), Utility::Path::split(Trade::AbstractImageConverter::pluginSearchPaths().back()).second())
#endif
};
Containers::Pointer<Trade::AbstractImageConverter> converter = converterManager.loadAndInstantiate(args.value("converter")); Containers::Pointer<Trade::AbstractImageConverter> converter = converterManager.loadAndInstantiate(args.value("converter"));
if(!converter) return 2; if(!converter) return 2;

12
src/Magnum/Trade/imageconverter.cpp

@ -388,7 +388,9 @@ int main(int argc, char** argv) {
.addArgument("output").setHelp("output", "output image; ignored if --info is present, disallowed for --in-place") .addArgument("output").setHelp("output", "output image; ignored if --info is present, disallowed for --in-place")
.addOption('I', "importer", "AnyImageImporter").setHelp("importer", "image importer plugin", "PLUGIN") .addOption('I', "importer", "AnyImageImporter").setHelp("importer", "image importer plugin", "PLUGIN")
.addArrayOption('C', "converter").setHelp("converter", "image converter plugin(s)", "PLUGIN") .addArrayOption('C', "converter").setHelp("converter", "image converter plugin(s)", "PLUGIN")
#ifndef CORRADE_PLUGINMANAGER_NO_DYNAMIC_PLUGIN_SUPPORT
.addOption("plugin-dir").setHelp("plugin-dir", "override base plugin dir", "DIR") .addOption("plugin-dir").setHelp("plugin-dir", "override base plugin dir", "DIR")
#endif
#if defined(CORRADE_TARGET_UNIX) || (defined(CORRADE_TARGET_WINDOWS) && !defined(CORRADE_TARGET_WINDOWS_RT)) #if defined(CORRADE_TARGET_UNIX) || (defined(CORRADE_TARGET_WINDOWS) && !defined(CORRADE_TARGET_WINDOWS_RT))
.addBooleanOption("map").setHelp("map", "memory-map the input for zero-copy import (works only for standalone files)") .addBooleanOption("map").setHelp("map", "memory-map the input for zero-copy import (works only for standalone files)")
#endif #endif
@ -518,11 +520,17 @@ no -C / --converter is specified, AnyImageConverter is used.)")
/* Importer and converter manager */ /* Importer and converter manager */
PluginManager::Manager<Trade::AbstractImporter> importerManager{ PluginManager::Manager<Trade::AbstractImporter> importerManager{
#ifndef CORRADE_PLUGINMANAGER_NO_DYNAMIC_PLUGIN_SUPPORT
args.value("plugin-dir").empty() ? Containers::String{} : args.value("plugin-dir").empty() ? Containers::String{} :
Utility::Path::join(args.value("plugin-dir"), Utility::Path::split(Trade::AbstractImporter::pluginSearchPaths().back()).second())}; Utility::Path::join(args.value("plugin-dir"), Utility::Path::split(Trade::AbstractImporter::pluginSearchPaths().back()).second())
#endif
};
PluginManager::Manager<Trade::AbstractImageConverter> converterManager{ PluginManager::Manager<Trade::AbstractImageConverter> converterManager{
#ifndef CORRADE_PLUGINMANAGER_NO_DYNAMIC_PLUGIN_SUPPORT
args.value("plugin-dir").empty() ? Containers::String{} : args.value("plugin-dir").empty() ? Containers::String{} :
Utility::Path::join(args.value("plugin-dir"), Utility::Path::split(Trade::AbstractImageConverter::pluginSearchPaths().back()).second())}; Utility::Path::join(args.value("plugin-dir"), Utility::Path::split(Trade::AbstractImageConverter::pluginSearchPaths().back()).second())
#endif
};
/* Print plugin info, if requested */ /* Print plugin info, if requested */
if(args.isSet("info-importer")) { if(args.isSet("info-importer")) {

Loading…
Cancel
Save