# HG changeset patch # User Eric Wing # Date 1340213447 25200 # Node ID 492239f6ffc95af6558f29cc4b8fb77b15eb5fbb # Parent 96c61ac12446d00236268094939bdd9c9cc39302 Changed SDL_endian_minimal.h to copy from SDL 1.3 which is under the zlib license instead of LGPL. Thanks to Johnson Lin for contributing this. I made a few changes. It seems the Android stuff will hit the __linux define so I could remove the Android specific case. I also needed to copy the SDL_static_cast (and SDL_reinterpret_cast) from SDL_stdinc.h because some of the macros depend on it. Running this dumps the #defines for me: /usr/local/bin/android-ndk/toolchains/arm-linux-androideabi-4.4.3/prebuilt/darwin-x86/bin/arm-linux-androideabi-cpp -dM /dev/null (Instructions found from http://annoyingtechnicaldetails.wordpress.com/2012/02/01/which-macros-does-the-android-ndk-gcc-define/) Johnson Lin < arch . jslin - at - gmail . com > diff -r 96c61ac12446 -r 492239f6ffc9 Isolated/LGPL/SDL_endian_minimal.h --- a/Isolated/LGPL/SDL_endian_minimal.h Tue Jun 19 18:49:27 2012 -0700 +++ b/Isolated/LGPL/SDL_endian_minimal.h Wed Jun 20 10:30:47 2012 -0700 @@ -1,99 +1,257 @@ /* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2009 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org + Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL_endian.h + * + * Functions for reading and writing endian-specific values */ -/* - Attention: This is a stripped down file of SDL_endian for our purposes. - This code is licensed under the LGPL. - This means we must not compile this code into anything that we are not willing to - publicly release source code. - You should compile this into a separate dynamic library that is isolated from proprietary code. +/* + Attention: This is a stripped down file of SDL_endian.h for our purposes. + SDL_static_cast and SDL_reinterpret_cast come from SDL_stdinc.h. */ #ifndef SDL_endian_minimal_h #define SDL_endian_minimal_h -#ifdef ANDROID_NDK -#include + +/** + * \name Cast operators + * + * Use proper C++ casts when compiled as C++ to be compatible with the option + * -Wold-style-cast of GCC (and -Werror=old-style-cast in GCC 4.2 and above). + */ +/*@{*/ +#ifdef __cplusplus +#define SDL_reinterpret_cast(type, expression) reinterpret_cast(expression) +#define SDL_static_cast(type, expression) static_cast(expression) +#else +#define SDL_reinterpret_cast(type, expression) ((type)(expression)) +#define SDL_static_cast(type, expression) ((type)(expression)) +#endif +/*@}*//*Cast operators*/ + + -#define SDL_BYTEORDER _BYTE_ORDER -#define SDL_BIG_ENDIAN _BIG_ENDIAN -#define SDL_LITTLE_ENDIAN _LITTLE_ENDIAN -#endif +/** + * \name The two types of endianness + */ +/*@{*/ +#define SDL_LIL_ENDIAN 1234 +#define SDL_BIG_ENDIAN 4321 +/*@}*/ + +#ifndef SDL_BYTEORDER /* Not defined in SDL_config.h? */ + #ifdef __linux__ + #include + #define SDL_BYTEORDER __BYTE_ORDER + #else /* __linux __ */ + #if defined(__hppa__) || \ + defined(__m68k__) || defined(mc68000) || defined(_M_M68K) || \ + (defined(__MIPS__) && defined(__MISPEB__)) || \ + defined(__ppc__) || defined(__POWERPC__) || defined(_M_PPC) || \ + defined(__sparc__) + + #define SDL_BYTEORDER SDL_BIG_ENDIAN + #else + #define SDL_BYTEORDER SDL_LIL_ENDIAN + #endif + #endif /* __linux __ */ +#endif /* !SDL_BYTEORDER */ + #include - +/** + * \file SDL_endian.h + * + * Uses inline functions for compilers that support them, and static + * functions for those that do not. Because these functions become + * static for compilers that do not support inline functions, this + * header should only be included in files that actually use them. + */ #if defined(__GNUC__) && defined(__i386__) && \ - !(__GNUC__ == 2 && __GNUC_MINOR__ <= 95 /* broken gcc version */) -static __inline__ uint32_t SDL_Swap32(uint32_t x) + !(__GNUC__ == 2 && __GNUC_MINOR__ == 95 /* broken gcc version */) +static __inline__ uint16_t +SDL_Swap16(uint16_t x) { - __asm__("bswap %0" : "=r" (x) : "0" (x)); - return x; + __asm__("xchgb %b0,%h0": "=q"(x):"0"(x)); + return x; } #elif defined(__GNUC__) && defined(__x86_64__) -static __inline__ uint32_t SDL_Swap32(uint32_t x) +static __inline__ uint16_t +SDL_Swap16(uint16_t x) +{ + __asm__("xchgb %b0,%h0": "=Q"(x):"0"(x)); + return x; +} +#elif defined(__GNUC__) && (defined(__powerpc__) || defined(__ppc__)) +static __inline__ uint16_t +SDL_Swap16(uint16_t x) +{ + int result; + + __asm__("rlwimi %0,%2,8,16,23": "=&r"(result):"0"(x >> 8), "r"(x)); + return (uint16_t)result; +} +#elif defined(__GNUC__) && (defined(__M68000__) || defined(__M68020__)) && !defined(__mcoldfire__) +static __inline__ uint16_t +SDL_Swap16(uint16_t x) { - __asm__("bswapl %0" : "=r" (x) : "0" (x)); - return x; + __asm__("rorw #8,%0": "=d"(x): "0"(x):"cc"); + return x; +} +#else +static __inline__ uint16_t +SDL_Swap16(uint16_t x) +{ + return SDL_static_cast(uint16_t, ((x << 8) | (x >> 8))); +} +#endif + +#if defined(__GNUC__) && defined(__i386__) +static __inline__ uint32_t +SDL_Swap32(uint32_t x) +{ + __asm__("bswap %0": "=r"(x):"0"(x)); + return x; +} +#elif defined(__GNUC__) && defined(__x86_64__) +static __inline__ uint32_t +SDL_Swap32(uint32_t x) +{ + __asm__("bswapl %0": "=r"(x):"0"(x)); + return x; } #elif defined(__GNUC__) && (defined(__powerpc__) || defined(__ppc__)) -static __inline__ uint32_t SDL_Swap32(uint32_t x) +static __inline__ uint32_t +SDL_Swap32(uint32_t x) { - uint32_t result; + uint32_t result; - __asm__("rlwimi %0,%2,24,16,23" : "=&r" (result) : "0" (x>>24), "r" (x)); - __asm__("rlwimi %0,%2,8,8,15" : "=&r" (result) : "0" (result), "r" (x)); - __asm__("rlwimi %0,%2,24,0,7" : "=&r" (result) : "0" (result), "r" (x)); - return result; + __asm__("rlwimi %0,%2,24,16,23": "=&r"(result):"0"(x >> 24), "r"(x)); + __asm__("rlwimi %0,%2,8,8,15": "=&r"(result):"0"(result), "r"(x)); + __asm__("rlwimi %0,%2,24,0,7": "=&r"(result):"0"(result), "r"(x)); + return result; } -#elif defined(__GNUC__) && (defined(__M68000__) || defined(__M68020__)) -static __inline__ uint32_t SDL_Swap32(uint32_t x) +#elif defined(__GNUC__) && (defined(__M68000__) || defined(__M68020__)) && !defined(__mcoldfire__) +static __inline__ uint32_t +SDL_Swap32(uint32_t x) { - __asm__("rorw #8,%0\n\tswap %0\n\trorw #8,%0" : "=d" (x) : "0" (x) : "cc"); - return x; + __asm__("rorw #8,%0\n\tswap %0\n\trorw #8,%0": "=d"(x): "0"(x):"cc"); + return x; } #else -static __inline__ uint32_t SDL_Swap32(uint32_t x) { - return((x<<24)|((x<<8)&0x00FF0000)|((x>>8)&0x0000FF00)|(x>>24)); +static __inline__ uint32_t +SDL_Swap32(uint32_t x) +{ + return SDL_static_cast(uint32_t, ((x << 24) | ((x << 8) & 0x00FF0000) | + ((x >> 8) & 0x0000FF00) | (x >> 24))); +} +#endif + +#if defined(__GNUC__) && defined(__i386__) +static __inline__ uint64_t +SDL_Swap64(uint64_t x) +{ + union + { + struct + { + uint32_t a, b; + } s; + uint64_t u; + } v; + v.u = x; + __asm__("bswapl %0 ; bswapl %1 ; xchgl %0,%1": "=r"(v.s.a), "=r"(v.s.b):"0"(v.s.a), + "1"(v.s. + b)); + return v.u; +} +#elif defined(__GNUC__) && defined(__x86_64__) +static __inline__ uint64_t +SDL_Swap64(uint64_t x) +{ + __asm__("bswapq %0": "=r"(x):"0"(x)); + return x; +} +#else +static __inline__ uint64_t +SDL_Swap64(uint64_t x) +{ + uint32_t hi, lo; + + /* Separate into high and low 32-bit values and swap them */ + lo = SDL_static_cast(uint32_t, x & 0xFFFFFFFF); + x >>= 32; + hi = SDL_static_cast(uint32_t, x & 0xFFFFFFFF); + x = SDL_Swap32(lo); + x <<= 32; + x |= SDL_Swap32(hi); + return (x); } #endif -#if SDL_BYTEORDER == SDL_BIG_ENDIAN +static __inline__ float +SDL_SwapFloat(float x) +{ + union + { + float f; + uint32_t ui32; + } swapper; + swapper.f = x; + swapper.ui32 = SDL_Swap32(swapper.ui32); + return swapper.f; +} + + +/** + * \name Swap to native + * Byteswap item from the specified endianness to the native endianness. + */ +/*@{*/ +#if SDL_BYTEORDER == SDL_LIL_ENDIAN +#define SDL_SwapLE16(X) (X) +#define SDL_SwapLE32(X) (X) +#define SDL_SwapLE64(X) (X) +#define SDL_SwapFloatLE(X) (X) +#define SDL_SwapBE16(X) SDL_Swap16(X) +#define SDL_SwapBE32(X) SDL_Swap32(X) +#define SDL_SwapBE64(X) SDL_Swap64(X) +#define SDL_SwapFloatBE(X) SDL_SwapFloat(X) +#else #define SDL_SwapLE16(X) SDL_Swap16(X) #define SDL_SwapLE32(X) SDL_Swap32(X) #define SDL_SwapLE64(X) SDL_Swap64(X) +#define SDL_SwapFloatLE(X) SDL_SwapFloat(X) #define SDL_SwapBE16(X) (X) #define SDL_SwapBE32(X) (X) #define SDL_SwapBE64(X) (X) -#else -#define SDL_SwapLE16(X) (X) -#define SDL_SwapLE32(X) (X) -#define SDL_SwapLE64(X) (X) -#define SDL_SwapBE16(X) SDL_Swap16(X) -#define SDL_SwapBE32(X) SDL_Swap32(X) -#define SDL_SwapBE64(X) SDL_Swap64(X) +#define SDL_SwapFloatBE(X) (X) #endif +/*@}*//*Swap to native*/ #endif // SDL_endian_minimal_h