From f490176caef283d68b96d46d833a1c99a1cf8c11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Fri, 7 Oct 2016 20:12:00 +0200 Subject: [PATCH] Trade: added clever ImageConverter::exportTo*() ImageData overloads. They call either the compressed or the uncompressed version based on whether the image is compressed or not. --- src/Magnum/Trade/AbstractImageConverter.cpp | 9 +++ src/Magnum/Trade/AbstractImageConverter.h | 21 +++++++ .../Trade/Test/AbstractImageConverterTest.cpp | 63 ++++++++++++++++++- 3 files changed, 92 insertions(+), 1 deletion(-) diff --git a/src/Magnum/Trade/AbstractImageConverter.cpp b/src/Magnum/Trade/AbstractImageConverter.cpp index d3589bf7d..1bbb92cc0 100644 --- a/src/Magnum/Trade/AbstractImageConverter.cpp +++ b/src/Magnum/Trade/AbstractImageConverter.cpp @@ -30,6 +30,7 @@ #include #include "Magnum/Image.h" +#include "Magnum/Trade/ImageData.h" namespace Magnum { namespace Trade { @@ -87,6 +88,10 @@ Containers::Array AbstractImageConverter::doExportToData(const CompressedI return nullptr; } +Containers::Array AbstractImageConverter::exportToData(const ImageData2D& image) { + return image.isCompressed() ? exportToData(CompressedImageView2D(image)) : exportToData(ImageView2D(image)); +} + bool AbstractImageConverter::exportToFile(const ImageView2D& image, const std::string& filename) { CORRADE_ASSERT(features() & Feature::ConvertFile, "Trade::AbstractImageConverter::exportToFile(): feature not supported", {}); @@ -131,4 +136,8 @@ bool AbstractImageConverter::doExportToFile(const CompressedImageView2D& image, return true; } +bool AbstractImageConverter::exportToFile(const ImageData2D& image, const std::string& filename) { + return image.isCompressed() ? exportToFile(CompressedImageView2D(image), filename) : exportToFile(ImageView2D(image), filename); +} + }} diff --git a/src/Magnum/Trade/AbstractImageConverter.h b/src/Magnum/Trade/AbstractImageConverter.h index 735a4f1ec..facb2eaad 100644 --- a/src/Magnum/Trade/AbstractImageConverter.h +++ b/src/Magnum/Trade/AbstractImageConverter.h @@ -33,6 +33,7 @@ #include "Magnum/Magnum.h" #include "Magnum/visibility.h" +#include "Magnum/Trade/Trade.h" #include "MagnumExternal/Optional/optional.hpp" namespace Magnum { namespace Trade { @@ -162,6 +163,16 @@ class MAGNUM_EXPORT AbstractImageConverter: public PluginManager::AbstractManagi */ Containers::Array exportToData(const CompressedImageView2D& image); + /** + * @brief Export image to raw data + * + * Based on whether the image is compressed or not, calls either + * @ref exportToData(const ImageView2D&) or + * @ref exportToData(const CompressedImageView2D&). See documentation + * of those two functions for details. + */ + Containers::Array exportToData(const ImageData2D& image); + /** * @brief Export image to file * @@ -184,6 +195,16 @@ class MAGNUM_EXPORT AbstractImageConverter: public PluginManager::AbstractManagi */ bool exportToFile(const CompressedImageView2D& image, const std::string& filename); + /** + * @brief Export image to file + * + * Based on whether the image is compressed or not, calls either + * @ref exportToFile(const ImageView2D&, const std::string&) or + * @ref exportToFile(const CompressedImageView2D&, const std::string&). + * See documentation of those two functions for details. + */ + bool exportToFile(const ImageData2D& image, const std::string& filename); + #ifndef DOXYGEN_GENERATING_OUTPUT private: #else diff --git a/src/Magnum/Trade/Test/AbstractImageConverterTest.cpp b/src/Magnum/Trade/Test/AbstractImageConverterTest.cpp index d70edd92c..a081a262c 100644 --- a/src/Magnum/Trade/Test/AbstractImageConverterTest.cpp +++ b/src/Magnum/Trade/Test/AbstractImageConverterTest.cpp @@ -25,12 +25,14 @@ #include #include +#include #include #include #include "Magnum/ImageView.h" #include "Magnum/PixelFormat.h" #include "Magnum/Trade/AbstractImageConverter.h" +#include "Magnum/Trade/ImageData.h" #include "configure.h" @@ -41,10 +43,16 @@ class AbstractImageConverterTest: public TestSuite::Tester { explicit AbstractImageConverterTest(); void exportToFile(); + + void exportToDataImageData(); + void exportToFileImageData(); }; AbstractImageConverterTest::AbstractImageConverterTest() { - addTests({&AbstractImageConverterTest::exportToFile}); + addTests({&AbstractImageConverterTest::exportToFile, + + &AbstractImageConverterTest::exportToDataImageData, + &AbstractImageConverterTest::exportToFileImageData}); /* Create testing dir */ Utility::Directory::mkpath(TRADE_TEST_OUTPUT_DIR); @@ -71,6 +79,59 @@ void AbstractImageConverterTest::exportToFile() { "\xFE\xED", TestSuite::Compare::FileToString); } +namespace { + +class ImageDataExporter: public Trade::AbstractImageConverter { + private: + Features doFeatures() const override { return Feature::ConvertData; } + + Containers::Array doExportToData(const ImageView2D&) override { + return Containers::Array::from('B'); + }; + + Containers::Array doExportToData(const CompressedImageView2D&) override { + return Containers::Array::from('C'); + }; +}; + +} + +void AbstractImageConverterTest::exportToDataImageData() { + ImageDataExporter exporter; + + { + /* Should get "B" when converting uncompressed */ + ImageData2D image{PixelFormat::RGBA, PixelType::UnsignedByte, {}, nullptr}; + CORRADE_COMPARE_AS(exporter.exportToData(image), + Containers::Array::from('B'), + TestSuite::Compare::Container); + } { + /* Should get "C" when converting compressed */ + ImageData2D image{PixelFormat::RGBA, PixelType::UnsignedByte, {}, nullptr}; + CORRADE_COMPARE_AS(exporter.exportToData(image), + Containers::Array::from('B'), + TestSuite::Compare::Container); + } +} + +void AbstractImageConverterTest::exportToFileImageData() { + ImageDataExporter exporter; + + { + /* Should get "B" when converting uncompressed */ + ImageData2D image{PixelFormat::RGBA, PixelType::UnsignedByte, {}, nullptr}; + CORRADE_VERIFY(exporter.exportToFile(image, Utility::Directory::join(TRADE_TEST_OUTPUT_DIR, "image.out"))); + CORRADE_COMPARE_AS(Utility::Directory::join(TRADE_TEST_OUTPUT_DIR, "image.out"), + "B", TestSuite::Compare::FileToString); + } { + /* Should get "B" when converting uncompressed */ + ImageData2D image{PixelFormat::RGBA, PixelType::UnsignedByte, {}, nullptr}; + CORRADE_VERIFY(exporter.exportToFile(image, Utility::Directory::join(TRADE_TEST_OUTPUT_DIR, "image.out"))); + CORRADE_COMPARE_AS(Utility::Directory::join(TRADE_TEST_OUTPUT_DIR, "image.out"), + "B", TestSuite::Compare::FileToString); + } +} + }}} CORRADE_TEST_MAIN(Magnum::Trade::Test::AbstractImageConverterTest)