From 66d29d1b53fed99d0602ac3ff855ebeb7ba4c4bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Fri, 24 Jun 2022 22:31:41 +0200 Subject: [PATCH] imageconverter: restore the --converter raw option. Broken with 5a8d31bf689f7f4dacf7aa7c10f38ea41c12b92f. Tests. Did I mention I need tests for this? --- src/Magnum/Trade/imageconverter.cpp | 92 ++++++++++++++++------------- 1 file changed, 51 insertions(+), 41 deletions(-) diff --git a/src/Magnum/Trade/imageconverter.cpp b/src/Magnum/Trade/imageconverter.cpp index aa9445cec..ac8c25f74 100644 --- a/src/Magnum/Trade/imageconverter.cpp +++ b/src/Magnum/Trade/imageconverter.cpp @@ -965,59 +965,64 @@ no -C / --converter is specified, AnyImageConverter is used.)") (outputDimensions == 2 && outputImages2D.front().isCompressed()) || (outputDimensions == 3 && outputImages3D.front().isCompressed()); - /* Load converter plugin */ - Containers::Pointer converter = converterManager.loadAndInstantiate(converterName); - if(!converter) { - Debug{} << "Available converter plugins:" << ", "_s.join(converterManager.aliasList()); - return 2; - } + /* Load converter plugin if a raw conversion is not requested */ + Containers::Pointer converter; + if(converterName != "raw"_s) { + if(!(converter = converterManager.loadAndInstantiate(converterName))) { + Debug{} << "Available converter plugins:" << ", "_s.join(converterManager.aliasList()); + return 2; + } - /* Set options, if passed */ - if(args.isSet("verbose")) converter->addFlags(Trade::ImageConverterFlag::Verbose); - if(i < args.arrayValueCount("converter-options")) - Implementation::setOptions(*converter, "AnyImageConverter", args.arrayValue("converter-options", i)); + /* Set options, if passed */ + if(args.isSet("verbose")) converter->addFlags(Trade::ImageConverterFlag::Verbose); + if(i < args.arrayValueCount("converter-options")) + Implementation::setOptions(*converter, "AnyImageConverter", args.arrayValue("converter-options", i)); + } - /* This is the last --converter (or the implicit AnyImageConverter at - the end), output to a file and exit the loop */ - if(i + 1 >= converterCount && (converter->features() & ( + /* This is the last --converter (a raw output, a file-capable converter + or the implicit AnyImageConverter at the end), output to a file and + exit the loop */ + if(i + 1 >= converterCount && (converterName == "raw"_s || (converter->features() & ( Trade::ImageConverterFeature::Convert1DToFile| Trade::ImageConverterFeature::Convert2DToFile| Trade::ImageConverterFeature::Convert3DToFile| Trade::ImageConverterFeature::ConvertCompressed1DToFile| Trade::ImageConverterFeature::ConvertCompressed2DToFile| - Trade::ImageConverterFeature::ConvertCompressed3DToFile))) + Trade::ImageConverterFeature::ConvertCompressed3DToFile)))) { /* Decide what converter feature we should look for for given dimension count. This has to be redone each iteration, as a converted could have converted an uncompressed image to a compressed one and vice versa. */ - 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 << converterName << "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; + if(converterName != "raw"_s) { + 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 << converterName << "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; + } } if(args.isSet("verbose")) { @@ -1103,6 +1108,11 @@ no -C / --converter is specified, AnyImageConverter is used.)") /* This is not the last converter, expect that it's capable of image-to-image conversion */ } else { + if(converterName == "raw"_s) { + Error{} << "Only the very last --converter can be raw"; + return 1; + } + CORRADE_INTERNAL_ASSERT(i < converterCount); if(converterCount > 1 && args.isSet("verbose")) Debug{} << "Processing (" << Debug::nospace << (i+1) << Debug::nospace << "/" << Debug::nospace << converterCount << Debug::nospace << ") with" << converterName << Debug::nospace << "...";