Browse Source

TgaImporter,TgaImageConverter: verbose output about channel reordering.

Not useful much, more for testing flag propagation inside Any* plugins.
pull/427/merge
Vladimír Vondruš 6 years ago
parent
commit
42b8ab2d0e
  1. 54
      src/MagnumPlugins/TgaImageConverter/Test/TgaImageConverterTest.cpp
  2. 4
      src/MagnumPlugins/TgaImageConverter/TgaImageConverter.cpp
  3. 81
      src/MagnumPlugins/TgaImporter/Test/TgaImporterTest.cpp
  4. 4
      src/MagnumPlugins/TgaImporter/TgaImporter.cpp

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

@ -55,6 +55,18 @@ struct TgaImageConverterTest: TestSuite::Tester {
PluginManager::Manager<AbstractImporter> _importerManager{"nonexistent"}; PluginManager::Manager<AbstractImporter> _importerManager{"nonexistent"};
}; };
constexpr struct {
const char* name;
ImageConverterFlags flags;
const char* message24;
const char* message32;
} VerboseData[] {
{"", {}, "", ""},
{"verbose", ImageConverterFlag::Verbose,
"Trade::TgaImageConverter::exportToData(): converting from RGB to BGR\n",
"Trade::TgaImageConverter::exportToData(): converting from RGBA to BGRA\n"}
};
/* Padded to four byte alignment (the resulting file is *not* padded) */ /* Padded to four byte alignment (the resulting file is *not* padded) */
constexpr char OriginalDataRGB[] = { constexpr char OriginalDataRGB[] = {
/* Skip */ /* Skip */
@ -81,10 +93,12 @@ constexpr char OriginalDataRGBA[] = {
const ImageView2D OriginalRGBA{PixelFormat::RGBA8Unorm, {2, 3}, OriginalDataRGBA}; const ImageView2D OriginalRGBA{PixelFormat::RGBA8Unorm, {2, 3}, OriginalDataRGBA};
TgaImageConverterTest::TgaImageConverterTest() { TgaImageConverterTest::TgaImageConverterTest() {
addTests({&TgaImageConverterTest::wrongFormat, addTests({&TgaImageConverterTest::wrongFormat});
&TgaImageConverterTest::rgb, addInstancedTests({
&TgaImageConverterTest::rgba}); &TgaImageConverterTest::rgb,
&TgaImageConverterTest::rgba},
Containers::arraySize(VerboseData));
/* 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. */
@ -110,15 +124,25 @@ void TgaImageConverterTest::wrongFormat() {
} }
void TgaImageConverterTest::rgb() { void TgaImageConverterTest::rgb() {
auto&& data = VerboseData[testCaseInstanceId()];
setTestCaseDescription(data.name);
Containers::Pointer<AbstractImageConverter> converter = _converterManager.instantiate("TgaImageConverter"); Containers::Pointer<AbstractImageConverter> converter = _converterManager.instantiate("TgaImageConverter");
const auto data = converter->exportToData(OriginalRGB); converter->setFlags(data.flags);
CORRADE_VERIFY(data);
std::ostringstream out;
Containers::Array<char> array;
{
Debug redirectOutput{&out};
array = converter->exportToData(OriginalRGB);
}
CORRADE_VERIFY(out);
if(!(_importerManager.loadState("TgaImporter") & PluginManager::LoadState::Loaded)) if(!(_importerManager.loadState("TgaImporter") & PluginManager::LoadState::Loaded))
CORRADE_SKIP("TgaImporter plugin not enabled, can't test the result"); CORRADE_SKIP("TgaImporter plugin not enabled, can't test the result");
Containers::Pointer<AbstractImporter> importer = _importerManager.instantiate("TgaImporter"); Containers::Pointer<AbstractImporter> importer = _importerManager.instantiate("TgaImporter");
CORRADE_VERIFY(importer->openData(data)); CORRADE_VERIFY(importer->openData(array));
Containers::Optional<Trade::ImageData2D> converted = importer->image2D(0); Containers::Optional<Trade::ImageData2D> converted = importer->image2D(0);
CORRADE_VERIFY(converted); CORRADE_VERIFY(converted);
@ -127,18 +151,29 @@ void TgaImageConverterTest::rgb() {
CORRADE_COMPARE(converted->format(), PixelFormat::RGB8Unorm); CORRADE_COMPARE(converted->format(), PixelFormat::RGB8Unorm);
CORRADE_COMPARE_AS(converted->data(), Containers::arrayView(ConvertedDataRGB), CORRADE_COMPARE_AS(converted->data(), Containers::arrayView(ConvertedDataRGB),
TestSuite::Compare::Container); TestSuite::Compare::Container);
CORRADE_COMPARE(out.str(), data.message24);
} }
void TgaImageConverterTest::rgba() { void TgaImageConverterTest::rgba() {
auto&& data = VerboseData[testCaseInstanceId()];
setTestCaseDescription(data.name);
Containers::Pointer<AbstractImageConverter> converter = _converterManager.instantiate("TgaImageConverter"); Containers::Pointer<AbstractImageConverter> converter = _converterManager.instantiate("TgaImageConverter");
const auto data = converter->exportToData(OriginalRGBA); converter->setFlags(data.flags);
CORRADE_VERIFY(data);
std::ostringstream out;
Containers::Array<char> array;
{
Debug redirectOutput{&out};
array = converter->exportToData(OriginalRGBA);
}
CORRADE_VERIFY(out);
if(!(_importerManager.loadState("TgaImporter") & PluginManager::LoadState::Loaded)) if(!(_importerManager.loadState("TgaImporter") & PluginManager::LoadState::Loaded))
CORRADE_SKIP("TgaImporter plugin not enabled, can't test the result"); CORRADE_SKIP("TgaImporter plugin not enabled, can't test the result");
Containers::Pointer<AbstractImporter> importer = _importerManager.instantiate("TgaImporter"); Containers::Pointer<AbstractImporter> importer = _importerManager.instantiate("TgaImporter");
CORRADE_VERIFY(importer->openData(data)); CORRADE_VERIFY(importer->openData(array));
Containers::Optional<Trade::ImageData2D> converted = importer->image2D(0); Containers::Optional<Trade::ImageData2D> converted = importer->image2D(0);
CORRADE_VERIFY(converted); CORRADE_VERIFY(converted);
@ -147,6 +182,7 @@ void TgaImageConverterTest::rgba() {
CORRADE_COMPARE(converted->format(), PixelFormat::RGBA8Unorm); CORRADE_COMPARE(converted->format(), PixelFormat::RGBA8Unorm);
CORRADE_COMPARE_AS(converted->data(), Containers::arrayView(OriginalDataRGBA), CORRADE_COMPARE_AS(converted->data(), Containers::arrayView(OriginalDataRGBA),
TestSuite::Compare::Container); TestSuite::Compare::Container);
CORRADE_COMPARE(out.str(), data.message32);
} }
}}}} }}}}

4
src/MagnumPlugins/TgaImageConverter/TgaImageConverter.cpp

@ -74,9 +74,13 @@ Containers::Array<char> TgaImageConverter::doExportToData(const ImageView2D& ima
{std::size_t(image.size().y()), std::size_t(image.size().x()), pixelSize}}); {std::size_t(image.size().y()), std::size_t(image.size().x()), pixelSize}});
if(image.format() == PixelFormat::RGB8Unorm) { if(image.format() == PixelFormat::RGB8Unorm) {
if(flags() & ImageConverterFlag::Verbose)
Debug{} << "Trade::TgaImageConverter::exportToData(): converting from RGB to BGR";
for(Vector3ub& pixel: Containers::arrayCast<Vector3ub>(pixels)) for(Vector3ub& pixel: Containers::arrayCast<Vector3ub>(pixels))
pixel = Math::gather<'b', 'g', 'r'>(pixel); pixel = Math::gather<'b', 'g', 'r'>(pixel);
} else if(image.format() == PixelFormat::RGBA8Unorm) { } else if(image.format() == PixelFormat::RGBA8Unorm) {
if(flags() & ImageConverterFlag::Verbose)
Debug{} << "Trade::TgaImageConverter::exportToData(): converting from RGBA to BGRA";
for(Vector4ub& pixel: Containers::arrayCast<Vector4ub>(pixels)) for(Vector4ub& pixel: Containers::arrayCast<Vector4ub>(pixels))
pixel = Math::gather<'b', 'g', 'r', 'a'>(pixel); pixel = Math::gather<'b', 'g', 'r', 'a'>(pixel);
} }

81
src/MagnumPlugins/TgaImporter/Test/TgaImporterTest.cpp

@ -78,6 +78,18 @@ constexpr struct {
{"RLE grayscale 16", 11, 16, "unsupported grayscale bits-per-pixel: 16"} {"RLE grayscale 16", 11, 16, "unsupported grayscale bits-per-pixel: 16"}
}; };
constexpr struct {
const char* name;
ImporterFlags flags;
const char* message24;
const char* message32;
} VerboseData[] {
{"", {}, "", ""},
{"verbose", ImporterFlag::Verbose,
"Trade::TgaImporter::image2D(): converting from BGR to RGB\n",
"Trade::TgaImporter::image2D(): converting from BGRA to RGBA\n"}
};
constexpr const char Color24[] = { constexpr const char Color24[] = {
0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 3, 0, 24, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 3, 0, 24, 0,
1, 2, 3, 2, 3, 4, 1, 2, 3, 2, 3, 4,
@ -124,11 +136,14 @@ TgaImporterTest::TgaImporterTest() {
&TgaImporterTest::unsupportedBits}, &TgaImporterTest::unsupportedBits},
Containers::arraySize(UnsupportedBitsData)); Containers::arraySize(UnsupportedBitsData));
addTests({&TgaImporterTest::color24, addInstancedTests({
&TgaImporterTest::color24Rle, &TgaImporterTest::color24,
&TgaImporterTest::color32, &TgaImporterTest::color24Rle,
&TgaImporterTest::color32Rle, &TgaImporterTest::color32,
&TgaImporterTest::grayscale8, &TgaImporterTest::color32Rle},
Containers::arraySize(VerboseData));
addTests({&TgaImporterTest::grayscale8,
&TgaImporterTest::grayscale8Rle, &TgaImporterTest::grayscale8Rle,
&TgaImporterTest::rleTooLarge}); &TgaImporterTest::rleTooLarge});
@ -207,7 +222,11 @@ void TgaImporterTest::unsupportedBits() {
} }
void TgaImporterTest::color24() { void TgaImporterTest::color24() {
auto&& data = VerboseData[testCaseInstanceId()];
setTestCaseDescription(data.name);
Containers::Pointer<AbstractImporter> importer = _manager.instantiate("TgaImporter"); Containers::Pointer<AbstractImporter> importer = _manager.instantiate("TgaImporter");
importer->setFlags(data.flags);
const char pixels[] = { const char pixels[] = {
3, 2, 1, 4, 3, 2, 3, 2, 1, 4, 3, 2,
5, 4, 3, 6, 5, 4, 5, 4, 3, 6, 5, 4,
@ -215,17 +234,27 @@ void TgaImporterTest::color24() {
}; };
CORRADE_VERIFY(importer->openData(Color24)); CORRADE_VERIFY(importer->openData(Color24));
Containers::Optional<Trade::ImageData2D> image = importer->image2D(0); std::ostringstream out;
Containers::Optional<Trade::ImageData2D> image;
{
Debug redirectOutput{&out};
image = importer->image2D(0);
}
CORRADE_VERIFY(image); CORRADE_VERIFY(image);
CORRADE_COMPARE(image->storage().alignment(), 1); CORRADE_COMPARE(image->storage().alignment(), 1);
CORRADE_COMPARE(image->format(), PixelFormat::RGB8Unorm); CORRADE_COMPARE(image->format(), PixelFormat::RGB8Unorm);
CORRADE_COMPARE(image->size(), Vector2i(2, 3)); CORRADE_COMPARE(image->size(), Vector2i(2, 3));
CORRADE_COMPARE_AS(image->data(), Containers::arrayView(pixels), CORRADE_COMPARE_AS(image->data(), Containers::arrayView(pixels),
TestSuite::Compare::Container); TestSuite::Compare::Container);
CORRADE_COMPARE(out.str(), data.message24);
} }
void TgaImporterTest::color24Rle() { void TgaImporterTest::color24Rle() {
auto&& data = VerboseData[testCaseInstanceId()];
setTestCaseDescription(data.name);
Containers::Pointer<AbstractImporter> importer = _manager.instantiate("TgaImporter"); Containers::Pointer<AbstractImporter> importer = _manager.instantiate("TgaImporter");
importer->setFlags(data.flags);
const char pixels[] = { const char pixels[] = {
3, 2, 1, 4, 3, 2, 3, 2, 1, 4, 3, 2,
5, 4, 3, 6, 5, 4, 5, 4, 3, 6, 5, 4,
@ -233,18 +262,28 @@ void TgaImporterTest::color24Rle() {
}; };
CORRADE_VERIFY(importer->openData(Color24Rle)); CORRADE_VERIFY(importer->openData(Color24Rle));
Containers::Optional<Trade::ImageData2D> image = importer->image2D(0); std::ostringstream out;
Containers::Optional<Trade::ImageData2D> image;
{
Debug redirectOutput{&out};
image = importer->image2D(0);
}
CORRADE_VERIFY(image); CORRADE_VERIFY(image);
CORRADE_COMPARE(image->storage().alignment(), 1); CORRADE_COMPARE(image->storage().alignment(), 1);
CORRADE_COMPARE(image->format(), PixelFormat::RGB8Unorm); CORRADE_COMPARE(image->format(), PixelFormat::RGB8Unorm);
CORRADE_COMPARE(image->size(), Vector2i(2, 3)); CORRADE_COMPARE(image->size(), Vector2i(2, 3));
CORRADE_COMPARE_AS(image->data(), Containers::arrayView(pixels), CORRADE_COMPARE_AS(image->data(), Containers::arrayView(pixels),
TestSuite::Compare::Container); TestSuite::Compare::Container);
CORRADE_COMPARE(out.str(), data.message24);
} }
void TgaImporterTest::color32() { void TgaImporterTest::color32() {
auto&& data = VerboseData[testCaseInstanceId()];
setTestCaseDescription(data.name);
Containers::Pointer<AbstractImporter> importer = _manager.instantiate("TgaImporter"); Containers::Pointer<AbstractImporter> importer = _manager.instantiate("TgaImporter");
const char data[] = { importer->setFlags(data.flags);
const char input[] = {
0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 3, 0, 32, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 3, 0, 32, 0,
1, 2, 3, 4, 2, 3, 4, 5, 1, 2, 3, 4, 2, 3, 4, 5,
3, 4, 5, 6, 4, 5, 6, 7, 3, 4, 5, 6, 4, 5, 6, 7,
@ -255,20 +294,30 @@ void TgaImporterTest::color32() {
5, 4, 3, 6, 6, 5, 4, 7, 5, 4, 3, 6, 6, 5, 4, 7,
7, 6, 5, 8, 8, 7, 6, 9 7, 6, 5, 8, 8, 7, 6, 9
}; };
CORRADE_VERIFY(importer->openData(data)); CORRADE_VERIFY(importer->openData(input));
Containers::Optional<Trade::ImageData2D> image = importer->image2D(0); std::ostringstream out;
Containers::Optional<Trade::ImageData2D> image;
{
Debug redirectOutput{&out};
image = importer->image2D(0);
}
CORRADE_VERIFY(image); CORRADE_VERIFY(image);
CORRADE_COMPARE(image->storage().alignment(), 4); CORRADE_COMPARE(image->storage().alignment(), 4);
CORRADE_COMPARE(image->format(), PixelFormat::RGBA8Unorm); CORRADE_COMPARE(image->format(), PixelFormat::RGBA8Unorm);
CORRADE_COMPARE(image->size(), Vector2i(2, 3)); CORRADE_COMPARE(image->size(), Vector2i(2, 3));
CORRADE_COMPARE_AS(image->data(), Containers::arrayView(pixels), CORRADE_COMPARE_AS(image->data(), Containers::arrayView(pixels),
TestSuite::Compare::Container); TestSuite::Compare::Container);
CORRADE_COMPARE(out.str(), data.message32);
} }
void TgaImporterTest::color32Rle() { void TgaImporterTest::color32Rle() {
auto&& data = VerboseData[testCaseInstanceId()];
setTestCaseDescription(data.name);
Containers::Pointer<AbstractImporter> importer = _manager.instantiate("TgaImporter"); Containers::Pointer<AbstractImporter> importer = _manager.instantiate("TgaImporter");
const char data[] = { importer->setFlags(data.flags);
const char input[] = {
0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 3, 0, 32, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 3, 0, 32, 0,
/* 2 pixels repeated */ /* 2 pixels repeated */
'\x81', 1, 2, 3, 4, '\x81', 1, 2, 3, 4,
@ -283,15 +332,21 @@ void TgaImporterTest::color32Rle() {
5, 4, 3, 6, 6, 5, 4, 7, 5, 4, 3, 6, 6, 5, 4, 7,
7, 6, 5, 8, 8, 7, 6, 9 7, 6, 5, 8, 8, 7, 6, 9
}; };
CORRADE_VERIFY(importer->openData(data)); CORRADE_VERIFY(importer->openData(input));
Containers::Optional<Trade::ImageData2D> image = importer->image2D(0); std::ostringstream out;
Containers::Optional<Trade::ImageData2D> image;
{
Debug redirectOutput{&out};
image = importer->image2D(0);
}
CORRADE_VERIFY(image); CORRADE_VERIFY(image);
CORRADE_COMPARE(image->storage().alignment(), 4); CORRADE_COMPARE(image->storage().alignment(), 4);
CORRADE_COMPARE(image->format(), PixelFormat::RGBA8Unorm); CORRADE_COMPARE(image->format(), PixelFormat::RGBA8Unorm);
CORRADE_COMPARE(image->size(), Vector2i(2, 3)); CORRADE_COMPARE(image->size(), Vector2i(2, 3));
CORRADE_COMPARE_AS(image->data(), Containers::arrayView(pixels), CORRADE_COMPARE_AS(image->data(), Containers::arrayView(pixels),
TestSuite::Compare::Container); TestSuite::Compare::Container);
CORRADE_COMPARE(out.str(), data.message32);
} }
void TgaImporterTest::grayscale8() { void TgaImporterTest::grayscale8() {

4
src/MagnumPlugins/TgaImporter/TgaImporter.cpp

@ -189,9 +189,13 @@ Containers::Optional<ImageData2D> TgaImporter::doImage2D(UnsignedInt, UnsignedIn
storage.setAlignment(1); storage.setAlignment(1);
if(format == PixelFormat::RGB8Unorm) { if(format == PixelFormat::RGB8Unorm) {
if(flags() & ImporterFlag::Verbose)
Debug{} << "Trade::TgaImporter::image2D(): converting from BGR to RGB";
for(Vector3ub& pixel: Containers::arrayCast<Vector3ub>(data)) for(Vector3ub& pixel: Containers::arrayCast<Vector3ub>(data))
pixel = Math::gather<'b', 'g', 'r'>(pixel); pixel = Math::gather<'b', 'g', 'r'>(pixel);
} else if(format == PixelFormat::RGBA8Unorm) { } else if(format == PixelFormat::RGBA8Unorm) {
if(flags() & ImporterFlag::Verbose)
Debug{} << "Trade::TgaImporter::image2D(): converting from BGRA to RGBA";
for(Vector4ub& pixel: Containers::arrayCast<Vector4ub>(data)) for(Vector4ub& pixel: Containers::arrayCast<Vector4ub>(data))
pixel = Math::gather<'b', 'g', 'r', 'a'>(pixel); pixel = Math::gather<'b', 'g', 'r', 'a'>(pixel);
} }

Loading…
Cancel
Save