Explorar o código

EXR write: Changed channel order to make GIMP and PS load .exr correctly.

Branimir Karadžić %!s(int64=7) %!d(string=hai) anos
pai
achega
2212baac01
Modificáronse 1 ficheiros con 10 adicións e 8 borrados
  1. 10 8
      src/image.cpp

+ 10 - 8
src/image.cpp

@@ -4892,13 +4892,15 @@ namespace bimg
 		total += bx::writeLE(_writer, uint32_t(18*4+1), _err);
 		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 };
 		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, cdata, BX_COUNTOF(cdata), _err);
 		total += bx::write(_writer, 'B', _err);
 		total += bx::write(_writer, 'B', _err);
 		total += bx::write(_writer, cdata, BX_COUNTOF(cdata), _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, cdata, BX_COUNTOF(cdata), _err);
 		total += bx::write(_writer, '\0', _err);
 		total += bx::write(_writer, '\0', _err);
 
 
@@ -4974,22 +4976,22 @@ namespace bimg
 
 
 			for (uint32_t xx = 0; xx < _width && _err->isOk(); ++xx)
 			for (uint32_t xx = 0; xx < _width && _err->isOk(); ++xx)
 			{
 			{
-				total += bx::write(_writer, &data[xx*bpp/8+0*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)
 			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+2*bytesPerChannel], bytesPerChannel, _err);
 			}
 			}
 
 
 			for (uint32_t xx = 0; xx < _width && _err->isOk(); ++xx)
 			for (uint32_t xx = 0; xx < _width && _err->isOk(); ++xx)
 			{
 			{
-				total += bx::write(_writer, &data[xx*bpp/8+2*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)
 			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+0*bytesPerChannel], bytesPerChannel, _err);
 			}
 			}
 
 
 			data += _srcPitch;
 			data += _srcPitch;