Browse Source

TgaImageConverter: warn if saving a 1D array image.

Future-proofing the test as instanced, as I expect there being more
cases -- especially when arbitrary key/value metadata come into place.
pull/578/head
Vladimír Vondruš 4 years ago
parent
commit
aa2fbf34ed
  1. 30
      src/MagnumPlugins/TgaImageConverter/Test/TgaImageConverterTest.cpp
  2. 5
      src/MagnumPlugins/TgaImageConverter/TgaImageConverter.cpp
  3. 4
      src/MagnumPlugins/TgaImageConverter/TgaImageConverter.h

30
src/MagnumPlugins/TgaImageConverter/Test/TgaImageConverterTest.cpp

@ -31,6 +31,7 @@
#include <Corrade/TestSuite/Tester.h> #include <Corrade/TestSuite/Tester.h>
#include <Corrade/TestSuite/Compare/Container.h> #include <Corrade/TestSuite/Compare/Container.h>
#include <Corrade/Utility/DebugStl.h> #include <Corrade/Utility/DebugStl.h>
#include <Corrade/Utility/FormatStl.h>
#include <Corrade/Utility/Path.h> #include <Corrade/Utility/Path.h>
#include "Magnum/ImageView.h" #include "Magnum/ImageView.h"
@ -51,6 +52,8 @@ struct TgaImageConverterTest: TestSuite::Tester {
void rgb(); void rgb();
void rgba(); void rgba();
void unsupportedMetadata();
/* Explicitly forbid system-wide plugin dependencies */ /* Explicitly forbid system-wide plugin dependencies */
PluginManager::Manager<AbstractImageConverter> _converterManager{"nonexistent"}; PluginManager::Manager<AbstractImageConverter> _converterManager{"nonexistent"};
PluginManager::Manager<AbstractImporter> _importerManager{"nonexistent"}; PluginManager::Manager<AbstractImporter> _importerManager{"nonexistent"};
@ -68,6 +71,15 @@ constexpr struct {
"Trade::TgaImageConverter::convertToData(): converting from RGBA to BGRA\n"} "Trade::TgaImageConverter::convertToData(): converting from RGBA to BGRA\n"}
}; };
const struct {
const char* name;
ImageFlags2D flags;
const char* message;
} UnsupportedMetadataData[]{
{"1D array", ImageFlag2D::Array,
"1D array images are unrepresentable in TGA, saving as a regular 2D image"}
};
TgaImageConverterTest::TgaImageConverterTest() { TgaImageConverterTest::TgaImageConverterTest() {
addTests({&TgaImageConverterTest::wrongFormat}); addTests({&TgaImageConverterTest::wrongFormat});
@ -76,6 +88,9 @@ TgaImageConverterTest::TgaImageConverterTest() {
&TgaImageConverterTest::rgba}, &TgaImageConverterTest::rgba},
Containers::arraySize(VerboseData)); Containers::arraySize(VerboseData));
addInstancedTests({&TgaImageConverterTest::unsupportedMetadata},
Containers::arraySize(UnsupportedMetadataData));
/* Load the plugin directly from the build tree. Otherwise it's static and /* Load the plugin directly from the build tree. Otherwise it's static and
already loaded. */ already loaded. */
#ifdef TGAIMAGECONVERTER_PLUGIN_FILENAME #ifdef TGAIMAGECONVERTER_PLUGIN_FILENAME
@ -184,6 +199,21 @@ void TgaImageConverterTest::rgba() {
CORRADE_COMPARE(out.str(), data.message32); CORRADE_COMPARE(out.str(), data.message32);
} }
void TgaImageConverterTest::unsupportedMetadata() {
auto&& data = UnsupportedMetadataData[testCaseInstanceId()];
setTestCaseDescription(data.name);
Containers::Pointer<AbstractImageConverter> converter = _converterManager.instantiate("TgaImageConverter");
const char imageData[4]{};
ImageView2D image{PixelFormat::RGBA8Unorm, {1, 1}, imageData, data.flags};
std::ostringstream out;
Warning redirectWarning{&out};
CORRADE_VERIFY(converter->convertToData(image));
CORRADE_COMPARE(out.str(), Utility::formatString("Trade::TgaImageConverter::convertToData(): {}\n", data.message));
}
}}}} }}}}
CORRADE_TEST_MAIN(Magnum::Trade::Test::TgaImageConverterTest) CORRADE_TEST_MAIN(Magnum::Trade::Test::TgaImageConverterTest)

5
src/MagnumPlugins/TgaImageConverter/TgaImageConverter.cpp

@ -47,6 +47,11 @@ TgaImageConverter::TgaImageConverter(PluginManager::AbstractManager& manager, co
ImageConverterFeatures TgaImageConverter::doFeatures() const { return ImageConverterFeature::Convert2DToData; } ImageConverterFeatures TgaImageConverter::doFeatures() const { return ImageConverterFeature::Convert2DToData; }
Containers::Optional<Containers::Array<char>> TgaImageConverter::doConvertToData(const ImageView2D& image) { Containers::Optional<Containers::Array<char>> TgaImageConverter::doConvertToData(const ImageView2D& image) {
/* Warn about lost metadata */
if(image.flags() & ImageFlag2D::Array) {
Warning{} << "Trade::TgaImageConverter::convertToData(): 1D array images are unrepresentable in TGA, saving as a regular 2D image";
}
/* Initialize data buffer */ /* Initialize data buffer */
const auto pixelSize = UnsignedByte(image.pixelSize()); const auto pixelSize = UnsignedByte(image.pixelSize());
Containers::Array<char> data{ValueInit, sizeof(Implementation::TgaHeader) + pixelSize*image.size().product()}; Containers::Array<char> data{ValueInit, sizeof(Implementation::TgaHeader) + pixelSize*image.size().product()};

4
src/MagnumPlugins/TgaImageConverter/TgaImageConverter.h

@ -93,6 +93,10 @@ information.
The output is always uncompressed. If you want to make use of RLE compression The output is always uncompressed. If you want to make use of RLE compression
and have the files smaller, use the @ref StbImageConverter plugin instead. and have the files smaller, use the @ref StbImageConverter plugin instead.
The TGA file format doesn't have a way to distinguish between 2D and 1D array
images. If an image has @ref ImageFlag2D::Array set, a warning is printed and
the file is saved as a regular 2D image.
*/ */
class MAGNUM_TGAIMAGECONVERTER_EXPORT TgaImageConverter: public AbstractImageConverter { class MAGNUM_TGAIMAGECONVERTER_EXPORT TgaImageConverter: public AbstractImageConverter {
public: public:

Loading…
Cancel
Save