changeset 68:492239f6ffc9

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 >
author Eric Wing <ewing . public |-at-| gmail . com>
date Wed, 20 Jun 2012 10:30:47 -0700
parents 96c61ac12446
children be97ae4f30c0
files Isolated/LGPL/SDL_endian_minimal.h
diffstat 1 files changed, 217 insertions(+), 59 deletions(-) [+]
line wrap: on
line diff
--- 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 <slouken@libsdl.org>
+
+  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 <endian.h>
+
+/**
+ *  \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<type>(expression)
+#define SDL_static_cast(type, expression) static_cast<type>(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 <endian.h>
+		#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 <stdint.h>
 
-
+/**
+ *  \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