diff --git a/src/core/bitmath_func.hpp b/src/core/bitmath_func.hpp index 6f9c35806f..9042e6a7ec 100644 --- a/src/core/bitmath_func.hpp +++ b/src/core/bitmath_func.hpp @@ -291,4 +291,34 @@ template static inline T ROR(const T x, const uint8 n) for (i = 0; b != 0; i++, b >>= 1) \ if (b & 1) + +#if defined(__APPLE__) + /* Make endian swapping use Apple's macros to increase speed + * (since it will use hardware swapping if available). + * Even though they should return uint16 and uint32, we get + * warnings if we don't cast those (why?) */ + #define BSWAP32(x) ((uint32)Endian32_Swap(x)) + #define BSWAP16(x) ((uint16)Endian16_Swap(x)) +#else + /** + * Perform a 32 bits endianness bitswap on x. + * @param x the variable to bitswap + * @return the bitswapped value. + */ + static inline uint32 BSWAP32(uint32 x) + { + return ((x >> 24) & 0xFF) | ((x >> 8) & 0xFF00) | ((x << 8) & 0xFF0000) | ((x << 24) & 0xFF000000); + } + + /** + * Perform a 16 bits endianness bitswap on x. + * @param x the variable to bitswap + * @return the bitswapped value. + */ + static inline uint16 BSWAP16(uint16 x) + { + return (x >> 8) | (x << 8); + } +#endif /* __APPLE__ */ + #endif /* BITMATH_FUNC_HPP */ diff --git a/src/core/endian_func.hpp b/src/core/endian_func.hpp index 545e6b9868..fa73f7f7e2 100644 --- a/src/core/endian_func.hpp +++ b/src/core/endian_func.hpp @@ -5,6 +5,49 @@ #ifndef ENDIAN_FUNC_H #define ENDIAN_FUNC_H +#include "bitmath_func.hpp" + +#if defined(ARM) || defined(__arm__) || defined(__alpha__) + #define OTTD_ALIGNMENT +#endif + +/* Windows has always LITTLE_ENDIAN */ +#if defined(WIN32) || defined(__OS2__) || defined(WIN64) + #define TTD_LITTLE_ENDIAN +#elif !defined(TESTING) + /* Else include endian[target/host].h, which has the endian-type, autodetected by the Makefile */ + #if defined(STRGEN) + #include "/endian_host.h" + #else + #include "endian_target.h" + #endif +#endif /* WIN32 || __OS2__ || WIN64 */ + +/* Setup alignment and conversion macros */ +#if defined(TTD_BIG_ENDIAN) + #define TO_BE32X(x) (x) + #define FROM_BE32(x) (x) + #define TO_BE32(x) (x) + #define FROM_BE16(x) (x) + #define TO_BE16(x) (x) + #define TO_LE32X(x) BSWAP32(x) + static inline uint32 FROM_LE32(uint32 x) { return BSWAP32(x); } + static inline uint32 TO_LE32(uint32 x) { return BSWAP32(x); } + static inline uint16 FROM_LE16(uint16 x) { return BSWAP16(x); } + static inline uint16 TO_LE16(uint16 x) { return BSWAP16(x); } +#else + #define TO_BE32X(x) BSWAP32(x) + static inline uint32 FROM_BE32(uint32 x) { return BSWAP32(x); } + static inline uint32 TO_BE32(uint32 x) { return BSWAP32(x); } + static inline uint16 FROM_BE16(uint16 x) { return BSWAP16(x); } + static inline uint16 TO_BE16(uint16 x) { return BSWAP16(x); } + #define TO_LE32X(x) (x) + #define FROM_LE32(x) (x) + #define TO_LE32(x) (x) + #define FROM_LE16(x) (x) + #define TO_LE16(x) (x) +#endif /* TTD_BIG_ENDIAN */ + static inline uint16 ReadLE16Aligned(const void *x) { return FROM_LE16(*(const uint16*)x); @@ -19,4 +62,4 @@ static inline uint16 ReadLE16Unaligned(const void *x) #endif } -#endif /* ENDIAN_FUNC_H */ +#endif /* ENDIAN_FUNC_HPP */ diff --git a/src/md5.cpp b/src/md5.cpp index 55f9f82403..6dd8964b90 100644 --- a/src/md5.cpp +++ b/src/md5.cpp @@ -56,6 +56,7 @@ */ #include "stdafx.h" +#include "core/endian_func.hpp" #include "md5.h" #include diff --git a/src/network/network_udp.cpp b/src/network/network_udp.cpp index c12ac21c6e..cb29e54ce8 100644 --- a/src/network/network_udp.cpp +++ b/src/network/network_udp.cpp @@ -19,6 +19,7 @@ #include "network_udp.h" #include "../variables.h" #include "../newgrf_config.h" +#include "../core/endian_func.hpp" #include "core/udp.h" diff --git a/src/saveload.cpp b/src/saveload.cpp index 21f23e54ac..f774f91d8f 100644 --- a/src/saveload.cpp +++ b/src/saveload.cpp @@ -30,6 +30,7 @@ #include "gfx_func.h" #include "core/alloc_func.hpp" #include "functions.h" +#include "core/endian_func.hpp" #include extern const uint16 SAVEGAME_VERSION = 83; diff --git a/src/screenshot.cpp b/src/screenshot.cpp index 98e95ab23c..d81135a18a 100644 --- a/src/screenshot.cpp +++ b/src/screenshot.cpp @@ -16,6 +16,7 @@ #include "strings_func.h" #include "zoom_func.h" #include "core/alloc_func.hpp" +#include "core/endian_func.hpp" char _screenshot_format_name[8]; uint _num_screenshot_formats; diff --git a/src/smallmap_gui.cpp b/src/smallmap_gui.cpp index 5498b17de3..c0fa68e5f9 100644 --- a/src/smallmap_gui.cpp +++ b/src/smallmap_gui.cpp @@ -27,6 +27,7 @@ #include "tunnelbridge_map.h" #include "strings_func.h" #include "zoom_func.h" +#include "core/endian_func.hpp" static const Widget _smallmap_widgets[] = { diff --git a/src/sound/cocoa_s.cpp b/src/sound/cocoa_s.cpp index 27812d9e9a..5642c36a09 100644 --- a/src/sound/cocoa_s.cpp +++ b/src/sound/cocoa_s.cpp @@ -22,6 +22,7 @@ #include "../debug.h" #include "../driver.h" #include "../mixer.h" +#include "../core/endian_func.hpp" #include "cocoa_s.h" diff --git a/src/spriteloader/png.cpp b/src/spriteloader/png.cpp index a252433bde..e40fb39b7d 100644 --- a/src/spriteloader/png.cpp +++ b/src/spriteloader/png.cpp @@ -10,6 +10,7 @@ #include "../variables.h" #include "../debug.h" #include "../core/alloc_func.hpp" +#include "../core/endian_func.hpp" #include "png.hpp" #include diff --git a/src/stdafx.h b/src/stdafx.h index 5426eed8ac..40e58cb8c2 100644 --- a/src/stdafx.h +++ b/src/stdafx.h @@ -89,13 +89,6 @@ #if defined(__APPLE__) #include "os/macosx/osx_stdafx.h" - /* Make endian swapping use Apple's macros to increase speed (since it will use hardware swapping if available) - * Even though they should return uint16 and uint32, we get warnings if we don't cast those (why?) */ - #define BSWAP32(x) ((uint32)Endian32_Swap(x)) - #define BSWAP16(x) ((uint16)Endian16_Swap(x)) -#else - #define BSWAP32(x) ((((x) >> 24) & 0xFF) | (((x) >> 8) & 0xFF00) | (((x) << 8) & 0xFF0000) | (((x) << 24) & 0xFF000000)) - #define BSWAP16(x) ((x) >> 8 | (x) << 8) #endif /* __APPLE__ */ #if defined(PSP) @@ -241,20 +234,6 @@ #endif /* WIN32 */ #endif /* STRGEN */ -/* Windows has always LITTLE_ENDIAN */ -#if defined(WIN32) || defined(__OS2__) || defined(WIN64) - #define TTD_LITTLE_ENDIAN -#elif defined(TESTING) - /* Do noting */ -#else - /* Else include endian[target/host].h, which has the endian-type, autodetected by the Makefile */ - #if defined(STRGEN) - #include "endian_host.h" - #else - #include "endian_target.h" - #endif -#endif /* WIN32 || __OS2__ || WIN64 */ - #if defined(WIN32) || defined(WIN64) || defined(__OS2__) && !defined(__INNOTEK_LIBC__) #define PATHSEP "\\" #define PATHSEPCHAR '\\' @@ -281,35 +260,6 @@ typedef unsigned char byte; typedef signed __int64 int64; #endif -#if defined(ARM) || defined(__arm__) || defined(__alpha__) - #define OTTD_ALIGNMENT -#endif - -/* Setup alignment and conversion macros */ -#if defined(TTD_BIG_ENDIAN) - #define TO_BE32X(x) (x) - #define FROM_BE32(x) (x) - #define TO_BE32(x) (x) - #define FROM_BE16(x) (x) - #define TO_BE16(x) (x) - #define TO_LE32X(x) BSWAP32(x) - static inline uint32 FROM_LE32(uint32 x) { return BSWAP32(x); } - static inline uint32 TO_LE32(uint32 x) { return BSWAP32(x); } - static inline uint16 FROM_LE16(uint16 x) { return BSWAP16(x); } - static inline uint16 TO_LE16(uint16 x) { return BSWAP16(x); } -#else - #define TO_BE32X(x) BSWAP32(x) - static inline uint32 FROM_BE32(uint32 x) { return BSWAP32(x); } - static inline uint32 TO_BE32(uint32 x) { return BSWAP32(x); } - static inline uint16 FROM_BE16(uint16 x) { return BSWAP16(x); } - static inline uint16 TO_BE16(uint16 x) { return BSWAP16(x); } - #define TO_LE32X(x) (x) - #define FROM_LE32(x) (x) - #define TO_LE32(x) (x) - #define FROM_LE16(x) (x) - #define TO_LE16(x) (x) -#endif /* TTD_BIG_ENDIAN */ - #if !defined(WITH_PERSONAL_DIR) #define PERSONAL_DIR "" #endif diff --git a/src/strings.cpp b/src/strings.cpp index 421b5311da..0ca9bfa79c 100644 --- a/src/strings.cpp +++ b/src/strings.cpp @@ -34,9 +34,7 @@ #include "gui.h" #include "strings_func.h" #include "functions.h" -#if defined(TTD_BIG_ENDIAN) #include "core/endian_func.hpp" -#endif /* for opendir/readdir/closedir */ # include "fios.h"