1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/gfx/skia/trunk/include/core/SkEndian.h Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,195 @@ 1.4 + 1.5 +/* 1.6 + * Copyright 2006 The Android Open Source Project 1.7 + * 1.8 + * Use of this source code is governed by a BSD-style license that can be 1.9 + * found in the LICENSE file. 1.10 + */ 1.11 + 1.12 + 1.13 +#ifndef SkEndian_DEFINED 1.14 +#define SkEndian_DEFINED 1.15 + 1.16 +#include "SkTypes.h" 1.17 + 1.18 +/** \file SkEndian.h 1.19 + 1.20 + Macros and helper functions for handling 16 and 32 bit values in 1.21 + big and little endian formats. 1.22 +*/ 1.23 + 1.24 +#if defined(SK_CPU_LENDIAN) && defined(SK_CPU_BENDIAN) 1.25 + #error "can't have both LENDIAN and BENDIAN defined" 1.26 +#endif 1.27 + 1.28 +#if !defined(SK_CPU_LENDIAN) && !defined(SK_CPU_BENDIAN) 1.29 + #error "need either LENDIAN or BENDIAN defined" 1.30 +#endif 1.31 + 1.32 +/** Swap the two bytes in the low 16bits of the parameters. 1.33 + e.g. 0x1234 -> 0x3412 1.34 +*/ 1.35 +static inline uint16_t SkEndianSwap16(U16CPU value) { 1.36 + SkASSERT(value == (uint16_t)value); 1.37 + return static_cast<uint16_t>((value >> 8) | (value << 8)); 1.38 +} 1.39 +template<uint16_t N> struct SkTEndianSwap16 { 1.40 + static const uint16_t value = static_cast<uint16_t>((N >> 8) | ((N & 0xFF) << 8)); 1.41 +}; 1.42 + 1.43 +/** Vector version of SkEndianSwap16(), which swaps the 1.44 + low two bytes of each value in the array. 1.45 +*/ 1.46 +static inline void SkEndianSwap16s(uint16_t array[], int count) { 1.47 + SkASSERT(count == 0 || array != NULL); 1.48 + 1.49 + while (--count >= 0) { 1.50 + *array = SkEndianSwap16(*array); 1.51 + array += 1; 1.52 + } 1.53 +} 1.54 + 1.55 +/** Reverse all 4 bytes in a 32bit value. 1.56 + e.g. 0x12345678 -> 0x78563412 1.57 +*/ 1.58 +static inline uint32_t SkEndianSwap32(uint32_t value) { 1.59 + return ((value & 0xFF) << 24) | 1.60 + ((value & 0xFF00) << 8) | 1.61 + ((value & 0xFF0000) >> 8) | 1.62 + (value >> 24); 1.63 +} 1.64 +template<uint32_t N> struct SkTEndianSwap32 { 1.65 + static const uint32_t value = ((N & 0xFF) << 24) | 1.66 + ((N & 0xFF00) << 8) | 1.67 + ((N & 0xFF0000) >> 8) | 1.68 + (N >> 24); 1.69 +}; 1.70 + 1.71 +/** Vector version of SkEndianSwap32(), which swaps the 1.72 + bytes of each value in the array. 1.73 +*/ 1.74 +static inline void SkEndianSwap32s(uint32_t array[], int count) { 1.75 + SkASSERT(count == 0 || array != NULL); 1.76 + 1.77 + while (--count >= 0) { 1.78 + *array = SkEndianSwap32(*array); 1.79 + array += 1; 1.80 + } 1.81 +} 1.82 + 1.83 +/** Reverse all 8 bytes in a 64bit value. 1.84 + e.g. 0x1122334455667788 -> 0x8877665544332211 1.85 +*/ 1.86 +static inline uint64_t SkEndianSwap64(uint64_t value) { 1.87 + return (((value & 0x00000000000000FFULL) << (8*7)) | 1.88 + ((value & 0x000000000000FF00ULL) << (8*5)) | 1.89 + ((value & 0x0000000000FF0000ULL) << (8*3)) | 1.90 + ((value & 0x00000000FF000000ULL) << (8*1)) | 1.91 + ((value & 0x000000FF00000000ULL) >> (8*1)) | 1.92 + ((value & 0x0000FF0000000000ULL) >> (8*3)) | 1.93 + ((value & 0x00FF000000000000ULL) >> (8*5)) | 1.94 + ((value) >> (8*7))); 1.95 +} 1.96 +template<uint64_t N> struct SkTEndianSwap64 { 1.97 + static const uint64_t value = (((N & 0x00000000000000FFULL) << (8*7)) | 1.98 + ((N & 0x000000000000FF00ULL) << (8*5)) | 1.99 + ((N & 0x0000000000FF0000ULL) << (8*3)) | 1.100 + ((N & 0x00000000FF000000ULL) << (8*1)) | 1.101 + ((N & 0x000000FF00000000ULL) >> (8*1)) | 1.102 + ((N & 0x0000FF0000000000ULL) >> (8*3)) | 1.103 + ((N & 0x00FF000000000000ULL) >> (8*5)) | 1.104 + ((N) >> (8*7))); 1.105 +}; 1.106 + 1.107 +/** Vector version of SkEndianSwap64(), which swaps the 1.108 + bytes of each value in the array. 1.109 +*/ 1.110 +static inline void SkEndianSwap64s(uint64_t array[], int count) { 1.111 + SkASSERT(count == 0 || array != NULL); 1.112 + 1.113 + while (--count >= 0) { 1.114 + *array = SkEndianSwap64(*array); 1.115 + array += 1; 1.116 + } 1.117 +} 1.118 + 1.119 +#ifdef SK_CPU_LENDIAN 1.120 + #define SkEndian_SwapBE16(n) SkEndianSwap16(n) 1.121 + #define SkEndian_SwapBE32(n) SkEndianSwap32(n) 1.122 + #define SkEndian_SwapBE64(n) SkEndianSwap64(n) 1.123 + #define SkEndian_SwapLE16(n) (n) 1.124 + #define SkEndian_SwapLE32(n) (n) 1.125 + #define SkEndian_SwapLE64(n) (n) 1.126 + 1.127 + #define SkTEndian_SwapBE16(n) SkTEndianSwap16<n>::value 1.128 + #define SkTEndian_SwapBE32(n) SkTEndianSwap32<n>::value 1.129 + #define SkTEndian_SwapBE64(n) SkTEndianSwap64<n>::value 1.130 + #define SkTEndian_SwapLE16(n) (n) 1.131 + #define SkTEndian_SwapLE32(n) (n) 1.132 + #define SkTEndian_SwapLE64(n) (n) 1.133 +#else // SK_CPU_BENDIAN 1.134 + #define SkEndian_SwapBE16(n) (n) 1.135 + #define SkEndian_SwapBE32(n) (n) 1.136 + #define SkEndian_SwapBE64(n) (n) 1.137 + #define SkEndian_SwapLE16(n) SkEndianSwap16(n) 1.138 + #define SkEndian_SwapLE32(n) SkEndianSwap32(n) 1.139 + #define SkEndian_SwapLE64(n) SkEndianSwap64(n) 1.140 + 1.141 + #define SkTEndian_SwapBE16(n) (n) 1.142 + #define SkTEndian_SwapBE32(n) (n) 1.143 + #define SkTEndian_SwapBE64(n) (n) 1.144 + #define SkTEndian_SwapLE16(n) SkTEndianSwap16<n>::value 1.145 + #define SkTEndian_SwapLE32(n) SkTEndianSwap32<n>::value 1.146 + #define SkTEndian_SwapLE64(n) SkTEndianSwap64<n>::value 1.147 +#endif 1.148 + 1.149 +// When a bytestream is embedded in a 32-bit word, how far we need to 1.150 +// shift the word to extract each byte from the low 8 bits by anding with 0xff. 1.151 +#ifdef SK_CPU_LENDIAN 1.152 + #define SkEndian_Byte0Shift 0 1.153 + #define SkEndian_Byte1Shift 8 1.154 + #define SkEndian_Byte2Shift 16 1.155 + #define SkEndian_Byte3Shift 24 1.156 +#else // SK_CPU_BENDIAN 1.157 + #define SkEndian_Byte0Shift 24 1.158 + #define SkEndian_Byte1Shift 16 1.159 + #define SkEndian_Byte2Shift 8 1.160 + #define SkEndian_Byte3Shift 0 1.161 +#endif 1.162 + 1.163 + 1.164 +#if defined(SK_UINT8_BITFIELD_LENDIAN) && defined(SK_UINT8_BITFIELD_BENDIAN) 1.165 + #error "can't have both bitfield LENDIAN and BENDIAN defined" 1.166 +#endif 1.167 + 1.168 +#if !defined(SK_UINT8_BITFIELD_LENDIAN) && !defined(SK_UINT8_BITFIELD_BENDIAN) 1.169 + #ifdef SK_CPU_LENDIAN 1.170 + #define SK_UINT8_BITFIELD_LENDIAN 1.171 + #else 1.172 + #define SK_UINT8_BITFIELD_BENDIAN 1.173 + #endif 1.174 +#endif 1.175 + 1.176 +#ifdef SK_UINT8_BITFIELD_LENDIAN 1.177 + #define SK_UINT8_BITFIELD(f0, f1, f2, f3, f4, f5, f6, f7) \ 1.178 + SK_OT_BYTE f0 : 1; \ 1.179 + SK_OT_BYTE f1 : 1; \ 1.180 + SK_OT_BYTE f2 : 1; \ 1.181 + SK_OT_BYTE f3 : 1; \ 1.182 + SK_OT_BYTE f4 : 1; \ 1.183 + SK_OT_BYTE f5 : 1; \ 1.184 + SK_OT_BYTE f6 : 1; \ 1.185 + SK_OT_BYTE f7 : 1; 1.186 +#else 1.187 + #define SK_UINT8_BITFIELD(f0, f1, f2, f3, f4, f5, f6, f7) \ 1.188 + SK_OT_BYTE f7 : 1; \ 1.189 + SK_OT_BYTE f6 : 1; \ 1.190 + SK_OT_BYTE f5 : 1; \ 1.191 + SK_OT_BYTE f4 : 1; \ 1.192 + SK_OT_BYTE f3 : 1; \ 1.193 + SK_OT_BYTE f2 : 1; \ 1.194 + SK_OT_BYTE f1 : 1; \ 1.195 + SK_OT_BYTE f0 : 1; 1.196 +#endif 1.197 + 1.198 +#endif