From e567db5327e2e3ab2d44663303e86f6c0455ddcb Mon Sep 17 00:00:00 2001 From: Iliyas Jorio Date: Sat, 3 Sep 2022 00:53:11 +0200 Subject: [PATCH] QD3D/Graphics big-endian compatibility --- src/Graphics/Graphics.cpp | 2 ++ src/QD3D/3DMFParser.cpp | 6 +++--- src/QD3D/QD3D.cpp | 4 ++-- src/QD3D/QD3D.h | 5 +++++ 4 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/Graphics/Graphics.cpp b/src/Graphics/Graphics.cpp index 3db2ddf..5646db5 100644 --- a/src/Graphics/Graphics.cpp +++ b/src/Graphics/Graphics.cpp @@ -576,7 +576,9 @@ void CopyBits( // if the source pixel is not equal to the background color. UInt32 transparentColor = penBG; +#if !(__BIG_ENDIAN__) ByteswapInts(sizeof(transparentColor), 1, &transparentColor); // need to byteswap because ARGBPixmap.GetPtr returns a pointer to raw (big-endian) ARGB ints +#endif for (int y = 0; y < srcRectHeight; y++) { diff --git a/src/QD3D/3DMFParser.cpp b/src/QD3D/3DMFParser.cpp index 8b25a10..ef2b86e 100644 --- a/src/QD3D/3DMFParser.cpp +++ b/src/QD3D/3DMFParser.cpp @@ -543,11 +543,11 @@ TQ3Pixmap* Q3MetaFileParser::ParsePixmap(uint32_t chunkType, uint32_t chunkSize) f.Skip(rowBytes - width * bytesPerPixel); } - // Make every pixel little-endian (especially to avoid breaking 16-bit 1-5-5-5 ARGB textures) - if (byteOrder == kQ3EndianBig) + // Convert to native endianness (especially to avoid breaking 16-bit 1-5-5-5 ARGB textures) + if (byteOrder != kQ3EndianNative) { ByteswapInts(bytesPerPixel, width*height, pixmap->image); - pixmap->byteOrder = kQ3EndianLittle; + pixmap->byteOrder = kQ3EndianNative; } Q3Pixmap_ApplyEdgePadding(pixmap); diff --git a/src/QD3D/QD3D.cpp b/src/QD3D/QD3D.cpp index 007cd9c..3df2945 100644 --- a/src/QD3D/QD3D.cpp +++ b/src/QD3D/QD3D.cpp @@ -110,7 +110,7 @@ void Q3Pixmap_ApplyEdgePadding(TQ3Pixmap* pm) pm->width, pm->height, pm->rowBytes, - pm->byteOrder==kQ3EndianBig? 0x0080: 0x8000); + pm->byteOrder==kQ3EndianNative? 0x8000: 0x0080); break; case kQ3PixelTypeARGB32: @@ -120,7 +120,7 @@ void Q3Pixmap_ApplyEdgePadding(TQ3Pixmap* pm) pm->width, pm->height, pm->rowBytes, - pm->byteOrder==kQ3EndianBig? 0x000000FF: 0xFF000000); + pm->byteOrder==kQ3EndianNative? 0xFF000000: 0x000000FF); break; case kQ3PixelTypeRGB16: diff --git a/src/QD3D/QD3D.h b/src/QD3D/QD3D.h index 9885f0e..967a0db 100644 --- a/src/QD3D/QD3D.h +++ b/src/QD3D/QD3D.h @@ -134,6 +134,11 @@ typedef enum { kQ3EndianBig = 0, kQ3EndianLittle = 1, +#if __BIG_ENDIAN__ + kQ3EndianNative = kQ3EndianBig, +#else + kQ3EndianNative = kQ3EndianLittle, +#endif kQ3EndianSize32 = 0xFFFFFFFF } TQ3Endian;