mirror of https://github.com/mosra/magnum.git
8 changed files with 409 additions and 0 deletions
@ -0,0 +1,46 @@
|
||||
# |
||||
# This file is part of Magnum. |
||||
# |
||||
# Copyright © 2010, 2011, 2012, 2013 Vladimír Vondruš <mosra@centrum.cz> |
||||
# |
||||
# Permission is hereby granted, free of charge, to any person obtaining a |
||||
# copy of this software and associated documentation files (the "Software"), |
||||
# to deal in the Software without restriction, including without limitation |
||||
# the rights to use, copy, modify, merge, publish, distribute, sublicense, |
||||
# and/or sell copies of the Software, and to permit persons to whom the |
||||
# Software is furnished to do so, subject to the following conditions: |
||||
# |
||||
# The above copyright notice and this permission notice shall be included |
||||
# in all copies or substantial portions of the Software. |
||||
# |
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
||||
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
||||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING |
||||
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
||||
# DEALINGS IN THE SOFTWARE. |
||||
# |
||||
|
||||
set(TgaImageConverter_SRCS |
||||
TgaImageConverter.cpp) |
||||
|
||||
set(TgaImageConverter_HEADERS |
||||
TgaImageConverter.h) |
||||
|
||||
add_library(TgaImageConverterObjects OBJECT ${TgaImageConverter_SRCS}) |
||||
set_target_properties(TgaImageConverterObjects PROPERTIES COMPILE_FLAGS ${CMAKE_SHARED_LIBRARY_CXX_FLAGS}) |
||||
|
||||
corrade_add_plugin(TgaImageConverter ${MAGNUM_PLUGINS_IMAGECONVERTER_INSTALL_DIR} |
||||
TgaImageConverter.conf |
||||
$<TARGET_OBJECTS:TgaImageConverterObjects> |
||||
pluginRegistrationTgaImageConverter.cpp) |
||||
target_link_libraries(TgaImageConverter ${MAGNUM_LIBRARIES}) |
||||
|
||||
install(FILES ${TgaImageConverter_HEADERS} DESTINATION ${MAGNUM_PLUGINS_INCLUDE_INSTALL_DIR}/TgaImageConverter) |
||||
|
||||
if(BUILD_TESTS) |
||||
add_library(TgaImageConverterTestLib $<TARGET_OBJECTS:TgaImageConverterObjects>) |
||||
target_link_libraries(TgaImageConverterTestLib ${MAGNUM_LIBRARIES}) |
||||
add_subdirectory(Test) |
||||
endif() |
||||
@ -0,0 +1,30 @@
|
||||
# |
||||
# This file is part of Magnum. |
||||
# |
||||
# Copyright © 2010, 2011, 2012, 2013 Vladimír Vondruš <mosra@centrum.cz> |
||||
# |
||||
# Permission is hereby granted, free of charge, to any person obtaining a |
||||
# copy of this software and associated documentation files (the "Software"), |
||||
# to deal in the Software without restriction, including without limitation |
||||
# the rights to use, copy, modify, merge, publish, distribute, sublicense, |
||||
# and/or sell copies of the Software, and to permit persons to whom the |
||||
# Software is furnished to do so, subject to the following conditions: |
||||
# |
||||
# The above copyright notice and this permission notice shall be included |
||||
# in all copies or substantial portions of the Software. |
||||
# |
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
||||
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
||||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING |
||||
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
||||
# DEALINGS IN THE SOFTWARE. |
||||
# |
||||
|
||||
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/configure.h.cmake |
||||
${CMAKE_CURRENT_BINARY_DIR}/configure.h) |
||||
|
||||
include_directories(${CMAKE_CURRENT_BINARY_DIR}) |
||||
|
||||
corrade_add_test(TgaImageConverterTest TgaImageConverterTest.cpp LIBRARIES TgaImageConverterTestLib TgaImporterTestLib) |
||||
@ -0,0 +1,129 @@
|
||||
/*
|
||||
This file is part of Magnum. |
||||
|
||||
Copyright © 2010, 2011, 2012, 2013 Vladimír Vondruš <mosra@centrum.cz> |
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a |
||||
copy of this software and associated documentation files (the "Software"), |
||||
to deal in the Software without restriction, including without limitation |
||||
the rights to use, copy, modify, merge, publish, distribute, sublicense, |
||||
and/or sell copies of the Software, and to permit persons to whom the |
||||
Software is furnished to do so, subject to the following conditions: |
||||
|
||||
The above copyright notice and this permission notice shall be included |
||||
in all copies or substantial portions of the Software. |
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
||||
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING |
||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
||||
DEALINGS IN THE SOFTWARE. |
||||
*/ |
||||
|
||||
#include <sstream> |
||||
#include <tuple> |
||||
#include <TestSuite/Tester.h> |
||||
#include <Utility/Directory.h> |
||||
#include <Image.h> |
||||
#include <Trade/ImageData.h> |
||||
#include <TgaImageConverter/TgaImageConverter.h> |
||||
#include <TgaImporter/TgaImporter.h> |
||||
|
||||
#include "configure.h" |
||||
|
||||
using Corrade::Utility::Directory; |
||||
|
||||
namespace Magnum { namespace Trade { namespace TgaImageConverter { namespace Test { |
||||
|
||||
class TgaImageConverterTest: public Corrade::TestSuite::Tester { |
||||
public: |
||||
explicit TgaImageConverterTest(); |
||||
|
||||
void wrongFormat(); |
||||
void wrongType(); |
||||
|
||||
void data(); |
||||
void file(); |
||||
}; |
||||
|
||||
namespace { |
||||
const Image2D original({2, 3}, Image2D::Format::BGR, Image2D::Type::UnsignedByte, new char[18] { |
||||
1, 2, 3, 2, 3, 4, |
||||
3, 4, 5, 4, 5, 6, |
||||
5, 6, 7, 6, 7, 8 |
||||
}); |
||||
} |
||||
|
||||
TgaImageConverterTest::TgaImageConverterTest() { |
||||
addTests({&TgaImageConverterTest::wrongFormat, |
||||
&TgaImageConverterTest::wrongType, |
||||
|
||||
&TgaImageConverterTest::data, |
||||
&TgaImageConverterTest::file}); |
||||
} |
||||
|
||||
void TgaImageConverterTest::wrongFormat() { |
||||
Image2D image({}, Image2D::Format::RG, Image2D::Type::UnsignedByte, nullptr); |
||||
|
||||
std::ostringstream out; |
||||
Error::setOutput(&out); |
||||
|
||||
const unsigned char* data; |
||||
std::tie(data, std::ignore) = TgaImageConverter().convertToData(&image); |
||||
CORRADE_VERIFY(!data); |
||||
CORRADE_COMPARE(out.str(), "Trade::TgaImageConverter::TgaImageConverter::convertToData(): unsupported image format AbstractImage::Format::RG\n"); |
||||
} |
||||
|
||||
void TgaImageConverterTest::wrongType() { |
||||
Image2D image({}, Image2D::Format::Red, Image2D::Type::Float, nullptr); |
||||
|
||||
std::ostringstream out; |
||||
Error::setOutput(&out); |
||||
|
||||
const unsigned char* data; |
||||
std::tie(data, std::ignore) = TgaImageConverter().convertToData(&image); |
||||
CORRADE_VERIFY(!data); |
||||
CORRADE_COMPARE(out.str(), "Trade::TgaImageConverter::TgaImageConverter::convertToData(): unsupported image type AbstractImage::Type::Float\n"); |
||||
} |
||||
|
||||
void TgaImageConverterTest::data() { |
||||
const unsigned char* data; |
||||
std::size_t size; |
||||
std::tie(data, size) = TgaImageConverter().convertToData(&original); |
||||
|
||||
TgaImporter::TgaImporter importer; |
||||
CORRADE_VERIFY(importer.openData(data, size)); |
||||
Trade::ImageData2D* converted = importer.image2D(0); |
||||
CORRADE_VERIFY(converted); |
||||
|
||||
CORRADE_COMPARE(converted->size(), Vector2i(2, 3)); |
||||
CORRADE_COMPARE(converted->format(), Trade::ImageData2D::Format::BGR); |
||||
CORRADE_COMPARE(converted->type(), Trade::ImageData2D::Type::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)); |
||||
} |
||||
|
||||
void TgaImageConverterTest::file() { |
||||
const std::string filename = Directory::join(TGAIMAGECONVERTER_TEST_DIR, "file.tga"); |
||||
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)); |
||||
CORRADE_COMPARE(converted->format(), Trade::ImageData2D::Format::BGR); |
||||
CORRADE_COMPARE(converted->type(), Trade::ImageData2D::Type::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)); |
||||
|
||||
Directory::rm(filename); |
||||
} |
||||
|
||||
}}}} |
||||
|
||||
CORRADE_TEST_MAIN(Magnum::Trade::TgaImageConverter::Test::TgaImageConverterTest) |
||||
@ -0,0 +1,25 @@
|
||||
/* |
||||
This file is part of Magnum. |
||||
|
||||
Copyright © 2010, 2011, 2012, 2013 Vladimír Vondruš <mosra@centrum.cz> |
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a |
||||
copy of this software and associated documentation files (the "Software"), |
||||
to deal in the Software without restriction, including without limitation |
||||
the rights to use, copy, modify, merge, publish, distribute, sublicense, |
||||
and/or sell copies of the Software, and to permit persons to whom the |
||||
Software is furnished to do so, subject to the following conditions: |
||||
|
||||
The above copyright notice and this permission notice shall be included |
||||
in all copies or substantial portions of the Software. |
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
||||
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING |
||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
||||
DEALINGS IN THE SOFTWARE. |
||||
*/ |
||||
|
||||
#define TGAIMAGECONVERTER_TEST_DIR "${CMAKE_CURRENT_BINARY_DIR}" |
||||
@ -0,0 +1,94 @@
|
||||
/*
|
||||
This file is part of Magnum. |
||||
|
||||
Copyright © 2010, 2011, 2012, 2013 Vladimír Vondruš <mosra@centrum.cz> |
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a |
||||
copy of this software and associated documentation files (the "Software"), |
||||
to deal in the Software without restriction, including without limitation |
||||
the rights to use, copy, modify, merge, publish, distribute, sublicense, |
||||
and/or sell copies of the Software, and to permit persons to whom the |
||||
Software is furnished to do so, subject to the following conditions: |
||||
|
||||
The above copyright notice and this permission notice shall be included |
||||
in all copies or substantial portions of the Software. |
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
||||
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING |
||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
||||
DEALINGS IN THE SOFTWARE. |
||||
*/ |
||||
|
||||
#include "TgaImageConverter.h" |
||||
|
||||
#include <fstream> |
||||
#include <tuple> |
||||
#include <Image.h> |
||||
|
||||
#include "TgaImporter/TgaHeader.h" |
||||
|
||||
namespace Magnum { namespace Trade { namespace TgaImageConverter { |
||||
|
||||
TgaImageConverter::TgaImageConverter() = default; |
||||
|
||||
TgaImageConverter::TgaImageConverter(Corrade::PluginManager::AbstractPluginManager* manager, std::string plugin): AbstractImageConverter(manager, std::move(plugin)) {} |
||||
|
||||
TgaImageConverter::Features TgaImageConverter::features() const { |
||||
return Feature::ConvertToData|Feature::ConvertToFile; |
||||
} |
||||
|
||||
std::pair<const unsigned char*, std::size_t> TgaImageConverter::convertToData(const Image2D* const image) const { |
||||
if(image->format() != AbstractImage::Format::BGR && |
||||
image->format() != AbstractImage::Format::BGRA && |
||||
image->format() != AbstractImage::Format::Red) { |
||||
Error() << "Trade::TgaImageConverter::TgaImageConverter::convertToData(): unsupported image format" << image->format(); |
||||
return {nullptr, 0}; |
||||
} |
||||
|
||||
if(image->type() != AbstractImage::Type::UnsignedByte) { |
||||
Error() << "Trade::TgaImageConverter::TgaImageConverter::convertToData(): unsupported image type" << image->type(); |
||||
return {nullptr, 0}; |
||||
} |
||||
|
||||
/* Initialize data buffer */ |
||||
const UnsignedByte pixelSize = Image2D::pixelSize(image->format(), image->type()); |
||||
const std::size_t size = sizeof(TgaImporter::TgaHeader) + pixelSize*image->size().product(); |
||||
unsigned char* data = new unsigned char[size](); |
||||
|
||||
/* Fill header */ |
||||
auto header = reinterpret_cast<TgaImporter::TgaHeader*>(data); |
||||
header->imageType = image->format() == AbstractImage::Format::Red ? 3 : 2; |
||||
header->bpp = pixelSize*8; |
||||
header->width = image->size().x(); |
||||
header->height = image->size().y(); |
||||
|
||||
/* Fill data */ |
||||
std::copy(image->data(), image->data()+pixelSize*image->size().product(), data+sizeof(TgaImporter::TgaHeader)); |
||||
|
||||
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; |
||||
} |
||||
|
||||
}}} |
||||
@ -0,0 +1,57 @@
|
||||
#ifndef Magnum_Trade_TgaImageConverter_TgaImageConverter_h |
||||
#define Magnum_Trade_TgaImageConverter_TgaImageConverter_h |
||||
/*
|
||||
This file is part of Magnum. |
||||
|
||||
Copyright © 2010, 2011, 2012, 2013 Vladimír Vondruš <mosra@centrum.cz> |
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a |
||||
copy of this software and associated documentation files (the "Software"), |
||||
to deal in the Software without restriction, including without limitation |
||||
the rights to use, copy, modify, merge, publish, distribute, sublicense, |
||||
and/or sell copies of the Software, and to permit persons to whom the |
||||
Software is furnished to do so, subject to the following conditions: |
||||
|
||||
The above copyright notice and this permission notice shall be included |
||||
in all copies or substantial portions of the Software. |
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
||||
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING |
||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
||||
DEALINGS IN THE SOFTWARE. |
||||
*/ |
||||
|
||||
/** @file
|
||||
* @brief Class Magnum::Trade::TgaImageConverter::TgaImageConverter |
||||
*/ |
||||
|
||||
#include <Trade/AbstractImageConverter.h> |
||||
|
||||
namespace Magnum { namespace Trade { namespace TgaImageConverter { |
||||
|
||||
/**
|
||||
@brief TGA image converter |
||||
|
||||
Supports images with format @ref AbstractImage::Format "AbstractImage::Format::BGR", |
||||
@ref AbstractImage::Format "AbstractImage::Format::BGRA" or @ref AbstractImage::Format "AbstractImage::Format::Red" |
||||
and type @ref AbstractImage::Type "AbstractImage::Type::UnsignedByte". |
||||
*/ |
||||
class TgaImageConverter: public AbstractImageConverter { |
||||
public: |
||||
/** @brief Default constructor */ |
||||
explicit TgaImageConverter(); |
||||
|
||||
/** @brief Plugin manager constructor */ |
||||
explicit TgaImageConverter(Corrade::PluginManager::AbstractPluginManager* 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; |
||||
}; |
||||
|
||||
}}} |
||||
|
||||
#endif |
||||
@ -0,0 +1,28 @@
|
||||
/*
|
||||
This file is part of Magnum. |
||||
|
||||
Copyright © 2010, 2011, 2012, 2013 Vladimír Vondruš <mosra@centrum.cz> |
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a |
||||
copy of this software and associated documentation files (the "Software"), |
||||
to deal in the Software without restriction, including without limitation |
||||
the rights to use, copy, modify, merge, publish, distribute, sublicense, |
||||
and/or sell copies of the Software, and to permit persons to whom the |
||||
Software is furnished to do so, subject to the following conditions: |
||||
|
||||
The above copyright notice and this permission notice shall be included |
||||
in all copies or substantial portions of the Software. |
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
||||
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING |
||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
||||
DEALINGS IN THE SOFTWARE. |
||||
*/ |
||||
|
||||
#include "TgaImageConverter.h" |
||||
|
||||
PLUGIN_REGISTER(TgaImageConverter, Magnum::Trade::TgaImageConverter::TgaImageConverter, |
||||
"cz.mosra.magnum.Trade.AbstractImageConverter/0.1") |
||||
Loading…
Reference in new issue