From 4933b4865243bea9854f91dd7c80009926b098b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Fri, 26 Jun 2020 12:52:13 +0200 Subject: [PATCH] imageconverter,sceneconverter: compact image info if possible. If the images have all just a single level and no names, print each on just a single line. --- src/Magnum/MeshTools/sceneconverter.cpp | 9 ++++--- .../Trade/Implementation/converterUtilities.h | 25 +++++++++++++------ src/Magnum/Trade/imageconverter.cpp | 12 +++++---- 3 files changed, 31 insertions(+), 15 deletions(-) diff --git a/src/Magnum/MeshTools/sceneconverter.cpp b/src/Magnum/MeshTools/sceneconverter.cpp index 379d59325..c7c0d2795 100644 --- a/src/Magnum/MeshTools/sceneconverter.cpp +++ b/src/Magnum/MeshTools/sceneconverter.cpp @@ -313,8 +313,11 @@ save its output; if no --converter is specified, AnySceneConverter is used.)") } } + /* In case the images have all just a single level and no names, write + them in a compact way without listing levels. */ + bool compactImages = false; Containers::Array imageInfos = - Trade::Implementation::imageInfo(*importer, error); + Trade::Implementation::imageInfo(*importer, error, compactImages); for(const MeshInfo& info: meshInfos) { Debug d; @@ -356,9 +359,9 @@ save its output; if no --converter is specified, AnySceneConverter is used.)") if(info.level == 0) { d << "Image" << info.image << Debug::nospace << ":"; if(!info.name.empty()) d << info.name; - d << Debug::newline; + if(compactImages) d << Debug::newline; } - d << " Level" << info.level << Debug::nospace << ":"; + if(compactImages) d << " Level" << info.level << Debug::nospace << ":"; if(info.compressed) d << info.compressedFormat; else d << info.format; if(info.size.z()) d << info.size; diff --git a/src/Magnum/Trade/Implementation/converterUtilities.h b/src/Magnum/Trade/Implementation/converterUtilities.h index 4bbecf55a..fe15b1cf1 100644 --- a/src/Magnum/Trade/Implementation/converterUtilities.h +++ b/src/Magnum/Trade/Implementation/converterUtilities.h @@ -86,11 +86,14 @@ struct ImageInfo { std::string name; }; -Containers::Array imageInfo(AbstractImporter& importer, bool& error) { +Containers::Array imageInfo(AbstractImporter& importer, bool& error, bool& compact) { Containers::Array infos; - for(UnsignedInt i = 0; i != importer.image1DCount(); ++i) { - for(UnsignedInt j = 0;j != importer.image1DLevelCount(i); ++j) { + const std::string name = importer.image1DName(i); + const UnsignedInt levelCount = importer.image1DLevelCount(i); + if(!name.empty() || levelCount != 1) compact = false; + + for(UnsignedInt j = 0; j != levelCount; ++j) { Containers::Optional image = importer.image1D(i, j); if(!image) { error = true; @@ -107,7 +110,11 @@ Containers::Array imageInfo(AbstractImporter& importer, bool& error) } } for(UnsignedInt i = 0; i != importer.image2DCount(); ++i) { - for(UnsignedInt j = 0;j != importer.image2DLevelCount(i); ++j) { + const std::string name = importer.image2DName(i); + const UnsignedInt levelCount = importer.image2DLevelCount(i); + if(!name.empty() || levelCount != 1) compact = false; + + for(UnsignedInt j = 0; j != levelCount; ++j) { Containers::Optional image = importer.image2D(i, j); if(!image) { error = true; @@ -120,11 +127,15 @@ Containers::Array imageInfo(AbstractImporter& importer, bool& error) image->isCompressed() ? image->compressedFormat() : CompressedPixelFormat{}, Vector3i::pad(image->size()), - j ? "" : importer.image2DName(i)); + j ? "" : name); } } for(UnsignedInt i = 0; i != importer.image3DCount(); ++i) { - for(UnsignedInt j = 0;j != importer.image3DLevelCount(i); ++j) { + const std::string name = importer.image3DName(i); + const UnsignedInt levelCount = importer.image3DLevelCount(i); + if(!name.empty() || levelCount != 1) compact = false; + + for(UnsignedInt j = 0; j != levelCount; ++j) { Containers::Optional image = importer.image3D(i, j); if(!image) { error = true; @@ -137,7 +148,7 @@ Containers::Array imageInfo(AbstractImporter& importer, bool& error) image->isCompressed() ? image->compressedFormat() : CompressedPixelFormat{}, image->size(), - j ? "" : importer.image2DName(i)); + j ? "" : name); } } diff --git a/src/Magnum/Trade/imageconverter.cpp b/src/Magnum/Trade/imageconverter.cpp index 3d2e8ac9b..3fe4007c0 100644 --- a/src/Magnum/Trade/imageconverter.cpp +++ b/src/Magnum/Trade/imageconverter.cpp @@ -239,19 +239,21 @@ key=true; configuration subgroups are delimited with /.)") return 0; } - /* Parse everything first to avoid errors interleaved with output */ - bool error = false; + /* Parse everything first to avoid errors interleaved with output. + In case the images have all just a single level and no names, + write them in a compact way without listing levels. */ + bool error = false, compact = true; Containers::Array infos = - Trade::Implementation::imageInfo(*importer, error); + Trade::Implementation::imageInfo(*importer, error, compact); for(const Trade::Implementation::ImageInfo& info: infos) { Debug d; if(info.level == 0) { d << "Image" << info.image << Debug::nospace << ":"; if(!info.name.empty()) d << info.name; - d << Debug::newline; + if(!compact) d << Debug::newline; } - d << " Level" << info.level << Debug::nospace << ":"; + if(!compact) d << " Level" << info.level << Debug::nospace << ":"; if(info.compressed) d << info.compressedFormat; else d << info.format; if(info.size.z()) d << info.size;