Browse Source

imageconverter: avoid early returns in a complex flow.

The profiling part had to be duplicated because of this.
pull/570/head
Vladimír Vondruš 4 years ago
parent
commit
1627d2d9f7
  1. 110
      src/Magnum/Trade/imageconverter.cpp

110
src/Magnum/Trade/imageconverter.cpp

@ -925,67 +925,57 @@ key=true; configuration subgroups are delimited with /.)")
data = outputImages3D.front().data(); data = outputImages3D.front().data();
} else CORRADE_INTERNAL_ASSERT_UNREACHABLE(); } else CORRADE_INTERNAL_ASSERT_UNREACHABLE();
{ Trade::Implementation::Duration d{conversionTime};
Trade::Implementation::Duration d{conversionTime}; if(!Utility::Path::write(output, data)) return 1;
if(!Utility::Path::write(output, data)) return 1;
}
if(args.isSet("profile")) { /* Otherwise convert to a file */
Debug{} << "Import took" << UnsignedInt(std::chrono::duration_cast<std::chrono::milliseconds>(importTime).count())/1.0e3f << "seconds, conversion" } else {
<< UnsignedInt(std::chrono::duration_cast<std::chrono::milliseconds>(conversionTime).count())/1.0e3f << "seconds"; /* Load converter plugin */
PluginManager::Manager<Trade::AbstractImageConverter> converterManager{
args.value("plugin-dir").empty() ? Containers::String{} :
Utility::Path::join(args.value("plugin-dir"), Trade::AbstractImageConverter::pluginSearchPaths().back())};
Containers::Pointer<Trade::AbstractImageConverter> converter = converterManager.loadAndInstantiate(args.value("converter"));
if(!converter) {
Debug{} << "Available converter plugins:" << ", "_s.join(converterManager.aliasList());
return 2;
} }
return 0; /* Decide what converter feature we should look for for given dimension
} count */
Trade::ImageConverterFeatures expectedFeatures;
/* Load converter plugin */ if(outputDimensions == 1) {
PluginManager::Manager<Trade::AbstractImageConverter> converterManager{ expectedFeatures = outputIsCompressed ?
args.value("plugin-dir").empty() ? Containers::String{} : Trade::ImageConverterFeature::ConvertCompressed1DToFile :
Utility::Path::join(args.value("plugin-dir"), Trade::AbstractImageConverter::pluginSearchPaths().back())}; Trade::ImageConverterFeature::Convert1DToFile;
Containers::Pointer<Trade::AbstractImageConverter> converter = converterManager.loadAndInstantiate(args.value("converter")); } else if(outputDimensions == 2) {
if(!converter) { expectedFeatures = outputIsCompressed ?
Debug{} << "Available converter plugins:" << ", "_s.join(converterManager.aliasList()); Trade::ImageConverterFeature::ConvertCompressed2DToFile :
return 2; Trade::ImageConverterFeature::Convert2DToFile;
} } else if(outputDimensions == 3) {
expectedFeatures = outputIsCompressed ?
/* Decide what converter feature we should look for for given dimension Trade::ImageConverterFeature::ConvertCompressed3DToFile :
count */ Trade::ImageConverterFeature::Convert3DToFile;
Trade::ImageConverterFeatures expectedFeatures; } else CORRADE_INTERNAL_ASSERT_UNREACHABLE();
if(outputDimensions == 1) { /** @todo use a sane flag once the feature enum is ... sane */
expectedFeatures = outputIsCompressed ? constexpr Trade::ImageConverterFeatures ImageConverterFeatureLevels =
Trade::ImageConverterFeature::ConvertCompressed1DToFile : Trade::ImageConverterFeature::ConvertLevels1DToFile & ~Trade::ImageConverterFeature::Convert1DToFile;
Trade::ImageConverterFeature::Convert1DToFile; if(outputIsMultiLevel) expectedFeatures |= ImageConverterFeatureLevels;
} else if(outputDimensions == 2) { if(!(converter->features() >= expectedFeatures)) {
expectedFeatures = outputIsCompressed ? Error err;
Trade::ImageConverterFeature::ConvertCompressed2DToFile : err << args.value("converter") << "doesn't support";
Trade::ImageConverterFeature::Convert2DToFile; if(outputIsMultiLevel)
} else if(outputDimensions == 3) { err << "multi-level";
expectedFeatures = outputIsCompressed ? if(outputIsCompressed)
Trade::ImageConverterFeature::ConvertCompressed3DToFile : err << "compressed";
Trade::ImageConverterFeature::Convert3DToFile; err << outputDimensions << Debug::nospace << "D image to file conversion, only" << converter->features();
} else CORRADE_INTERNAL_ASSERT_UNREACHABLE(); return 6;
/** @todo use a sane flag once the feature enum is ... sane */ }
constexpr Trade::ImageConverterFeatures ImageConverterFeatureLevels =
Trade::ImageConverterFeature::ConvertLevels1DToFile & ~Trade::ImageConverterFeature::Convert1DToFile;
if(outputIsMultiLevel) expectedFeatures |= ImageConverterFeatureLevels;
if(!(converter->features() >= expectedFeatures)) {
Error err;
err << args.value("converter") << "doesn't support";
if(outputIsMultiLevel)
err << "multi-level";
if(outputIsCompressed)
err << "compressed";
err << outputDimensions << Debug::nospace << "D image to file conversion, only" << converter->features();
return 6;
}
/* Set options, if passed */ /* Set options, if passed */
if(args.isSet("verbose")) converter->addFlags(Trade::ImageConverterFlag::Verbose); if(args.isSet("verbose")) converter->addFlags(Trade::ImageConverterFlag::Verbose);
Implementation::setOptions(*converter, "AnyImageConverter", args.value("converter-options")); Implementation::setOptions(*converter, "AnyImageConverter", args.value("converter-options"));
/* Save output file */ bool converted;
bool converted;
{
Trade::Implementation::Duration d{conversionTime}; Trade::Implementation::Duration d{conversionTime};
if(outputDimensions == 1) if(outputDimensions == 1)
converted = convertOneOrMoreImagesToFile(*converter, outputImages1D, output); converted = convertOneOrMoreImagesToFile(*converter, outputImages1D, output);
@ -994,10 +984,10 @@ key=true; configuration subgroups are delimited with /.)")
else if(outputDimensions == 3) else if(outputDimensions == 3)
converted = convertOneOrMoreImagesToFile(*converter, outputImages3D, output); converted = convertOneOrMoreImagesToFile(*converter, outputImages3D, output);
else CORRADE_INTERNAL_ASSERT_UNREACHABLE(); else CORRADE_INTERNAL_ASSERT_UNREACHABLE();
} if(!converted) {
if(!converted) { Error{} << "Cannot save file" << output;
Error{} << "Cannot save file" << output; return 5;
return 5; }
} }
if(args.isSet("profile")) { if(args.isSet("profile")) {

Loading…
Cancel
Save