diff --git a/src/Plugins/TgaImageConverter/Test/TgaImageConverterTest.cpp b/src/Plugins/TgaImageConverter/Test/TgaImageConverterTest.cpp index f1dd896f4..34f716cef 100644 --- a/src/Plugins/TgaImageConverter/Test/TgaImageConverterTest.cpp +++ b/src/Plugins/TgaImageConverter/Test/TgaImageConverterTest.cpp @@ -24,6 +24,7 @@ #include #include +#include #include #include #include @@ -44,7 +45,6 @@ class TgaImageConverterTest: public TestSuite::Tester { void wrongType(); void data(); - void file(); }; namespace { @@ -64,8 +64,7 @@ TgaImageConverterTest::TgaImageConverterTest() { addTests({&TgaImageConverterTest::wrongFormat, &TgaImageConverterTest::wrongType, - &TgaImageConverterTest::data, - &TgaImageConverterTest::file}); + &TgaImageConverterTest::data}); } void TgaImageConverterTest::wrongFormat() { @@ -74,8 +73,7 @@ void TgaImageConverterTest::wrongFormat() { std::ostringstream out; Error::setOutput(&out); - const unsigned char* data; - std::tie(data, std::ignore) = TgaImageConverter().convertToData(&image); + const auto data = TgaImageConverter().exportToData(&image); CORRADE_VERIFY(!data); CORRADE_COMPARE(out.str(), "Trade::TgaImageConverter::TgaImageConverter::convertToData(): unsupported image format ImageFormat::RG\n"); } @@ -86,19 +84,16 @@ void TgaImageConverterTest::wrongType() { std::ostringstream out; Error::setOutput(&out); - const unsigned char* data; - std::tie(data, std::ignore) = TgaImageConverter().convertToData(&image); + const auto data = TgaImageConverter().exportToData(&image); CORRADE_VERIFY(!data); CORRADE_COMPARE(out.str(), "Trade::TgaImageConverter::TgaImageConverter::convertToData(): unsupported image type ImageType::Float\n"); } void TgaImageConverterTest::data() { - const unsigned char* data; - std::size_t size; - std::tie(data, size) = TgaImageConverter().convertToData(&original); + const auto data = TgaImageConverter().exportToData(&original); TgaImporter::TgaImporter importer; - CORRADE_VERIFY(importer.openData(data, size)); + CORRADE_VERIFY(importer.openData(data)); Trade::ImageData2D* converted = importer.image2D(0); CORRADE_VERIFY(converted); @@ -113,29 +108,6 @@ void TgaImageConverterTest::data() { std::string(reinterpret_cast(original.data()), 2*3*3)); } -void TgaImageConverterTest::file() { - const std::string filename = Utility::Directory::join(TGAIMAGECONVERTER_TEST_DIR, "file.tga"); - Utility::Directory::rm(filename); - CORRADE_VERIFY(TgaImageConverter().convertToFile(&original, filename)); - - TgaImporter::TgaImporter importer; - CORRADE_VERIFY(importer.openFile(filename)); - Trade::ImageData2D* converted = importer.image2D(0); - CORRADE_VERIFY(converted); - - CORRADE_COMPARE(converted->size(), Vector2i(2, 3)); - #ifndef MAGNUM_TARGET_GLES - CORRADE_COMPARE(converted->format(), ImageFormat::BGR); - #else - CORRADE_COMPARE(converted->format(), ImageFormat::RGB); - #endif - CORRADE_COMPARE(converted->type(), ImageType::UnsignedByte); - CORRADE_COMPARE(std::string(reinterpret_cast(converted->data()), 2*3*3), - std::string(reinterpret_cast(original.data()), 2*3*3)); - - Utility::Directory::rm(filename); -} - }}}} CORRADE_TEST_MAIN(Magnum::Trade::TgaImageConverter::Test::TgaImageConverterTest) diff --git a/src/Plugins/TgaImageConverter/TgaImageConverter.cpp b/src/Plugins/TgaImageConverter/TgaImageConverter.cpp index 7f5ae0cb4..d10ebc3c7 100644 --- a/src/Plugins/TgaImageConverter/TgaImageConverter.cpp +++ b/src/Plugins/TgaImageConverter/TgaImageConverter.cpp @@ -26,6 +26,7 @@ #include #include +#include #include #include #include @@ -43,11 +44,9 @@ TgaImageConverter::TgaImageConverter() = default; TgaImageConverter::TgaImageConverter(PluginManager::AbstractManager* manager, std::string plugin): AbstractImageConverter(manager, std::move(plugin)) {} -TgaImageConverter::Features TgaImageConverter::features() const { - return Feature::ConvertToData|Feature::ConvertToFile; -} +auto TgaImageConverter::doFeatures() const -> Features { return Feature::ConvertData; } -std::pair TgaImageConverter::convertToData(const Image2D* const image) const { +Containers::Array TgaImageConverter::doExportToData(const Image2D* const image) const { #ifndef MAGNUM_TARGET_GLES if(image->format() != ImageFormat::BGR && image->format() != ImageFormat::BGRA && @@ -59,62 +58,41 @@ std::pair TgaImageConverter::convertToData(co #endif { Error() << "Trade::TgaImageConverter::TgaImageConverter::convertToData(): unsupported image format" << image->format(); - return {nullptr, 0}; + return nullptr; } if(image->type() != ImageType::UnsignedByte) { Error() << "Trade::TgaImageConverter::TgaImageConverter::convertToData(): unsupported image type" << image->type(); - return {nullptr, 0}; + return nullptr; } /* Initialize data buffer */ const UnsignedByte pixelSize = image->pixelSize(); - const std::size_t size = sizeof(TgaImporter::TgaHeader) + pixelSize*image->size().product(); - unsigned char* data = new unsigned char[size](); + auto data = Containers::Array::zeroInitialized(sizeof(TgaImporter::TgaHeader) + pixelSize*image->size().product()); /* Fill header */ - auto header = reinterpret_cast(data); + auto header = reinterpret_cast(data.begin()); header->imageType = image->format() == ImageFormat::Red ? 3 : 2; header->bpp = pixelSize*8; header->width = Utility::Endianness::littleEndian(image->size().x()); header->height = Utility::Endianness::littleEndian(image->size().y()); /* Fill data */ - std::copy(image->data(), image->data()+pixelSize*image->size().product(), data+sizeof(TgaImporter::TgaHeader)); + std::copy(image->data(), image->data()+pixelSize*image->size().product(), data.begin()+sizeof(TgaImporter::TgaHeader)); #ifdef MAGNUM_TARGET_GLES if(image->format() == ImageFormat::RGB) { - auto pixels = reinterpret_cast*>(data+sizeof(TgaImporter::TgaHeader)); + auto pixels = reinterpret_cast*>(data.begin()+sizeof(TgaImporter::TgaHeader)); std::transform(pixels, pixels + image->size().product(), pixels, [](Math::Vector3 pixel) { return swizzle<'b', 'g', 'r'>(pixel); }); } else if(image->format() == ImageFormat::RGBA) { - auto pixels = reinterpret_cast*>(data+sizeof(TgaImporter::TgaHeader)); + auto pixels = reinterpret_cast*>(data.begin()+sizeof(TgaImporter::TgaHeader)); std::transform(pixels, pixels + image->size().product(), pixels, [](Math::Vector4 pixel) { return swizzle<'b', 'g', 'r', 'a'>(pixel); }); } #endif - return {data, size}; -} - -bool TgaImageConverter::convertToFile(const Image2D* const image, const std::string& filename) const { - /* Convert the image */ - const unsigned char* data; - std::size_t size; - std::tie(data, size) = convertToData(image); - if(!data) return false; - - /* Open file */ - std::ofstream out(filename.c_str()); - if(!out.good()) { - delete[] data; - return false; - } - - /* Write contents */ - out.write(reinterpret_cast(data), size); - delete[] data; - return true; + return std::move(data); } }}} diff --git a/src/Plugins/TgaImageConverter/TgaImageConverter.h b/src/Plugins/TgaImageConverter/TgaImageConverter.h index 174e98f0a..0f2fa5fda 100644 --- a/src/Plugins/TgaImageConverter/TgaImageConverter.h +++ b/src/Plugins/TgaImageConverter/TgaImageConverter.h @@ -47,9 +47,9 @@ class TgaImageConverter: public AbstractImageConverter { /** @brief Plugin manager constructor */ explicit TgaImageConverter(PluginManager::AbstractManager* manager, std::string plugin); - Features features() const override; - std::pair convertToData(const Image2D* const image) const override; - bool convertToFile(const Image2D* const image, const std::string& filename) const override; + private: + Features doFeatures() const override; + Containers::Array doExportToData(const Image2D* const image) const override; }; }}} diff --git a/src/Plugins/TgaImageConverter/pluginRegistrationTgaImageConverter.cpp b/src/Plugins/TgaImageConverter/pluginRegistrationTgaImageConverter.cpp index c254a4520..c736aa768 100644 --- a/src/Plugins/TgaImageConverter/pluginRegistrationTgaImageConverter.cpp +++ b/src/Plugins/TgaImageConverter/pluginRegistrationTgaImageConverter.cpp @@ -25,4 +25,4 @@ #include "TgaImageConverter.h" CORRADE_PLUGIN_REGISTER(TgaImageConverter, Magnum::Trade::TgaImageConverter::TgaImageConverter, - "cz.mosra.magnum.Trade.AbstractImageConverter/0.1") + "cz.mosra.magnum.Trade.AbstractImageConverter/0.2") diff --git a/src/Plugins/TgaImporter/Test/TgaImporterTest.cpp b/src/Plugins/TgaImporter/Test/TgaImporterTest.cpp index 7b4e089a9..3c236ab42 100644 --- a/src/Plugins/TgaImporter/Test/TgaImporterTest.cpp +++ b/src/Plugins/TgaImporter/Test/TgaImporterTest.cpp @@ -23,6 +23,7 @@ */ #include +#include #include #include #include @@ -80,7 +81,7 @@ void TgaImporterTest::openInexistent() { void TgaImporterTest::openShort() { TgaImporter importer; - const char data[] = { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + const unsigned char data[] = { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; CORRADE_VERIFY(importer.openData(data)); std::ostringstream debug; @@ -91,7 +92,7 @@ void TgaImporterTest::openShort() { void TgaImporterTest::paletted() { TgaImporter importer; - const char data[] = { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + const unsigned char data[] = { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; CORRADE_VERIFY(importer.openData(data)); std::ostringstream debug; @@ -102,7 +103,7 @@ void TgaImporterTest::paletted() { void TgaImporterTest::compressed() { TgaImporter importer; - const char data[] = { 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + const unsigned char data[] = { 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; CORRADE_VERIFY(importer.openData(data)); std::ostringstream debug; @@ -113,7 +114,7 @@ void TgaImporterTest::compressed() { void TgaImporterTest::colorBits16() { TgaImporter importer; - const char data[] = { 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0 }; + const unsigned char data[] = { 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0 }; CORRADE_VERIFY(importer.openData(data)); std::ostringstream debug; @@ -124,14 +125,14 @@ void TgaImporterTest::colorBits16() { void TgaImporterTest::colorBits24() { TgaImporter importer; - const char data[] = { + const unsigned char data[] = { 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 3, 0, 24, 0, 1, 2, 3, 2, 3, 4, 3, 4, 5, 4, 5, 6, 5, 6, 7, 6, 7, 8 }; #ifndef MAGNUM_TARGET_GLES - const char* pixels = data + 18; + const char* pixels = reinterpret_cast(data) + 18; #else const char pixels[] = { 3, 2, 1, 4, 3, 2, @@ -157,14 +158,14 @@ void TgaImporterTest::colorBits24() { void TgaImporterTest::colorBits32() { TgaImporter importer; - const char data[] = { + const unsigned char data[] = { 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 3, 0, 32, 0, 1, 2, 3, 1, 2, 3, 4, 1, 3, 4, 5, 1, 4, 5, 6, 1, 5, 6, 7, 1, 6, 7, 8, 1 }; #ifndef MAGNUM_TARGET_GLES - const char* pixels = data + 18; + const char* pixels = reinterpret_cast(data) + 18; #else const char pixels[] = { 3, 2, 1, 1, 4, 3, 2, 1, @@ -190,7 +191,7 @@ void TgaImporterTest::colorBits32() { void TgaImporterTest::grayscaleBits8() { TgaImporter importer; - const char data[] = { + const unsigned char data[] = { 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 3, 0, 8, 0, 1, 2, 3, 4, @@ -203,12 +204,13 @@ void TgaImporterTest::grayscaleBits8() { CORRADE_COMPARE(image->format(), ImageFormat::Red); CORRADE_COMPARE(image->size(), Vector2i(2, 3)); CORRADE_COMPARE(image->type(), ImageType::UnsignedByte); - CORRADE_COMPARE(std::string(reinterpret_cast(image->data()), 2*3), std::string(data + 18, 2*3)); + CORRADE_COMPARE(std::string(reinterpret_cast(image->data()), 2*3), + std::string(reinterpret_cast(data) + 18, 2*3)); } void TgaImporterTest::grayscaleBits16() { TgaImporter importer; - const char data[] = { 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0 }; + const unsigned char data[] = { 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0 }; CORRADE_VERIFY(importer.openData(data)); std::ostringstream debug; @@ -219,7 +221,7 @@ void TgaImporterTest::grayscaleBits16() { void TgaImporterTest::file() { TgaImporter importer; - const char data[] = { + const unsigned char data[] = { 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 3, 0, 8, 0, 1, 2, 3, 4, @@ -232,7 +234,8 @@ void TgaImporterTest::file() { CORRADE_COMPARE(image->format(), ImageFormat::Red); CORRADE_COMPARE(image->size(), Vector2i(2, 3)); CORRADE_COMPARE(image->type(), ImageType::UnsignedByte); - CORRADE_COMPARE(std::string(reinterpret_cast(image->data()), 2*3), std::string(data + 18, 2*3)); + CORRADE_COMPARE(std::string(reinterpret_cast(image->data()), 2*3), + std::string(reinterpret_cast(data) + 18, 2*3)); } }}}} diff --git a/src/Plugins/TgaImporter/TgaImporter.cpp b/src/Plugins/TgaImporter/TgaImporter.cpp index 8d8e4b0e5..719548d8b 100644 --- a/src/Plugins/TgaImporter/TgaImporter.cpp +++ b/src/Plugins/TgaImporter/TgaImporter.cpp @@ -27,6 +27,7 @@ #include #include #include +#include #include #include @@ -45,41 +46,30 @@ TgaImporter::TgaImporter(PluginManager::AbstractManager* manager, std::string pl TgaImporter::~TgaImporter() { close(); } -TgaImporter::Features TgaImporter::features() const { - return Feature::OpenData|Feature::OpenFile; -} +auto TgaImporter::doFeatures() const -> Features { return Feature::OpenData; } -bool TgaImporter::TgaImporter::openData(const void* const data, const std::size_t size) { - close(); +bool TgaImporter::doIsOpened() const { return in; } - in = new std::istringstream(std::string(reinterpret_cast(data), size)); - return true; +void TgaImporter::doOpenData(const Containers::ArrayReference data) { + in = new std::istringstream(std::string(reinterpret_cast(data.begin()), data.size())); } -bool TgaImporter::TgaImporter::openFile(const std::string& filename) { - close(); - +void TgaImporter::doOpenFile(const std::string& filename) { in = new std::ifstream(filename.c_str()); - if(in->good()) return true; + if(in->good()) return; Error() << "Trade::TgaImporter::TgaImporter::openFile(): cannot open file" << filename; close(); - return false; } -void TgaImporter::close() { +void TgaImporter::doClose() { delete in; in = nullptr; } -UnsignedInt TgaImporter::TgaImporter::image2DCount() const { - return in ? 1 : 0; -} - -ImageData2D* TgaImporter::image2D(UnsignedInt id) { - CORRADE_ASSERT(in, "Trade::TgaImporter::TgaImporter::image2D(): no file opened", nullptr); - CORRADE_ASSERT(id == 0, "Trade::TgaImporter::TgaImporter::image2D(): wrong image ID", nullptr); +UnsignedInt TgaImporter::doImage2DCount() const { return 1; } +ImageData2D* TgaImporter::doImage2D(UnsignedInt) { /* Check if the file is long enough */ in->seekg(0, std::istream::end); std::streampos filesize = in->tellg(); diff --git a/src/Plugins/TgaImporter/TgaImporter.h b/src/Plugins/TgaImporter/TgaImporter.h index b1b8b7e3b..3280b0879 100644 --- a/src/Plugins/TgaImporter/TgaImporter.h +++ b/src/Plugins/TgaImporter/TgaImporter.h @@ -61,16 +61,14 @@ class MAGNUM_TGAIMPORTER_EXPORT TgaImporter: public AbstractImporter { virtual ~TgaImporter(); - Features features() const override; - bool openData(const void* const data, const std::size_t size) override; - using AbstractImporter::openData; - bool openFile(const std::string& filename) override; - void close() override; - UnsignedInt image2DCount() const override; - ImageData2D* image2D(UnsignedInt id) override; - private: - bool MAGNUM_TGAIMPORTER_LOCAL open(std::istream& in); + Features MAGNUM_TGAIMPORTER_LOCAL doFeatures() const override; + bool MAGNUM_TGAIMPORTER_LOCAL doIsOpened() const override; + void MAGNUM_TGAIMPORTER_LOCAL doOpenData(Containers::ArrayReference data) override; + void MAGNUM_TGAIMPORTER_LOCAL doOpenFile(const std::string& filename) override; + void MAGNUM_TGAIMPORTER_LOCAL doClose() override; + UnsignedInt MAGNUM_TGAIMPORTER_LOCAL doImage2DCount() const override; + ImageData2D MAGNUM_TGAIMPORTER_LOCAL * doImage2D(UnsignedInt id) override; std::istream* in; }; diff --git a/src/Plugins/TgaImporter/pluginRegistrationTgaImporter.cpp b/src/Plugins/TgaImporter/pluginRegistrationTgaImporter.cpp index 15fddbf01..2f5a1ccab 100644 --- a/src/Plugins/TgaImporter/pluginRegistrationTgaImporter.cpp +++ b/src/Plugins/TgaImporter/pluginRegistrationTgaImporter.cpp @@ -25,4 +25,4 @@ #include "TgaImporter.h" CORRADE_PLUGIN_REGISTER(TgaImporter, Magnum::Trade::TgaImporter::TgaImporter, - "cz.mosra.magnum.Trade.AbstractImporter/0.2.1") + "cz.mosra.magnum.Trade.AbstractImporter/0.3")