void ImageDataTest::toReference() { unsigned char* data = new unsigned char[3]; Trade::ImageData2D a(ColorFormat::Red, ColorType::UnsignedByte, {1, 3}, data); ImageReference2D b = a; CORRADE_COMPARE(b.format(), ColorFormat::Red); CORRADE_COMPARE(b.type(), ColorType::UnsignedByte); CORRADE_COMPARE(b.size(), Vector2i(1, 3)); CORRADE_COMPARE(b.data(), data); }
void ImageDataTest::toReference() { auto data = new unsigned char[3]; const Trade::ImageData2D a(ColorFormat::Red, ColorType::UnsignedByte, {1, 3}, data); ImageReference2D b = a; CORRADE_COMPARE(b.format(), ColorFormat::Red); CORRADE_COMPARE(b.type(), ColorType::UnsignedByte); CORRADE_COMPARE(b.size(), Vector2i(1, 3)); CORRADE_COMPARE(b.data(), data); CORRADE_VERIFY((std::is_convertible<const Trade::ImageData2D&, ImageReference2D>::value)); { #ifdef CORRADE_GCC47_COMPATIBILITY CORRADE_EXPECT_FAIL("Rvalue references for *this are not supported in GCC < 4.8.1."); #endif CORRADE_VERIFY(!(std::is_convertible<const Trade::ImageData2D, ImageReference2D>::value)); CORRADE_VERIFY(!(std::is_convertible<const Trade::ImageData2D&&, ImageReference2D>::value)); } }
Containers::Array<char> StbPngImageConverter::doExportToData(const ImageReference2D& image) const { if(image.type() != ColorType::UnsignedByte) { Error() << "Trade::StbPngImageConverter::exportToData(): unsupported color type" << image.type(); return nullptr; } Int components; switch(image.format()) { case ColorFormat::Red: components = 1; break; case ColorFormat::RG: components = 2; break; case ColorFormat::RGB: components = 3; break; case ColorFormat::RGBA: components = 4; break; default: Error() << "Trade::StbPngImageConverter::exportToData(): unsupported color format" << image.format(); return nullptr; } /* Reverse rows in image data */ Containers::Array<unsigned char> reversedData{std::size_t(image.size().product()*components)}; for(Int y = 0; y != image.size().y(); ++y) { const Int stride = image.size().x()*components; std::copy(image.data<unsigned char>() + y*stride, image.data<unsigned char>() + (y + 1)*stride, reversedData + (image.size().y() - y - 1)*stride); } Int size; unsigned char* const data = stbi_write_png_to_mem(reversedData, 0, image.size().x(), image.size().y(), components, &size); CORRADE_INTERNAL_ASSERT(data); /* Copy the data to a new[]-allocated array so we can delete[] it later, then delete the original data with free() */ Containers::Array<char> fileData{std::size_t(size)}; std::copy(data, data + size, fileData.begin()); std::free(data); return fileData; }
Containers::Array<unsigned char> TgaImageConverter::doExportToData(const ImageReference2D& image) const { #ifndef MAGNUM_TARGET_GLES if(image.format() != ImageFormat::BGR && image.format() != ImageFormat::BGRA && image.format() != ImageFormat::Red) #else if(image.format() != ImageFormat::RGB && image.format() != ImageFormat::RGBA && image.format() != ImageFormat::Red) #endif { Error() << "Trade::TgaImageConverter::convertToData(): unsupported image format" << image.format(); return nullptr; } if(image.type() != ImageType::UnsignedByte) { Error() << "Trade::TgaImageConverter::convertToData(): unsupported image type" << image.type(); return nullptr; } /* Initialize data buffer */ const UnsignedByte pixelSize = image.pixelSize(); auto data = Containers::Array<unsigned char>::zeroInitialized(sizeof(TgaHeader) + pixelSize*image.size().product()); /* Fill header */ auto header = reinterpret_cast<TgaHeader*>(data.begin()); header->imageType = image.format() == ImageFormat::Red ? 3 : 2; header->bpp = pixelSize*8; header->width = Utility::Endianness::littleEndian(image.size().x()); header->height = Utility::Endianness::littleEndian(image.size().y()); /* Fill data */ std::copy(image.data(), image.data()+pixelSize*image.size().product(), data.begin()+sizeof(TgaHeader)); #ifdef MAGNUM_TARGET_GLES if(image->format() == ImageFormat::RGB) { auto pixels = reinterpret_cast<Math::Vector3<UnsignedByte>*>(data.begin()+sizeof(TgaHeader)); std::transform(pixels, pixels + image.size().product(), pixels, [](Math::Vector3<UnsignedByte> pixel) { return swizzle<'b', 'g', 'r'>(pixel); }); } else if(image.format() == ImageFormat::RGBA) { auto pixels = reinterpret_cast<Math::Vector4<UnsignedByte>*>(data.begin()+sizeof(TgaHeader)); std::transform(pixels, pixels + image.size().product(), pixels, [](Math::Vector4<UnsignedByte> pixel) { return swizzle<'b', 'g', 'r', 'a'>(pixel); }); } #endif return std::move(data); }