bytes.h
上传用户:center1979
上传日期:2022-07-26
资源大小:50633k
文件大小:2k
源码类别:

OpenGL

开发平台:

Visual C++

  1. // bytes.h
  2. // 
  3. // Copyright (C) 2001, Colin Walters <walters@verbum.org>
  4. //
  5. // This program is free software; you can redistribute it and/or
  6. // modify it under the terms of the GNU General Public License
  7. // as published by the Free Software Foundation; either version 2
  8. // of the License, or (at your option) any later version.
  9. #ifndef _BYTES_H_
  10. #define _BYTES_H_
  11. #ifndef _WIN32
  12. #ifndef TARGET_OS_MAC
  13. #include <config.h>
  14. #endif /* TARGET_OS_MAC */
  15. #endif /* _WIN32 */
  16. #include <celutil/util.h>
  17. /* Use the system byteswap.h definitions if we have them */
  18. #ifdef HAVE_BYTESWAP_H
  19. #include <byteswap.h>
  20. #else
  21. static unsigned short bswap_16 (unsigned short val)
  22. {
  23.   return ((((val) >> 8) & 0xff) | (((val) & 0xff) << 8));
  24. }
  25. static unsigned int bswap_32(unsigned int val) {
  26.   return (((val) & 0xff000000) >> 24) | (((val) & 0x00ff0000) >>  8) |
  27.     (((val) & 0x0000ff00) <<  8) | (((val) & 0x000000ff) << 24);
  28. }
  29. #endif
  30. inline double bswap_double(double d)
  31. {
  32.     COMPILE_TIME_ASSERT(sizeof(double) == 8)
  33.     union DoubleBytes
  34.     {
  35.         char bytes[8];
  36.         double d;
  37.     };
  38.     DoubleBytes db;
  39.     db.d = d;
  40.     char c;
  41.     c = db.bytes[0]; db.bytes[0] = db.bytes[7]; db.bytes[7] = c;
  42.     c = db.bytes[1]; db.bytes[1] = db.bytes[6]; db.bytes[6] = c;
  43.     c = db.bytes[2]; db.bytes[2] = db.bytes[5]; db.bytes[5] = c;
  44.     c = db.bytes[3]; db.bytes[3] = db.bytes[4]; db.bytes[4] = c;
  45.     return db.d;
  46. }
  47. #define SWAP_FLOAT(x, y) do { *(unsigned int *)&x = bswap_32( *(unsigned int *)&y ); } while (0)
  48. #if defined(WORDS_BIGENDIAN) || defined(__BIG_ENDIAN__)
  49. #define LE_TO_CPU_INT16(ret, val) (ret = bswap_16(val))
  50. #define LE_TO_CPU_INT32(ret, val) (ret = bswap_32(val))
  51. #define LE_TO_CPU_FLOAT(ret, val) SWAP_FLOAT(ret, val)
  52. #define LE_TO_CPU_DOUBLE(ret, val) (ret = bswap_double(d))
  53. #define BE_TO_CPU_INT16(ret, val) (ret = val)
  54. #define BE_TO_CPU_INT32(ret, val) (ret = val)
  55. #define BE_TO_CPU_FLOAT(ret, val) (ret = val)
  56. #define BE_TO_CPU_DOUBLE(ret, val) (ret = val)
  57. #else
  58. #define BE_TO_CPU_INT16(ret, val) (ret = bswap_16(val))
  59. #define BE_TO_CPU_INT32(ret, val) (ret = bswap_32(val))
  60. #define BE_TO_CPU_FLOAT(ret, val) SWAP_FLOAT(ret, val)
  61. #define BE_TO_CPU_DOUBLE(ret, val) (ret = bswap_double(d))
  62. #define LE_TO_CPU_INT16(ret, val) (ret = val)
  63. #define LE_TO_CPU_INT32(ret, val) (ret = val)
  64. #define LE_TO_CPU_FLOAT(ret, val) (ret = val)
  65. #define LE_TO_CPU_DOUBLE(ret, val) (ret = val)
  66. #endif
  67. #endif // _BYTES_H_