Browse Source

Adapted to Magnum changes.

Removed redundant checks, hidden implementation to class privates.
pull/34/head
Vladimír Vondruš 13 years ago
parent
commit
4d69b63fb6
  1. 40
      src/Plugins/TgaImageConverter/Test/TgaImageConverterTest.cpp
  2. 44
      src/Plugins/TgaImageConverter/TgaImageConverter.cpp
  3. 6
      src/Plugins/TgaImageConverter/TgaImageConverter.h
  4. 2
      src/Plugins/TgaImageConverter/pluginRegistrationTgaImageConverter.cpp
  5. 29
      src/Plugins/TgaImporter/Test/TgaImporterTest.cpp
  6. 30
      src/Plugins/TgaImporter/TgaImporter.cpp
  7. 16
      src/Plugins/TgaImporter/TgaImporter.h
  8. 2
      src/Plugins/TgaImporter/pluginRegistrationTgaImporter.cpp

40
src/Plugins/TgaImageConverter/Test/TgaImageConverterTest.cpp

@ -24,6 +24,7 @@
#include <sstream>
#include <tuple>
#include <Containers/Array.h>
#include <TestSuite/Tester.h>
#include <Utility/Directory.h>
#include <Image.h>
@ -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<const char*>(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<const char*>(converted->data()), 2*3*3),
std::string(reinterpret_cast<const char*>(original.data()), 2*3*3));
Utility::Directory::rm(filename);
}
}}}}
CORRADE_TEST_MAIN(Magnum::Trade::TgaImageConverter::Test::TgaImageConverterTest)

44
src/Plugins/TgaImageConverter/TgaImageConverter.cpp

@ -26,6 +26,7 @@
#include <fstream>
#include <tuple>
#include <Containers/Array.h>
#include <Utility/Endianness.h>
#include <Image.h>
#include <ImageFormat.h>
@ -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<const unsigned char*, std::size_t> TgaImageConverter::convertToData(const Image2D* const image) const {
Containers::Array<unsigned char> 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<const unsigned char*, std::size_t> 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<unsigned char>::zeroInitialized(sizeof(TgaImporter::TgaHeader) + pixelSize*image->size().product());
/* Fill header */
auto header = reinterpret_cast<TgaImporter::TgaHeader*>(data);
auto header = reinterpret_cast<TgaImporter::TgaHeader*>(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<Math::Vector3<UnsignedByte>*>(data+sizeof(TgaImporter::TgaHeader));
auto pixels = reinterpret_cast<Math::Vector3<UnsignedByte>*>(data.begin()+sizeof(TgaImporter::TgaHeader));
std::transform(pixels, pixels + image->size().product(), pixels,
[](Math::Vector3<UnsignedByte> pixel) { return swizzle<'b', 'g', 'r'>(pixel); });
} else if(image->format() == ImageFormat::RGBA) {
auto pixels = reinterpret_cast<Math::Vector4<UnsignedByte>*>(data+sizeof(TgaImporter::TgaHeader));
auto pixels = reinterpret_cast<Math::Vector4<UnsignedByte>*>(data.begin()+sizeof(TgaImporter::TgaHeader));
std::transform(pixels, pixels + image->size().product(), pixels,
[](Math::Vector4<UnsignedByte> 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<const char*>(data), size);
delete[] data;
return true;
return std::move(data);
}
}}}

6
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<const unsigned char*, std::size_t> 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<unsigned char> doExportToData(const Image2D* const image) const override;
};
}}}

2
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")

29
src/Plugins/TgaImporter/Test/TgaImporterTest.cpp

@ -23,6 +23,7 @@
*/
#include <sstream>
#include <Containers/Array.h>
#include <TestSuite/Tester.h>
#include <Utility/Directory.h>
#include <ImageFormat.h>
@ -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<const char*>(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<const char*>(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<const char*>(image->data()), 2*3), std::string(data + 18, 2*3));
CORRADE_COMPARE(std::string(reinterpret_cast<const char*>(image->data()), 2*3),
std::string(reinterpret_cast<const char*>(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<const char*>(image->data()), 2*3), std::string(data + 18, 2*3));
CORRADE_COMPARE(std::string(reinterpret_cast<const char*>(image->data()), 2*3),
std::string(reinterpret_cast<const char*>(data) + 18, 2*3));
}
}}}}

30
src/Plugins/TgaImporter/TgaImporter.cpp

@ -27,6 +27,7 @@
#include <fstream>
#include <sstream>
#include <Utility/Endianness.h>
#include <Containers/Array.h>
#include <ImageFormat.h>
#include <Trade/ImageData.h>
@ -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<const char*>(data), size));
return true;
void TgaImporter::doOpenData(const Containers::ArrayReference<const unsigned char> data) {
in = new std::istringstream(std::string(reinterpret_cast<const char*>(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();

16
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<const unsigned char> 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;
};

2
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")

Loading…
Cancel
Save