Browse Source

imageconverter: don't die if the converter doesn't support a feature.

It was asserting inside AbstractImageConverter before, which is nasty.
pull/570/head
Vladimír Vondruš 4 years ago
parent
commit
7e8d65cff3
  1. 35
      src/Magnum/Trade/imageconverter.cpp

35
src/Magnum/Trade/imageconverter.cpp

@ -864,6 +864,10 @@ key=true; configuration subgroups are delimited with /.)")
(outputDimensions == 1 && outputImages1D.front().isCompressed()) ||
(outputDimensions == 2 && outputImages2D.front().isCompressed()) ||
(outputDimensions == 3 && outputImages3D.front().isCompressed());
const bool outputIsMultiLevel =
outputImages1D.size() > 1 ||
outputImages2D.size() > 1 ||
outputImages3D.size() > 1;
if(args.isSet("verbose")) {
Debug d;
@ -944,6 +948,37 @@ key=true; configuration subgroups are delimited with /.)")
return 2;
}
/* Decide what converter feature we should look for for given dimension
count */
Trade::ImageConverterFeatures expectedFeatures;
if(outputDimensions == 1) {
expectedFeatures = outputIsCompressed ?
Trade::ImageConverterFeature::ConvertCompressed1DToFile :
Trade::ImageConverterFeature::Convert1DToFile;
} else if(outputDimensions == 2) {
expectedFeatures = outputIsCompressed ?
Trade::ImageConverterFeature::ConvertCompressed2DToFile :
Trade::ImageConverterFeature::Convert2DToFile;
} else if(outputDimensions == 3) {
expectedFeatures = outputIsCompressed ?
Trade::ImageConverterFeature::ConvertCompressed3DToFile :
Trade::ImageConverterFeature::Convert3DToFile;
} else CORRADE_INTERNAL_ASSERT_UNREACHABLE();
/** @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 */
if(args.isSet("verbose")) converter->addFlags(Trade::ImageConverterFlag::Verbose);
Implementation::setOptions(*converter, "AnyImageConverter", args.value("converter-options"));

Loading…
Cancel
Save