diff --git a/doc/changelog.dox b/doc/changelog.dox index 0a216a322..095ebe235 100644 --- a/doc/changelog.dox +++ b/doc/changelog.dox @@ -525,6 +525,8 @@ See also: - @ref DebugTools::CompareImage now supports comparing half-float pixel formats as well, pixel format autodetection for pixel views tries to match sRGB and normalization properties of the expected image format +- @ref DebugTools::CompareImage now accepts @ref MutableImageView2D as well, + in addition to @ref Image2D, @ref ImageView2D and @ref Trade::ImageData2D @subsubsection changelog-latest-changes-gl GL library diff --git a/src/Magnum/DebugTools/CompareImage.h b/src/Magnum/DebugTools/CompareImage.h index bf00e782f..621703e7f 100644 --- a/src/Magnum/DebugTools/CompareImage.h +++ b/src/Magnum/DebugTools/CompareImage.h @@ -174,7 +174,7 @@ namespace Implementation { /* Explicit ComparatorTraits specialization because Comparator::operator() is overloaded */ -template struct ComparatorTraits { +template struct ComparatorTraits, T> { typedef Magnum::ImageView2D ActualType; typedef Magnum::ImageView2D ExpectedType; }; @@ -187,7 +187,7 @@ template struct ComparatorTraits::operator() is overloaded */ -template struct ComparatorTraits { +template struct ComparatorTraits, T> { typedef Magnum::ImageView2D ActualType; typedef Containers::StringView ExpectedType; }; diff --git a/src/Magnum/DebugTools/Test/CompareImageTest.cpp b/src/Magnum/DebugTools/Test/CompareImageTest.cpp index 3960a7e69..f26700096 100644 --- a/src/Magnum/DebugTools/Test/CompareImageTest.cpp +++ b/src/Magnum/DebugTools/Test/CompareImageTest.cpp @@ -40,6 +40,7 @@ #include #include /* replaceFirst() */ +#include "Magnum/Image.h" #include "Magnum/ImageView.h" #include "Magnum/PixelFormat.h" #include "Magnum/DebugTools/CompareImage.h" @@ -48,6 +49,7 @@ #include "Magnum/Math/Half.h" #include "Magnum/Trade/AbstractImageConverter.h" #include "Magnum/Trade/AbstractImporter.h" +#include "Magnum/Trade/ImageData.h" #include "configure.h" @@ -116,6 +118,9 @@ struct CompareImageTest: TestSuite::Tester { void fileToImageActualLoadFailed(); void fileToImageActualIsCompressed(); + void mutableImageViewImageImageData(); + void mutableImageViewImageImageDataToFile(); + template void pixelFormatFor(); void pixelFormatForColor(); @@ -222,7 +227,13 @@ CompareImageTest::CompareImageTest() { &CompareImageTest::setupExternalPluginManager, &CompareImageTest::teardownExternalPluginManager); - addTests({&CompareImageTest::fileToImageActualIsCompressed}); + addTests({&CompareImageTest::fileToImageActualIsCompressed, + + &CompareImageTest::mutableImageViewImageImageData}); + + addTests({&CompareImageTest::mutableImageViewImageImageDataToFile}, + &CompareImageTest::setupExternalPluginManager, + &CompareImageTest::teardownExternalPluginManager); addTests({&CompareImageTest::pixelFormatFor<1>, &CompareImageTest::pixelFormatFor<2>, @@ -1688,6 +1699,70 @@ void CompareImageTest::fileToImageActualIsCompressed() { "Actual image a (.../CompareImageCompressed.dds) is compressed, comparison not possible.\n"); } +void CompareImageTest::mutableImageViewImageImageData() { + /* All other cases use an ImageView, so verify that the other variants all + compile too */ + + char pixels[]{ + '\x56', '\xf8', '\x3a', '\x56', '\x47', '\xec', '\0', '\0', + '\x23', '\x57', '\x10', '\xab', '\xcd', '\x85', '\0', '\0' + }; + MutableImageView2D view{PixelFormat::RGB8Unorm, {2, 2}, pixels}; + + Image2D image{PixelFormat::RGB8Unorm, {2, 2}, Containers::array({ + '\x56', '\xf8', '\x3a', '\x56', '\x47', '\xec', '\0', '\0', + '\x23', '\x57', '\x10', '\xab', '\xcd', '\x85', '\0', '\0' + })}; + + Trade::ImageData2D data{PixelFormat::RGB8Unorm, {2, 2}, Trade::DataFlags{}, pixels}; + + CORRADE_COMPARE_AS(view, view, CompareImage); + CORRADE_COMPARE_AS(view, image, CompareImage); + CORRADE_COMPARE_AS(view, data, CompareImage); + CORRADE_COMPARE_AS(image, view, CompareImage); + CORRADE_COMPARE_AS(image, image, CompareImage); + CORRADE_COMPARE_AS(image, data, CompareImage); + CORRADE_COMPARE_AS(data, view, CompareImage); + CORRADE_COMPARE_AS(data, image, CompareImage); + CORRADE_COMPARE_AS(data, data, CompareImage); +} + +void CompareImageTest::mutableImageViewImageImageDataToFile() { + if(!(_importerManager->loadState("AnyImageImporter") & PluginManager::LoadState::Loaded) || + !(_importerManager->loadState("TgaImporter") & PluginManager::LoadState::Loaded)) + CORRADE_SKIP("AnyImageImporter / TgaImporter plugins not found."); + + /* All other cases use an ImageView, so verify that the other variants all + compile too */ + + char pixels[]{ + '\x55', '\xf8', '\x3a', '\x56', '\x10', '\xed', '\0', '\0', + '\x23', '\x27', '\x10', '\xab', '\xcd', '\xfa', '\0', '\0' + }; + MutableImageView2D view{PixelFormat::RGB8Unorm, {2, 2}, pixels}; + + Image2D image{PixelFormat::RGB8Unorm, {2, 2}, Containers::array({ + '\x55', '\xf8', '\x3a', '\x56', '\x10', '\xed', '\0', '\0', + '\x23', '\x27', '\x10', '\xab', '\xcd', '\xfa', '\0', '\0' + })}; + + Trade::ImageData2D data{PixelFormat::RGB8Unorm, {2, 2}, Trade::DataFlags{}, pixels}; + + Containers::String filename = Utility::Path::join(DEBUGTOOLS_TEST_DIR, "CompareImageExpected.tga"); + CORRADE_COMPARE_WITH(filename, view, + CompareFileToImage{*_importerManager}); + CORRADE_COMPARE_WITH(filename, image, + CompareFileToImage{*_importerManager}); + CORRADE_COMPARE_WITH(filename, data, + CompareFileToImage{*_importerManager}); + CORRADE_COMPARE_WITH(view, filename, + CompareImageToFile{*_importerManager}); + CORRADE_COMPARE_WITH(image, filename, + CompareImageToFile{*_importerManager}); + CORRADE_COMPARE_WITH(data, filename, + CompareImageToFile{*_importerManager}); +} + template void CompareImageTest::pixelFormatFor() { setTestCaseTemplateName(Utility::format("{}", dimensions));