diff --git a/src/MagnumPlugins/TgaImageConverter/Test/TgaImageConverterTest.cpp b/src/MagnumPlugins/TgaImageConverter/Test/TgaImageConverterTest.cpp index 3ac810468..dac0d330b 100644 --- a/src/MagnumPlugins/TgaImageConverter/Test/TgaImageConverterTest.cpp +++ b/src/MagnumPlugins/TgaImageConverter/Test/TgaImageConverterTest.cpp @@ -55,6 +55,18 @@ struct TgaImageConverterTest: TestSuite::Tester { PluginManager::Manager _importerManager{"nonexistent"}; }; +constexpr struct { + const char* name; + ImageConverterFlags flags; + const char* message24; + const char* message32; +} VerboseData[] { + {"", {}, "", ""}, + {"verbose", ImageConverterFlag::Verbose, + "Trade::TgaImageConverter::exportToData(): converting from RGB to BGR\n", + "Trade::TgaImageConverter::exportToData(): converting from RGBA to BGRA\n"} +}; + /* Padded to four byte alignment (the resulting file is *not* padded) */ constexpr char OriginalDataRGB[] = { /* Skip */ @@ -81,10 +93,12 @@ constexpr char OriginalDataRGBA[] = { const ImageView2D OriginalRGBA{PixelFormat::RGBA8Unorm, {2, 3}, OriginalDataRGBA}; TgaImageConverterTest::TgaImageConverterTest() { - addTests({&TgaImageConverterTest::wrongFormat, + addTests({&TgaImageConverterTest::wrongFormat}); - &TgaImageConverterTest::rgb, - &TgaImageConverterTest::rgba}); + addInstancedTests({ + &TgaImageConverterTest::rgb, + &TgaImageConverterTest::rgba}, + Containers::arraySize(VerboseData)); /* Load the plugin directly from the build tree. Otherwise it's static and already loaded. */ @@ -110,15 +124,25 @@ void TgaImageConverterTest::wrongFormat() { } void TgaImageConverterTest::rgb() { + auto&& data = VerboseData[testCaseInstanceId()]; + setTestCaseDescription(data.name); + Containers::Pointer converter = _converterManager.instantiate("TgaImageConverter"); - const auto data = converter->exportToData(OriginalRGB); - CORRADE_VERIFY(data); + converter->setFlags(data.flags); + + std::ostringstream out; + Containers::Array array; + { + Debug redirectOutput{&out}; + array = converter->exportToData(OriginalRGB); + } + CORRADE_VERIFY(out); if(!(_importerManager.loadState("TgaImporter") & PluginManager::LoadState::Loaded)) CORRADE_SKIP("TgaImporter plugin not enabled, can't test the result"); Containers::Pointer importer = _importerManager.instantiate("TgaImporter"); - CORRADE_VERIFY(importer->openData(data)); + CORRADE_VERIFY(importer->openData(array)); Containers::Optional converted = importer->image2D(0); CORRADE_VERIFY(converted); @@ -127,18 +151,29 @@ void TgaImageConverterTest::rgb() { CORRADE_COMPARE(converted->format(), PixelFormat::RGB8Unorm); CORRADE_COMPARE_AS(converted->data(), Containers::arrayView(ConvertedDataRGB), TestSuite::Compare::Container); + CORRADE_COMPARE(out.str(), data.message24); } void TgaImageConverterTest::rgba() { + auto&& data = VerboseData[testCaseInstanceId()]; + setTestCaseDescription(data.name); + Containers::Pointer converter = _converterManager.instantiate("TgaImageConverter"); - const auto data = converter->exportToData(OriginalRGBA); - CORRADE_VERIFY(data); + converter->setFlags(data.flags); + + std::ostringstream out; + Containers::Array array; + { + Debug redirectOutput{&out}; + array = converter->exportToData(OriginalRGBA); + } + CORRADE_VERIFY(out); if(!(_importerManager.loadState("TgaImporter") & PluginManager::LoadState::Loaded)) CORRADE_SKIP("TgaImporter plugin not enabled, can't test the result"); Containers::Pointer importer = _importerManager.instantiate("TgaImporter"); - CORRADE_VERIFY(importer->openData(data)); + CORRADE_VERIFY(importer->openData(array)); Containers::Optional converted = importer->image2D(0); CORRADE_VERIFY(converted); @@ -147,6 +182,7 @@ void TgaImageConverterTest::rgba() { CORRADE_COMPARE(converted->format(), PixelFormat::RGBA8Unorm); CORRADE_COMPARE_AS(converted->data(), Containers::arrayView(OriginalDataRGBA), TestSuite::Compare::Container); + CORRADE_COMPARE(out.str(), data.message32); } }}}} diff --git a/src/MagnumPlugins/TgaImageConverter/TgaImageConverter.cpp b/src/MagnumPlugins/TgaImageConverter/TgaImageConverter.cpp index 252c1d3c1..71be75c87 100644 --- a/src/MagnumPlugins/TgaImageConverter/TgaImageConverter.cpp +++ b/src/MagnumPlugins/TgaImageConverter/TgaImageConverter.cpp @@ -74,9 +74,13 @@ Containers::Array TgaImageConverter::doExportToData(const ImageView2D& ima {std::size_t(image.size().y()), std::size_t(image.size().x()), pixelSize}}); if(image.format() == PixelFormat::RGB8Unorm) { + if(flags() & ImageConverterFlag::Verbose) + Debug{} << "Trade::TgaImageConverter::exportToData(): converting from RGB to BGR"; for(Vector3ub& pixel: Containers::arrayCast(pixels)) pixel = Math::gather<'b', 'g', 'r'>(pixel); } else if(image.format() == PixelFormat::RGBA8Unorm) { + if(flags() & ImageConverterFlag::Verbose) + Debug{} << "Trade::TgaImageConverter::exportToData(): converting from RGBA to BGRA"; for(Vector4ub& pixel: Containers::arrayCast(pixels)) pixel = Math::gather<'b', 'g', 'r', 'a'>(pixel); } diff --git a/src/MagnumPlugins/TgaImporter/Test/TgaImporterTest.cpp b/src/MagnumPlugins/TgaImporter/Test/TgaImporterTest.cpp index 872fd660f..93a3e7f98 100644 --- a/src/MagnumPlugins/TgaImporter/Test/TgaImporterTest.cpp +++ b/src/MagnumPlugins/TgaImporter/Test/TgaImporterTest.cpp @@ -78,6 +78,18 @@ constexpr struct { {"RLE grayscale 16", 11, 16, "unsupported grayscale bits-per-pixel: 16"} }; +constexpr struct { + const char* name; + ImporterFlags flags; + const char* message24; + const char* message32; +} VerboseData[] { + {"", {}, "", ""}, + {"verbose", ImporterFlag::Verbose, + "Trade::TgaImporter::image2D(): converting from BGR to RGB\n", + "Trade::TgaImporter::image2D(): converting from BGRA to RGBA\n"} +}; + constexpr const char Color24[] = { 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 3, 0, 24, 0, 1, 2, 3, 2, 3, 4, @@ -124,11 +136,14 @@ TgaImporterTest::TgaImporterTest() { &TgaImporterTest::unsupportedBits}, Containers::arraySize(UnsupportedBitsData)); - addTests({&TgaImporterTest::color24, - &TgaImporterTest::color24Rle, - &TgaImporterTest::color32, - &TgaImporterTest::color32Rle, - &TgaImporterTest::grayscale8, + addInstancedTests({ + &TgaImporterTest::color24, + &TgaImporterTest::color24Rle, + &TgaImporterTest::color32, + &TgaImporterTest::color32Rle}, + Containers::arraySize(VerboseData)); + + addTests({&TgaImporterTest::grayscale8, &TgaImporterTest::grayscale8Rle, &TgaImporterTest::rleTooLarge}); @@ -207,7 +222,11 @@ void TgaImporterTest::unsupportedBits() { } void TgaImporterTest::color24() { + auto&& data = VerboseData[testCaseInstanceId()]; + setTestCaseDescription(data.name); + Containers::Pointer importer = _manager.instantiate("TgaImporter"); + importer->setFlags(data.flags); const char pixels[] = { 3, 2, 1, 4, 3, 2, 5, 4, 3, 6, 5, 4, @@ -215,17 +234,27 @@ void TgaImporterTest::color24() { }; CORRADE_VERIFY(importer->openData(Color24)); - Containers::Optional image = importer->image2D(0); + std::ostringstream out; + Containers::Optional image; + { + Debug redirectOutput{&out}; + image = importer->image2D(0); + } CORRADE_VERIFY(image); CORRADE_COMPARE(image->storage().alignment(), 1); CORRADE_COMPARE(image->format(), PixelFormat::RGB8Unorm); CORRADE_COMPARE(image->size(), Vector2i(2, 3)); CORRADE_COMPARE_AS(image->data(), Containers::arrayView(pixels), TestSuite::Compare::Container); + CORRADE_COMPARE(out.str(), data.message24); } void TgaImporterTest::color24Rle() { + auto&& data = VerboseData[testCaseInstanceId()]; + setTestCaseDescription(data.name); + Containers::Pointer importer = _manager.instantiate("TgaImporter"); + importer->setFlags(data.flags); const char pixels[] = { 3, 2, 1, 4, 3, 2, 5, 4, 3, 6, 5, 4, @@ -233,18 +262,28 @@ void TgaImporterTest::color24Rle() { }; CORRADE_VERIFY(importer->openData(Color24Rle)); - Containers::Optional image = importer->image2D(0); + std::ostringstream out; + Containers::Optional image; + { + Debug redirectOutput{&out}; + image = importer->image2D(0); + } CORRADE_VERIFY(image); CORRADE_COMPARE(image->storage().alignment(), 1); CORRADE_COMPARE(image->format(), PixelFormat::RGB8Unorm); CORRADE_COMPARE(image->size(), Vector2i(2, 3)); CORRADE_COMPARE_AS(image->data(), Containers::arrayView(pixels), TestSuite::Compare::Container); + CORRADE_COMPARE(out.str(), data.message24); } void TgaImporterTest::color32() { + auto&& data = VerboseData[testCaseInstanceId()]; + setTestCaseDescription(data.name); + Containers::Pointer importer = _manager.instantiate("TgaImporter"); - const char data[] = { + importer->setFlags(data.flags); + const char input[] = { 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 3, 0, 32, 0, 1, 2, 3, 4, 2, 3, 4, 5, 3, 4, 5, 6, 4, 5, 6, 7, @@ -255,20 +294,30 @@ void TgaImporterTest::color32() { 5, 4, 3, 6, 6, 5, 4, 7, 7, 6, 5, 8, 8, 7, 6, 9 }; - CORRADE_VERIFY(importer->openData(data)); + CORRADE_VERIFY(importer->openData(input)); - Containers::Optional image = importer->image2D(0); + std::ostringstream out; + Containers::Optional image; + { + Debug redirectOutput{&out}; + image = importer->image2D(0); + } CORRADE_VERIFY(image); CORRADE_COMPARE(image->storage().alignment(), 4); CORRADE_COMPARE(image->format(), PixelFormat::RGBA8Unorm); CORRADE_COMPARE(image->size(), Vector2i(2, 3)); CORRADE_COMPARE_AS(image->data(), Containers::arrayView(pixels), TestSuite::Compare::Container); + CORRADE_COMPARE(out.str(), data.message32); } void TgaImporterTest::color32Rle() { + auto&& data = VerboseData[testCaseInstanceId()]; + setTestCaseDescription(data.name); + Containers::Pointer importer = _manager.instantiate("TgaImporter"); - const char data[] = { + importer->setFlags(data.flags); + const char input[] = { 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 3, 0, 32, 0, /* 2 pixels repeated */ '\x81', 1, 2, 3, 4, @@ -283,15 +332,21 @@ void TgaImporterTest::color32Rle() { 5, 4, 3, 6, 6, 5, 4, 7, 7, 6, 5, 8, 8, 7, 6, 9 }; - CORRADE_VERIFY(importer->openData(data)); + CORRADE_VERIFY(importer->openData(input)); - Containers::Optional image = importer->image2D(0); + std::ostringstream out; + Containers::Optional image; + { + Debug redirectOutput{&out}; + image = importer->image2D(0); + } CORRADE_VERIFY(image); CORRADE_COMPARE(image->storage().alignment(), 4); CORRADE_COMPARE(image->format(), PixelFormat::RGBA8Unorm); CORRADE_COMPARE(image->size(), Vector2i(2, 3)); CORRADE_COMPARE_AS(image->data(), Containers::arrayView(pixels), TestSuite::Compare::Container); + CORRADE_COMPARE(out.str(), data.message32); } void TgaImporterTest::grayscale8() { diff --git a/src/MagnumPlugins/TgaImporter/TgaImporter.cpp b/src/MagnumPlugins/TgaImporter/TgaImporter.cpp index 8e581b2b0..56a5cc81e 100644 --- a/src/MagnumPlugins/TgaImporter/TgaImporter.cpp +++ b/src/MagnumPlugins/TgaImporter/TgaImporter.cpp @@ -189,9 +189,13 @@ Containers::Optional TgaImporter::doImage2D(UnsignedInt, UnsignedIn storage.setAlignment(1); if(format == PixelFormat::RGB8Unorm) { + if(flags() & ImporterFlag::Verbose) + Debug{} << "Trade::TgaImporter::image2D(): converting from BGR to RGB"; for(Vector3ub& pixel: Containers::arrayCast(data)) pixel = Math::gather<'b', 'g', 'r'>(pixel); } else if(format == PixelFormat::RGBA8Unorm) { + if(flags() & ImporterFlag::Verbose) + Debug{} << "Trade::TgaImporter::image2D(): converting from BGRA to RGBA"; for(Vector4ub& pixel: Containers::arrayCast(data)) pixel = Math::gather<'b', 'g', 'r', 'a'>(pixel); }