From 8c837be26fcb2b0e0d03b633def509f4fb7dafad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Thu, 19 Mar 2020 10:04:07 +0100 Subject: [PATCH] TgaImageConverter: same. --- .../TgaImageConverter/TgaImageConverter.cpp | 26 +++++++------------ 1 file changed, 9 insertions(+), 17 deletions(-) diff --git a/src/MagnumPlugins/TgaImageConverter/TgaImageConverter.cpp b/src/MagnumPlugins/TgaImageConverter/TgaImageConverter.cpp index 42eb10342..252c1d3c1 100644 --- a/src/MagnumPlugins/TgaImageConverter/TgaImageConverter.cpp +++ b/src/MagnumPlugins/TgaImageConverter/TgaImageConverter.cpp @@ -25,10 +25,10 @@ #include "TgaImageConverter.h" -#include #include #include #include +#include #include #include "Magnum/ImageView.h" @@ -68,25 +68,17 @@ Containers::Array TgaImageConverter::doExportToData(const ImageView2D& ima header->width = UnsignedShort(Utility::Endianness::littleEndian(image.size().x())); header->height = UnsignedShort(Utility::Endianness::littleEndian(image.size().y())); - /* Image data pointer including skip */ - const char* imageData = image.data() + std::get<0>(image.dataProperties()).sum(); - - /* Fill data or copy them row by row if we need to drop the padding */ - const std::size_t rowSize = image.size().x()*pixelSize; - const std::size_t rowStride = std::get<1>(image.dataProperties()).x(); - if(rowStride != rowSize) { - for(std::int_fast32_t y = 0; y != image.size().y(); ++y) - std::copy_n(imageData + y*rowStride, rowSize, data.begin() + sizeof(Implementation::TgaHeader) + y*rowSize); - } else std::copy_n(imageData, pixelSize*image.size().product(), data.begin() + sizeof(Implementation::TgaHeader)); + /* Copy the pixels into output, dropping padding (if any) */ + const Containers::ArrayView pixels = data.suffix(sizeof(Implementation::TgaHeader)); + Utility::copy(image.pixels(), Containers::StridedArrayView3D{pixels, + {std::size_t(image.size().y()), std::size_t(image.size().x()), pixelSize}}); if(image.format() == PixelFormat::RGB8Unorm) { - auto pixels = reinterpret_cast*>(data.begin()+sizeof(Implementation::TgaHeader)); - std::transform(pixels, pixels + image.size().product(), pixels, - [](Math::Vector3 pixel) { return Math::gather<'b', 'g', 'r'>(pixel); }); + for(Vector3ub& pixel: Containers::arrayCast(pixels)) + pixel = Math::gather<'b', 'g', 'r'>(pixel); } else if(image.format() == PixelFormat::RGBA8Unorm) { - auto pixels = reinterpret_cast*>(data.begin()+sizeof(Implementation::TgaHeader)); - std::transform(pixels, pixels + image.size().product(), pixels, - [](Math::Vector4 pixel) { return Math::gather<'b', 'g', 'r', 'a'>(pixel); }); + for(Vector4ub& pixel: Containers::arrayCast(pixels)) + pixel = Math::gather<'b', 'g', 'r', 'a'>(pixel); } return data;