From 7e8d65cff36d36f6526a0493d118733d603d21ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Thu, 9 Jun 2022 20:47:15 +0200 Subject: [PATCH] imageconverter: don't die if the converter doesn't support a feature. It was asserting inside AbstractImageConverter before, which is nasty. --- src/Magnum/Trade/imageconverter.cpp | 35 +++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/src/Magnum/Trade/imageconverter.cpp b/src/Magnum/Trade/imageconverter.cpp index 0616b0968..e37d7eccc 100644 --- a/src/Magnum/Trade/imageconverter.cpp +++ b/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"));