@@ -1118,52 +1118,52 @@ std::vector<std::byte> ImageConversion::convertImageDataToFile(std::span<const s
11181118 switch (fileFormat) {
11191119 case FileFormat::PNG: {
11201120 if (format == ImageFormat::RGB888) {
1121- stbi_write_png_to_func (stbWriteFunc, &out, width, height, sizeof (ImagePixel ::RGB888), imageData.data (), 0 );
1121+ stbi_write_png_to_func (stbWriteFunc, &out, width, height, sizeof (ImagePixelV2 ::RGB888), imageData.data (), 0 );
11221122 } else if (format == ImageFormat::RGBA8888) {
1123- stbi_write_png_to_func (stbWriteFunc, &out, width, height, sizeof (ImagePixel ::RGBA8888), imageData.data (), 0 );
1123+ stbi_write_png_to_func (stbWriteFunc, &out, width, height, sizeof (ImagePixelV2 ::RGBA8888), imageData.data (), 0 );
11241124 } else if (ImageFormatDetails::opaque (format)) {
11251125 const auto rgb = convertImageDataToFormat (imageData, format, ImageFormat::RGB888, width, height);
1126- stbi_write_png_to_func (stbWriteFunc, &out, width, height, sizeof (ImagePixel ::RGB888), rgb.data (), 0 );
1126+ stbi_write_png_to_func (stbWriteFunc, &out, width, height, sizeof (ImagePixelV2 ::RGB888), rgb.data (), 0 );
11271127 } else {
11281128 const auto rgba = convertImageDataToFormat (imageData, format, ImageFormat::RGBA8888, width, height);
1129- stbi_write_png_to_func (stbWriteFunc, &out, width, height, sizeof (ImagePixel ::RGBA8888), rgba.data (), 0 );
1129+ stbi_write_png_to_func (stbWriteFunc, &out, width, height, sizeof (ImagePixelV2 ::RGBA8888), rgba.data (), 0 );
11301130 }
11311131 break ;
11321132 }
11331133 case FileFormat::JPG: {
11341134 if (format == ImageFormat::RGB888) {
1135- stbi_write_jpg_to_func (stbWriteFunc, &out, width, height, sizeof (ImagePixel ::RGB888), imageData.data (), 95 );
1135+ stbi_write_jpg_to_func (stbWriteFunc, &out, width, height, sizeof (ImagePixelV2 ::RGB888), imageData.data (), 95 );
11361136 } else {
11371137 const auto rgb = convertImageDataToFormat (imageData, format, ImageFormat::RGB888, width, height);
1138- stbi_write_jpg_to_func (stbWriteFunc, &out, width, height, sizeof (ImagePixel ::RGB888), rgb.data (), 95 );
1138+ stbi_write_jpg_to_func (stbWriteFunc, &out, width, height, sizeof (ImagePixelV2 ::RGB888), rgb.data (), 95 );
11391139 }
11401140 break ;
11411141 }
11421142 case FileFormat::BMP: {
11431143 if (format == ImageFormat::RGB888) {
1144- stbi_write_bmp_to_func (stbWriteFunc, &out, width, height, sizeof (ImagePixel ::RGB888), imageData.data ());
1144+ stbi_write_bmp_to_func (stbWriteFunc, &out, width, height, sizeof (ImagePixelV2 ::RGB888), imageData.data ());
11451145 } else if (format == ImageFormat::RGBA8888) {
1146- stbi_write_bmp_to_func (stbWriteFunc, &out, width, height, sizeof (ImagePixel ::RGBA8888), imageData.data ());
1146+ stbi_write_bmp_to_func (stbWriteFunc, &out, width, height, sizeof (ImagePixelV2 ::RGBA8888), imageData.data ());
11471147 } else if (ImageFormatDetails::opaque (format)) {
11481148 const auto rgb = convertImageDataToFormat (imageData, format, ImageFormat::RGB888, width, height);
1149- stbi_write_bmp_to_func (stbWriteFunc, &out, width, height, sizeof (ImagePixel ::RGB888), rgb.data ());
1149+ stbi_write_bmp_to_func (stbWriteFunc, &out, width, height, sizeof (ImagePixelV2 ::RGB888), rgb.data ());
11501150 } else {
11511151 const auto rgba = convertImageDataToFormat (imageData, format, ImageFormat::RGBA8888, width, height);
1152- stbi_write_bmp_to_func (stbWriteFunc, &out, width, height, sizeof (ImagePixel ::RGBA8888), rgba.data ());
1152+ stbi_write_bmp_to_func (stbWriteFunc, &out, width, height, sizeof (ImagePixelV2 ::RGBA8888), rgba.data ());
11531153 }
11541154 break ;
11551155 }
11561156 case FileFormat::TGA: {
11571157 if (format == ImageFormat::RGB888) {
1158- stbi_write_tga_to_func (stbWriteFunc, &out, width, height, sizeof (ImagePixel ::RGB888), imageData.data ());
1158+ stbi_write_tga_to_func (stbWriteFunc, &out, width, height, sizeof (ImagePixelV2 ::RGB888), imageData.data ());
11591159 } else if (format == ImageFormat::RGBA8888) {
1160- stbi_write_tga_to_func (stbWriteFunc, &out, width, height, sizeof (ImagePixel ::RGBA8888), imageData.data ());
1160+ stbi_write_tga_to_func (stbWriteFunc, &out, width, height, sizeof (ImagePixelV2 ::RGBA8888), imageData.data ());
11611161 } else if (ImageFormatDetails::opaque (format)) {
11621162 const auto rgb = convertImageDataToFormat (imageData, format, ImageFormat::RGB888, width, height);
1163- stbi_write_tga_to_func (stbWriteFunc, &out, width, height, sizeof (ImagePixel ::RGB888), rgb.data ());
1163+ stbi_write_tga_to_func (stbWriteFunc, &out, width, height, sizeof (ImagePixelV2 ::RGB888), rgb.data ());
11641164 } else {
11651165 const auto rgba = convertImageDataToFormat (imageData, format, ImageFormat::RGBA8888, width, height);
1166- stbi_write_tga_to_func (stbWriteFunc, &out, width, height, sizeof (ImagePixel ::RGBA8888), rgba.data ());
1166+ stbi_write_tga_to_func (stbWriteFunc, &out, width, height, sizeof (ImagePixelV2 ::RGBA8888), rgba.data ());
11671167 }
11681168 break ;
11691169 }
@@ -1184,15 +1184,15 @@ std::vector<std::byte> ImageConversion::convertImageDataToFile(std::span<const s
11841184 }
11851185
11861186 if (format == ImageFormat::RGB888) {
1187- WebPPictureImportRGB (&pic, reinterpret_cast <const uint8_t *>(imageData.data ()), static_cast <int >(width * sizeof (ImagePixel ::RGB888)));
1187+ WebPPictureImportRGB (&pic, reinterpret_cast <const uint8_t *>(imageData.data ()), static_cast <int >(width * sizeof (ImagePixelV2 ::RGB888)));
11881188 } else if (format == ImageFormat::RGBA8888) {
1189- WebPPictureImportRGBA (&pic, reinterpret_cast <const uint8_t *>(imageData.data ()), static_cast <int >(width * sizeof (ImagePixel ::RGBA8888)));
1189+ WebPPictureImportRGBA (&pic, reinterpret_cast <const uint8_t *>(imageData.data ()), static_cast <int >(width * sizeof (ImagePixelV2 ::RGBA8888)));
11901190 } else if (ImageFormatDetails::opaque (format)) {
11911191 const auto rgb = convertImageDataToFormat (imageData, format, ImageFormat::RGB888, width, height);
1192- WebPPictureImportRGB (&pic, reinterpret_cast <const uint8_t *>(rgb.data ()), static_cast <int >(width * sizeof (ImagePixel ::RGB888)));
1192+ WebPPictureImportRGB (&pic, reinterpret_cast <const uint8_t *>(rgb.data ()), static_cast <int >(width * sizeof (ImagePixelV2 ::RGB888)));
11931193 } else {
11941194 const auto rgba = convertImageDataToFormat (imageData, format, ImageFormat::RGBA8888, width, height);
1195- WebPPictureImportRGBA (&pic, reinterpret_cast <const uint8_t *>(rgba.data ()), static_cast <int >(width * sizeof (ImagePixel ::RGBA8888)));
1195+ WebPPictureImportRGBA (&pic, reinterpret_cast <const uint8_t *>(rgba.data ()), static_cast <int >(width * sizeof (ImagePixelV2 ::RGBA8888)));
11961196 }
11971197
11981198 WebPMemoryWriter writer;
@@ -2093,43 +2093,43 @@ std::vector<std::byte> ImageConversion::gammaCorrectImageData(std::span<const st
20932093
20942094#ifdef SOURCEPP_BUILD_WITH_TBB
20952095 #define VTFPP_GAMMA_CORRECT (InputType, ...) \
2096- std::span imageDataSpan{reinterpret_cast <const ImagePixel ::InputType*>(imageData.data ()), imageData.size () / sizeof (ImagePixel ::InputType)}; \
2097- std::span outSpan{reinterpret_cast <ImagePixel ::InputType*>(out.data ()), out.size () / sizeof (ImagePixel ::InputType)}; \
2098- std::transform (std::execution::par_unseq, imageDataSpan.begin (), imageDataSpan.end (), outSpan.begin (), [gammaLUTs](ImagePixel ::InputType pixel) -> ImagePixel ::InputType { \
2099- using PIXEL_TYPE = ImagePixel ::InputType; \
2100- return __VA_ARGS__; \
2096+ std::span imageDataSpan{reinterpret_cast <const ImagePixelV2 ::InputType*>(imageData.data ()), imageData.size () / sizeof (ImagePixelV2 ::InputType)}; \
2097+ std::span outSpan{reinterpret_cast <ImagePixelV2 ::InputType*>(out.data ()), out.size () / sizeof (ImagePixelV2 ::InputType)}; \
2098+ std::transform (std::execution::par_unseq, imageDataSpan.begin (), imageDataSpan.end (), outSpan.begin (), [gammaLUTs](ImagePixelV2 ::InputType pixel) -> ImagePixelV2 ::InputType { \
2099+ using PIXEL_TYPE = ImagePixelV2 ::InputType; \
2100+ return PIXEL_TYPE ( __VA_ARGS__) ; \
21012101 })
21022102#else
21032103 #define VTFPP_GAMMA_CORRECT (InputType, ...) \
2104- std::span imageDataSpan{reinterpret_cast <const ImagePixel ::InputType*>(imageData.data ()), imageData.size () / sizeof (ImagePixel ::InputType)}; \
2105- std::span outSpan{reinterpret_cast <ImagePixel ::InputType*>(out.data ()), out.size () / sizeof (ImagePixel ::InputType)}; \
2106- std::transform (imageDataSpan.begin (), imageDataSpan.end (), outSpan.begin (), [gammaLUTs](ImagePixel ::InputType pixel) -> ImagePixel ::InputType { \
2107- using PIXEL_TYPE = ImagePixel ::InputType; \
2108- return __VA_ARGS__; \
2104+ std::span imageDataSpan{reinterpret_cast <const ImagePixelV2 ::InputType*>(imageData.data ()), imageData.size () / sizeof (ImagePixelV2 ::InputType)}; \
2105+ std::span outSpan{reinterpret_cast <ImagePixelV2 ::InputType*>(out.data ()), out.size () / sizeof (ImagePixelV2 ::InputType)}; \
2106+ std::transform (imageDataSpan.begin (), imageDataSpan.end (), outSpan.begin (), [gammaLUTs](ImagePixelV2 ::InputType pixel) -> ImagePixelV2 ::InputType { \
2107+ using PIXEL_TYPE = ImagePixelV2 ::InputType; \
2108+ return PIXEL_TYPE ( __VA_ARGS__) ; \
21092109 })
21102110#endif
21112111 #define VTFPP_CASE_GAMMA_CORRECT_AND_BREAK (InputType, ...) \
21122112 case InputType: { VTFPP_CREATE_GAMMA_LUTS (InputType) VTFPP_GAMMA_CORRECT (InputType, __VA_ARGS__); } break
21132113
21142114 switch (format) {
21152115 using enum ImageFormat;
2116- VTFPP_CASE_GAMMA_CORRECT_AND_BREAK (ABGR8888, { pixel.a , VTFPP_APPLY_GAMMA_BLUE (pixel.b ) , VTFPP_APPLY_GAMMA_GREEN (pixel.g ) , VTFPP_APPLY_GAMMA_RED (pixel.r )} );
2117- VTFPP_CASE_GAMMA_CORRECT_AND_BREAK (RGB888, { VTFPP_APPLY_GAMMA_RED (pixel.r ) , VTFPP_APPLY_GAMMA_GREEN (pixel.g ) , VTFPP_APPLY_GAMMA_BLUE (pixel.b )} );
2118- VTFPP_CASE_GAMMA_CORRECT_AND_BREAK (RGB888_BLUESCREEN, pixel.r == 0 && pixel.g == 0 && pixel.b == 0xff ? ImagePixel ::RGB888_BLUESCREEN{0 , 0 , 0xff } : ImagePixel ::RGB888_BLUESCREEN{VTFPP_APPLY_GAMMA_RED (pixel.r ) , VTFPP_APPLY_GAMMA_GREEN (pixel.g ) , VTFPP_APPLY_GAMMA_BLUE (pixel.b )});
2119- VTFPP_CASE_GAMMA_CORRECT_AND_BREAK (BGR888, { VTFPP_APPLY_GAMMA_BLUE (pixel.b ) , VTFPP_APPLY_GAMMA_GREEN (pixel.g ) , VTFPP_APPLY_GAMMA_RED (pixel.r )} );
2120- VTFPP_CASE_GAMMA_CORRECT_AND_BREAK (BGR888_BLUESCREEN, pixel.r == 0 && pixel.g == 0 && pixel.b == 0xff ? ImagePixel ::BGR888_BLUESCREEN{0 , 0 , 0xff } : ImagePixel ::BGR888_BLUESCREEN{VTFPP_APPLY_GAMMA_BLUE (pixel.b ) , VTFPP_APPLY_GAMMA_GREEN (pixel.g ) , VTFPP_APPLY_GAMMA_RED (pixel.r )});
2121- VTFPP_CASE_GAMMA_CORRECT_AND_BREAK (RGB565, { VTFPP_APPLY_GAMMA_RED (pixel.r ) , VTFPP_APPLY_GAMMA_GREEN (pixel.g ) , VTFPP_APPLY_GAMMA_BLUE (pixel.b )} );
2122- VTFPP_CASE_GAMMA_CORRECT_AND_BREAK (I8, { VTFPP_APPLY_GAMMA_RED (pixel.i )} );
2123- VTFPP_CASE_GAMMA_CORRECT_AND_BREAK (IA88, { VTFPP_APPLY_GAMMA_RED (pixel.i ) , pixel.a } );
2124- VTFPP_CASE_GAMMA_CORRECT_AND_BREAK (ARGB8888, { pixel.a , VTFPP_APPLY_GAMMA_RED (pixel.r ) , VTFPP_APPLY_GAMMA_GREEN (pixel.g ) , VTFPP_APPLY_GAMMA_BLUE (pixel.b )} );
2125- VTFPP_CASE_GAMMA_CORRECT_AND_BREAK (BGRA8888, { VTFPP_APPLY_GAMMA_BLUE (pixel.b ) , VTFPP_APPLY_GAMMA_GREEN (pixel.g ) , VTFPP_APPLY_GAMMA_RED (pixel.r ) , pixel.a } );
2126- VTFPP_CASE_GAMMA_CORRECT_AND_BREAK (BGRX8888, { VTFPP_APPLY_GAMMA_BLUE (pixel.b ) , VTFPP_APPLY_GAMMA_GREEN (pixel.g ) , VTFPP_APPLY_GAMMA_RED (pixel.r ) , 0xff } );
2127- VTFPP_CASE_GAMMA_CORRECT_AND_BREAK (BGR565, { VTFPP_APPLY_GAMMA_BLUE (pixel.b ) , VTFPP_APPLY_GAMMA_GREEN (pixel.g ) , VTFPP_APPLY_GAMMA_RED (pixel.r )} );
2128- VTFPP_CASE_GAMMA_CORRECT_AND_BREAK (BGRA5551, { VTFPP_APPLY_GAMMA_BLUE (pixel.b ) , VTFPP_APPLY_GAMMA_GREEN (pixel.g ) , VTFPP_APPLY_GAMMA_RED (pixel.r ) , pixel.a } );
2129- VTFPP_CASE_GAMMA_CORRECT_AND_BREAK (BGRX5551, { VTFPP_APPLY_GAMMA_BLUE (pixel.b ) , VTFPP_APPLY_GAMMA_GREEN (pixel.g ) , VTFPP_APPLY_GAMMA_RED (pixel.r ) , 1 } );
2130- VTFPP_CASE_GAMMA_CORRECT_AND_BREAK (BGRA4444, { VTFPP_APPLY_GAMMA_BLUE (pixel.b ) , VTFPP_APPLY_GAMMA_GREEN (pixel.g ) , VTFPP_APPLY_GAMMA_RED (pixel.r ) , pixel.a } );
2131- VTFPP_CASE_GAMMA_CORRECT_AND_BREAK (RGBX8888, { VTFPP_APPLY_GAMMA_RED (pixel.r ) , VTFPP_APPLY_GAMMA_GREEN (pixel.g ) , VTFPP_APPLY_GAMMA_BLUE (pixel.b ) , 0xff } );
2132- VTFPP_CASE_GAMMA_CORRECT_AND_BREAK (R8, { VTFPP_APPLY_GAMMA_RED (pixel.r )} );
2116+ VTFPP_CASE_GAMMA_CORRECT_AND_BREAK (ABGR8888, pixel.a () , VTFPP_APPLY_GAMMA_BLUE (pixel.b ()) , VTFPP_APPLY_GAMMA_GREEN (pixel.g ()) , VTFPP_APPLY_GAMMA_RED (pixel.r ()) );
2117+ VTFPP_CASE_GAMMA_CORRECT_AND_BREAK (RGB888, VTFPP_APPLY_GAMMA_RED (pixel.r ()) , VTFPP_APPLY_GAMMA_GREEN (pixel.g ()) , VTFPP_APPLY_GAMMA_BLUE (pixel.b ()) );
2118+ VTFPP_CASE_GAMMA_CORRECT_AND_BREAK (RGB888_BLUESCREEN, pixel.r () == 0 && pixel.g () == 0 && pixel.b () == 0xff ? ImagePixelV2 ::RGB888_BLUESCREEN{0 , 0 , 0xff } : ImagePixelV2 ::RGB888_BLUESCREEN{VTFPP_APPLY_GAMMA_RED (pixel.r ()) , VTFPP_APPLY_GAMMA_GREEN (pixel.g ()) , VTFPP_APPLY_GAMMA_BLUE (pixel.b () )});
2119+ VTFPP_CASE_GAMMA_CORRECT_AND_BREAK (BGR888, VTFPP_APPLY_GAMMA_BLUE (pixel.b ()) , VTFPP_APPLY_GAMMA_GREEN (pixel.g ()) , VTFPP_APPLY_GAMMA_RED (pixel.r ()) );
2120+ VTFPP_CASE_GAMMA_CORRECT_AND_BREAK (BGR888_BLUESCREEN, pixel.r () == 0 && pixel.g () == 0 && pixel.b () == 0xff ? ImagePixelV2 ::BGR888_BLUESCREEN{0 , 0 , 0xff } : ImagePixelV2 ::BGR888_BLUESCREEN{VTFPP_APPLY_GAMMA_BLUE (pixel.b ()) , VTFPP_APPLY_GAMMA_GREEN (pixel.g ()) , VTFPP_APPLY_GAMMA_RED (pixel.r () )});
2121+ VTFPP_CASE_GAMMA_CORRECT_AND_BREAK (RGB565, VTFPP_APPLY_GAMMA_RED (pixel.r ()) , VTFPP_APPLY_GAMMA_GREEN (pixel.g ()) , VTFPP_APPLY_GAMMA_BLUE (pixel.b ()) );
2122+ VTFPP_CASE_GAMMA_CORRECT_AND_BREAK (I8, VTFPP_APPLY_GAMMA_RED (pixel.i ()) );
2123+ VTFPP_CASE_GAMMA_CORRECT_AND_BREAK (IA88, VTFPP_APPLY_GAMMA_RED (pixel.i ()) , pixel.a () );
2124+ VTFPP_CASE_GAMMA_CORRECT_AND_BREAK (ARGB8888, pixel.a () , VTFPP_APPLY_GAMMA_RED (pixel.r ()) , VTFPP_APPLY_GAMMA_GREEN (pixel.g ()) , VTFPP_APPLY_GAMMA_BLUE (pixel.b ()) );
2125+ VTFPP_CASE_GAMMA_CORRECT_AND_BREAK (BGRA8888, VTFPP_APPLY_GAMMA_BLUE (pixel.b ()) , VTFPP_APPLY_GAMMA_GREEN (pixel.g ()) , VTFPP_APPLY_GAMMA_RED (pixel.r ()) , pixel.a () );
2126+ VTFPP_CASE_GAMMA_CORRECT_AND_BREAK (BGRX8888, VTFPP_APPLY_GAMMA_BLUE (pixel.b ()) , VTFPP_APPLY_GAMMA_GREEN (pixel.g ()) , VTFPP_APPLY_GAMMA_RED (pixel.r ()) , 0xff );
2127+ VTFPP_CASE_GAMMA_CORRECT_AND_BREAK (BGR565, VTFPP_APPLY_GAMMA_BLUE (pixel.b ()) , VTFPP_APPLY_GAMMA_GREEN (pixel.g ()) , VTFPP_APPLY_GAMMA_RED (pixel.r ()) );
2128+ VTFPP_CASE_GAMMA_CORRECT_AND_BREAK (BGRA5551, VTFPP_APPLY_GAMMA_BLUE (pixel.b ()) , VTFPP_APPLY_GAMMA_GREEN (pixel.g ()) , VTFPP_APPLY_GAMMA_RED (pixel.r ()) , pixel.a () );
2129+ VTFPP_CASE_GAMMA_CORRECT_AND_BREAK (BGRX5551, VTFPP_APPLY_GAMMA_BLUE (pixel.b ()) , VTFPP_APPLY_GAMMA_GREEN (pixel.g ()) , VTFPP_APPLY_GAMMA_RED (pixel.r ()) , 1 );
2130+ VTFPP_CASE_GAMMA_CORRECT_AND_BREAK (BGRA4444, VTFPP_APPLY_GAMMA_BLUE (pixel.b ()) , VTFPP_APPLY_GAMMA_GREEN (pixel.g ()) , VTFPP_APPLY_GAMMA_RED (pixel.r ()) , pixel.a () );
2131+ VTFPP_CASE_GAMMA_CORRECT_AND_BREAK (RGBX8888, VTFPP_APPLY_GAMMA_RED (pixel.r ()) , VTFPP_APPLY_GAMMA_GREEN (pixel.g ()) , VTFPP_APPLY_GAMMA_BLUE (pixel.b ()) , 0xff );
2132+ VTFPP_CASE_GAMMA_CORRECT_AND_BREAK (R8, VTFPP_APPLY_GAMMA_RED (pixel.r ()) );
21332133 default : SOURCEPP_DEBUG_BREAK; break ;
21342134 }
21352135
@@ -2155,17 +2155,17 @@ std::vector<std::byte> ImageConversion::invertGreenChannelForImageData(std::span
21552155 }
21562156
21572157 #define VTFPP_INVERT_GREEN (PixelType, ChannelName, ...) \
2158- static constexpr auto channelSize = ImageFormatDetails::green (ImagePixel ::PixelType::FORMAT); \
2159- std::span imageDataSpan{reinterpret_cast <const ImagePixel ::PixelType*>(imageData.data ()), imageData.size () / sizeof (ImagePixel ::PixelType)}; \
2160- std::span outSpan{reinterpret_cast <ImagePixel ::PixelType*>(out.data ()), out.size () / sizeof (ImagePixel ::PixelType)}; \
2161- std::transform (__VA_ARGS__ __VA_OPT__ (,) imageDataSpan.begin (), imageDataSpan.end (), outSpan.begin (), [](ImagePixel ::PixelType pixel) -> ImagePixel ::PixelType { \
2162- if constexpr (std::same_as<decltype (pixel.ChannelName ) , float > || std::same_as<decltype (pixel.ChannelName ), half>) { \
2163- pixel.ChannelName = static_cast <decltype (pixel.ChannelName ) >(static_cast <float >(static_cast <uint64_t >(1 ) << channelSize) - 1 .f - static_cast <float >(pixel.ChannelName )); \
2158+ static constexpr auto channelSize = ImageFormatDetails::green (ImagePixelV2 ::PixelType::FORMAT); \
2159+ std::span imageDataSpan{reinterpret_cast <const ImagePixelV2 ::PixelType*>(imageData.data ()), imageData.size () / sizeof (ImagePixelV2 ::PixelType)}; \
2160+ std::span outSpan{reinterpret_cast <ImagePixelV2 ::PixelType*>(out.data ()), out.size () / sizeof (ImagePixelV2 ::PixelType)}; \
2161+ std::transform (__VA_ARGS__ __VA_OPT__ (,) imageDataSpan.begin (), imageDataSpan.end (), outSpan.begin (), [](ImagePixelV2 ::PixelType pixel) -> ImagePixelV2 ::PixelType { \
2162+ if constexpr (std::same_as<decltype (pixel.ChannelName ()) , float > || std::same_as<decltype (pixel.ChannelName () ), half>) { \
2163+ pixel.set_ ## ChannelName ( static_cast <decltype (pixel.ChannelName ()) >(static_cast <float >(static_cast <uint64_t >(1 ) << channelSize) - 1 .f - static_cast <float >(pixel.ChannelName ()) )); \
21642164 } else { \
21652165 if constexpr (channelSize >= sizeof (uint32_t ) * 8 ) { \
2166- pixel.ChannelName = static_cast <decltype (pixel.ChannelName ) >((static_cast <uint64_t >(1 ) << channelSize) - 1 - static_cast <uint32_t >(pixel.ChannelName )); \
2166+ pixel.set_ ## ChannelName ( static_cast <decltype (pixel.ChannelName ()) >((static_cast <uint64_t >(1 ) << channelSize) - 1 - static_cast <uint32_t >(pixel.ChannelName ()) )); \
21672167 } else { \
2168- pixel.ChannelName = static_cast <decltype (pixel.ChannelName ) >(static_cast <uint32_t >(1 << channelSize) - 1 - static_cast <uint32_t >(pixel.ChannelName )); \
2168+ pixel.set_ ## ChannelName ( static_cast <decltype (pixel.ChannelName ()) >(static_cast <uint32_t >(1 << channelSize) - 1 - static_cast <uint32_t >(pixel.ChannelName ()) )); \
21692169 } \
21702170 } \
21712171 return pixel; \
0 commit comments