Browse Source

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.
pull/181/head
Vladimír Vondruš 10 years ago
parent
commit
f490176cae
  1. 9
      src/Magnum/Trade/AbstractImageConverter.cpp
  2. 21
      src/Magnum/Trade/AbstractImageConverter.h
  3. 63
      src/Magnum/Trade/Test/AbstractImageConverterTest.cpp

9
src/Magnum/Trade/AbstractImageConverter.cpp

@ -30,6 +30,7 @@
#include <Corrade/Utility/Directory.h>
#include "Magnum/Image.h"
#include "Magnum/Trade/ImageData.h"
namespace Magnum { namespace Trade {
@ -87,6 +88,10 @@ Containers::Array<char> AbstractImageConverter::doExportToData(const CompressedI
return nullptr;
}
Containers::Array<char> 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);
}
}}

21
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<char> 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<char> 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

63
src/Magnum/Trade/Test/AbstractImageConverterTest.cpp

@ -25,12 +25,14 @@
#include <Corrade/Containers/Array.h>
#include <Corrade/TestSuite/Tester.h>
#include <Corrade/TestSuite/Compare/Container.h>
#include <Corrade/TestSuite/Compare/FileToString.h>
#include <Corrade/Utility/Directory.h>
#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<char> doExportToData(const ImageView2D&) override {
return Containers::Array<char>::from('B');
};
Containers::Array<char> doExportToData(const CompressedImageView2D&) override {
return Containers::Array<char>::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<char>::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<char>::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)

Loading…
Cancel
Save