Skip to content

Commit

Permalink
JpegImageConverter, StbImageConverter: fuzzy verification of JPEG out…
Browse files Browse the repository at this point in the history
…put.

Uses DebugTools::CompareImage to verify the converted output is not too
far from the input.
  • Loading branch information
mosra committed Aug 5, 2018
1 parent b40ef6f commit bac1eb8
Show file tree
Hide file tree
Showing 4 changed files with 76 additions and 3 deletions.
4 changes: 3 additions & 1 deletion src/MagnumPlugins/JpegImageConverter/Test/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@
# DEALINGS IN THE SOFTWARE.
#

find_package(Magnum REQUIRED DebugTools)

# CMake before 3.8 has broken $<TARGET_FILE*> expressions for iOS (see
# https://gitlab.kitware.com/cmake/cmake/merge_requests/404) and since Corrade
# doesn't support dynamic plugins on iOS, this sorta works around that. Should
Expand All @@ -44,7 +46,7 @@ else()
endif()

corrade_add_test(JpegImageConverterTest JpegImageConverterTest.cpp
LIBRARIES Magnum::Trade)
LIBRARIES Magnum::Trade Magnum::DebugTools)
if(NOT BUILD_PLUGINS_STATIC)
target_include_directories(JpegImageConverterTest PRIVATE $<TARGET_FILE_DIR:JpegImageConverterTest>)
else()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
#include <Corrade/TestSuite/Compare/Container.h>
#include <Corrade/Utility/ConfigurationGroup.h>
#include <Magnum/PixelFormat.h>
#include <Magnum/DebugTools/CompareImage.h>
#include <Magnum/Trade/AbstractImageConverter.h>
#include <Magnum/Trade/AbstractImporter.h>
#include <Magnum/Trade/ImageData.h>
Expand All @@ -42,8 +43,10 @@ struct JpegImageConverterTest: TestSuite::Tester {
void wrongFormat();

void rgb80Percent();
void rgb100Percent();

void grayscale80Percent();
void grayscale100Percent();

/* Explicitly forbid system-wide plugin dependencies */
PluginManager::Manager<AbstractImageConverter> _converterManager{"nonexistent"};
Expand All @@ -54,8 +57,10 @@ JpegImageConverterTest::JpegImageConverterTest() {
addTests({&JpegImageConverterTest::wrongFormat,

&JpegImageConverterTest::rgb80Percent,
&JpegImageConverterTest::rgb100Percent,

&JpegImageConverterTest::grayscale80Percent});
&JpegImageConverterTest::grayscale80Percent,
&JpegImageConverterTest::grayscale100Percent});

/* Load the plugin directly from the build tree. Otherwise it's static and
already loaded. */
Expand Down Expand Up @@ -177,6 +182,26 @@ void JpegImageConverterTest::rgb80Percent() {
TestSuite::Compare::Container);
}

void JpegImageConverterTest::rgb100Percent() {
std::unique_ptr<AbstractImageConverter> converter = _converterManager.instantiate("JpegImageConverter");
converter->configuration().setValue("jpegQuality", 1.0f);

const auto data = converter->exportToData(OriginalRgb);
CORRADE_VERIFY(data);

if(_importerManager.loadState("JpegImporter") == PluginManager::LoadState::NotFound)
CORRADE_SKIP("JpegImporter plugin not found, cannot test");

std::unique_ptr<AbstractImporter> importer = _importerManager.instantiate("JpegImporter");
CORRADE_VERIFY(importer->openData(data));
Containers::Optional<Trade::ImageData2D> converted = importer->image2D(0);
CORRADE_VERIFY(converted);

/* Expect only minimal difference (single bits) */
CORRADE_COMPARE_WITH(*converted, OriginalRgb,
(DebugTools::CompareImage{3.1f, 1.4f}));
}

namespace {
constexpr const char OriginalGrayscaleData[] = {
0, 0, 0, 0, 0, 0, 0, 0, /* Skip */
Expand Down Expand Up @@ -230,6 +255,26 @@ void JpegImageConverterTest::grayscale80Percent() {
TestSuite::Compare::Container);
}

void JpegImageConverterTest::grayscale100Percent() {
std::unique_ptr<AbstractImageConverter> converter = _converterManager.instantiate("JpegImageConverter");
converter->configuration().setValue("jpegQuality", 1.0f);

const auto data = converter->exportToData(OriginalGrayscale);
CORRADE_VERIFY(data);

if(_importerManager.loadState("JpegImporter") == PluginManager::LoadState::NotFound)
CORRADE_SKIP("JpegImporter plugin not found, cannot test");

std::unique_ptr<AbstractImporter> importer = _importerManager.instantiate("JpegImporter");
CORRADE_VERIFY(importer->openData(data));
Containers::Optional<Trade::ImageData2D> converted = importer->image2D(0);
CORRADE_VERIFY(converted);

/* Expect only minimal difference (single bits) */
CORRADE_COMPARE_WITH(*converted, OriginalGrayscale,
(DebugTools::CompareImage{1.0f, 0.085f}));
}

}}}

CORRADE_TEST_MAIN(Magnum::Trade::Test::JpegImageConverterTest)
4 changes: 3 additions & 1 deletion src/MagnumPlugins/StbImageConverter/Test/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@
# DEALINGS IN THE SOFTWARE.
#

find_package(Magnum REQUIRED DebugTools)

# CMake before 3.8 has broken $<TARGET_FILE*> expressions for iOS (see
# https://gitlab.kitware.com/cmake/cmake/merge_requests/404) and since Corrade
# doesn't support dynamic plugins on iOS, this sorta works around that. Should
Expand All @@ -44,7 +46,7 @@ else()
endif()

corrade_add_test(StbImageConverterTest StbImageConverterTest.cpp
LIBRARIES Magnum::Trade)
LIBRARIES Magnum::Trade Magnum::DebugTools)
if(NOT BUILD_PLUGINS_STATIC)
target_include_directories(StbImageConverterTest PRIVATE $<TARGET_FILE_DIR:StbImageConverterTest>)
else()
Expand Down
24 changes: 24 additions & 0 deletions src/MagnumPlugins/StbImageConverter/Test/StbImageConverterTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
#include <Corrade/TestSuite/Compare/Container.h>
#include <Corrade/Utility/ConfigurationGroup.h>
#include <Magnum/PixelFormat.h>
#include <Magnum/DebugTools/CompareImage.h>
#include <Magnum/Trade/AbstractImageConverter.h>
#include <Magnum/Trade/AbstractImporter.h>
#include <Magnum/Trade/ImageData.h>
Expand All @@ -50,7 +51,9 @@ struct StbImageConverterTest: TestSuite::Tester {
void hdrGrayscale();

void jpegRgb80Percent();
void jpegRgb100Percent();
void jpegGrayscale80Percent();
/* Can't grayscale 100% because stb_image_write expands to RGB */

void pngRgb();
void pngGrayscale();
Expand All @@ -72,6 +75,7 @@ StbImageConverterTest::StbImageConverterTest() {
&StbImageConverterTest::hdrGrayscale,

&StbImageConverterTest::jpegRgb80Percent,
&StbImageConverterTest::jpegRgb100Percent,
&StbImageConverterTest::jpegGrayscale80Percent,

&StbImageConverterTest::pngRgb,
Expand Down Expand Up @@ -266,6 +270,26 @@ void StbImageConverterTest::jpegRgb80Percent() {
TestSuite::Compare::Container);
}

void StbImageConverterTest::jpegRgb100Percent() {
std::unique_ptr<AbstractImageConverter> converter = _converterManager.instantiate("StbJpegImageConverter");
converter->configuration().setValue("jpegQuality", 1.0f);

const auto data = converter->exportToData(OriginalJpegRgb);
CORRADE_VERIFY(data);

if(_importerManager.loadState("StbImageImporter") == PluginManager::LoadState::NotFound)
CORRADE_SKIP("StbImageImporter plugin not found, cannot test");

std::unique_ptr<AbstractImporter> importer = _importerManager.instantiate("StbImageImporter");
CORRADE_VERIFY(importer->openData(data));
Containers::Optional<Trade::ImageData2D> converted = importer->image2D(0);
CORRADE_VERIFY(converted);

/* Expect only minimal difference (single bits) */
CORRADE_COMPARE_WITH(*converted, OriginalJpegRgb,
(DebugTools::CompareImage{1.0f, 0.39f}));
}

namespace {
constexpr const char OriginalJpegGrayscaleData[] = {
0, 0, 0, 0, 0, 0, 0, 0, /* Skip */
Expand Down

0 comments on commit bac1eb8

Please sign in to comment.