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/Compare/Container.h>
#include <Corrade/Utility/DebugStl.h>
#include <Corrade/Utility/FormatStl.h>
#include <Corrade/Utility/Path.h>
#include "Magnum/ImageView.h"
@ -51,6 +52,8 @@ struct TgaImageConverterTest: TestSuite::Tester {
void rgb();
void rgba();
void unsupportedMetadata();
/* Explicitly forbid system-wide plugin dependencies */
PluginManager::Manager<AbstractImageConverter> _converterManager{"nonexistent"};
PluginManager::Manager<AbstractImporter> _importerManager{"nonexistent"};
@ -68,6 +71,15 @@ constexpr struct {
"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() {
addTests({&TgaImageConverterTest::wrongFormat});
@ -76,6 +88,9 @@ TgaImageConverterTest::TgaImageConverterTest() {
&TgaImageConverterTest::rgba},
Containers::arraySize(VerboseData));
addInstancedTests({&TgaImageConverterTest::unsupportedMetadata},
Containers::arraySize(UnsupportedMetadataData));
/* Load the plugin directly from the build tree. Otherwise it's static and
already loaded. */
#ifdef TGAIMAGECONVERTER_PLUGIN_FILENAME
@ -184,6 +199,21 @@ void TgaImageConverterTest::rgba() {
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)

5
src/MagnumPlugins/TgaImageConverter/TgaImageConverter.cpp

@ -47,6 +47,11 @@ TgaImageConverter::TgaImageConverter(PluginManager::AbstractManager& manager, co
ImageConverterFeatures TgaImageConverter::doFeatures() const { return ImageConverterFeature::Convert2DToData; }
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 */
const auto pixelSize = UnsignedByte(image.pixelSize());
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
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 {
public:

Loading…
Cancel
Save