Addresses DwaCompressor endianess issue, which caused a sparc-only test failure.
Posted upstream here https://github.com/openexr/openexr/issues/222. No response yet.
--- IlmImf/ImfDwaCompressor.cpp 2016-12-22 15:20:40.220763763 +0000
+++ IlmImf/ImfDwaCompressor.cpp 2017-01-10 09:47:16.415207575 +0000
@@ -824,15 +824,15 @@
if (!_isNativeXdr)
{
- for (int i = 0; i < 64; ++i)
- {
- tmpShortXdr = halfZigBlock[comp]._buffer[i];
+ //for (int i = 0; i < 64; ++i)
+ //{
+ tmpShortXdr = halfZigBlock[comp]._buffer[0];
tmpConstCharPtr = (const char *)&tmpShortXdr;
Xdr::read<CharPtrIO> (tmpConstCharPtr, tmpShortNative);
- halfZigBlock[comp]._buffer[i] = tmpShortNative;
- }
+ halfZigBlock[comp]._buffer[0] = tmpShortNative;
+ //}
}
if (lastNonZero == 0)
@@ -1131,6 +1131,20 @@
} // comp
} // blocky
+ if (!_isNativeXdr) {
+ for (unsigned int chan = 0; chan < numComp; ++chan)
+ {
+ for (int y=0; y<_height; ++y)
+ {
+ for (int x=0; x<_width; ++x)
+ {
+ char c = _rowPtrs[chan][y][2*x];
+ _rowPtrs[chan][y][2*x] =_rowPtrs[chan][y][2*x+1];
+ _rowPtrs[chan][y][2*x+1] = c;
+ }
+ }
+ }
+ }
//
// Walk over all the channels that are of type FLOAT.
// Convert from HALF XDR back to FLOAT XDR.
@@ -1470,9 +1484,12 @@
vy = _height - (vy - (_height - 1));
if (vy < 0) vy = _height-1;
-
+
tmpShortXdr =
((const unsigned short *)(_rowPtrs[chan])[vy])[vx];
+ if (!GLOBAL_SYSTEM_LITTLE_ENDIAN) {
+ tmpShortXdr = ((tmpShortXdr << 8) & 0xff00) | ((tmpShortXdr >> 8) & 0xff);
+ }
if (_toNonlinear)
{
@@ -1546,6 +1563,9 @@
{
tmpCharPtr = (char *)&tmpShortXdr;
Xdr::write<CharPtrIO>(tmpCharPtr, halfZigCoef[i].bits());
+ if (!GLOBAL_SYSTEM_LITTLE_ENDIAN) {
+ tmpShortXdr = ((tmpShortXdr << 8) & 0xff00) | ((tmpShortXdr >> 8) & 0xff);
+ }
halfZigCoef[i].setBits(tmpShortXdr);
}
@@ -1553,9 +1573,12 @@
// Save the DC component separately, to be compressed on
// its own.
//
-
- *currDcComp[chan]++ = halfZigCoef[0].bits();
- _numDcComp++;
+ if (!GLOBAL_SYSTEM_LITTLE_ENDIAN) {
+ *currDcComp[chan]++ = (halfZigCoef[0].bits() << 8 & 0xff00) | (halfZigCoef[0].bits() >> 8 & 0xff);
+ } else {
+ *currDcComp[chan]++ = halfZigCoef[0].bits();
+ }
+ _numDcComp++;
//
// Then RLE the AC components (which will record the count