From 2212baac017002b2248cc192ccaa3185d601e180 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Branimir=20Karad=C5=BEi=C4=87?= Date: Wed, 13 Jun 2018 17:13:37 -0700 Subject: [PATCH] EXR write: Changed channel order to make GIMP and PS load .exr correctly. --- src/image.cpp | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/src/image.cpp b/src/image.cpp index bfebbe9..f5c5e69 100644 --- a/src/image.cpp +++ b/src/image.cpp @@ -4892,13 +4892,15 @@ namespace bimg total += bx::writeLE(_writer, uint32_t(18*4+1), _err); const uint8_t cdata[] = { 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0 }; - total += bx::write(_writer, 'R', _err); - total += bx::write(_writer, cdata, BX_COUNTOF(cdata), _err); - total += bx::write(_writer, 'G', _err); + // Order is always ABGR order because Photoshop and GIMP ignore these fields and + // assume it's in ABGR order. + total += bx::write(_writer, 'A', _err); total += bx::write(_writer, cdata, BX_COUNTOF(cdata), _err); total += bx::write(_writer, 'B', _err); total += bx::write(_writer, cdata, BX_COUNTOF(cdata), _err); - total += bx::write(_writer, 'A', _err); + total += bx::write(_writer, 'G', _err); + total += bx::write(_writer, cdata, BX_COUNTOF(cdata), _err); + total += bx::write(_writer, 'R', _err); total += bx::write(_writer, cdata, BX_COUNTOF(cdata), _err); total += bx::write(_writer, '\0', _err); @@ -4974,12 +4976,7 @@ namespace bimg for (uint32_t xx = 0; xx < _width && _err->isOk(); ++xx) { - total += bx::write(_writer, &data[xx*bpp/8+0*bytesPerChannel], bytesPerChannel, _err); - } - - for (uint32_t xx = 0; xx < _width && _err->isOk(); ++xx) - { - total += bx::write(_writer, &data[xx*bpp/8+1*bytesPerChannel], bytesPerChannel, _err); + total += bx::write(_writer, &data[xx*bpp/8+3*bytesPerChannel], bytesPerChannel, _err); } for (uint32_t xx = 0; xx < _width && _err->isOk(); ++xx) @@ -4989,7 +4986,12 @@ namespace bimg for (uint32_t xx = 0; xx < _width && _err->isOk(); ++xx) { - total += bx::write(_writer, &data[xx*bpp/8+3*bytesPerChannel], bytesPerChannel, _err); + total += bx::write(_writer, &data[xx*bpp/8+1*bytesPerChannel], bytesPerChannel, _err); + } + + for (uint32_t xx = 0; xx < _width && _err->isOk(); ++xx) + { + total += bx::write(_writer, &data[xx*bpp/8+0*bytesPerChannel], bytesPerChannel, _err); } data += _srcPitch;