parent
78fc43f293
commit
17f0cfa7ea
|
@ -144,94 +144,6 @@ static inline Type& StructAfter(TObject &X)
|
||||||
DEFINE_SIZE_ARRAY(size, array)
|
DEFINE_SIZE_ARRAY(size, array)
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Big-endian integers.
|
|
||||||
*/
|
|
||||||
|
|
||||||
template <typename Type, int Bytes> struct BEInt;
|
|
||||||
|
|
||||||
template <typename Type>
|
|
||||||
struct BEInt<Type, 1>
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
BEInt<Type, 1>& operator = (Type V)
|
|
||||||
{
|
|
||||||
v = V;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
operator Type () const { return v; }
|
|
||||||
private: uint8_t v;
|
|
||||||
};
|
|
||||||
template <typename Type>
|
|
||||||
struct BEInt<Type, 2>
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
BEInt<Type, 2>& operator = (Type V)
|
|
||||||
{
|
|
||||||
v[0] = (V >> 8) & 0xFF;
|
|
||||||
v[1] = (V ) & 0xFF;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
operator Type () const
|
|
||||||
{
|
|
||||||
#if ((defined(__GNUC__) && __GNUC__ >= 5) || defined(__clang__)) && \
|
|
||||||
defined(__BYTE_ORDER) && \
|
|
||||||
(__BYTE_ORDER == __LITTLE_ENDIAN || __BYTE_ORDER == __BIG_ENDIAN)
|
|
||||||
/* Spoon-feed the compiler a big-endian integer with alignment 1.
|
|
||||||
* https://github.com/harfbuzz/harfbuzz/pull/1398 */
|
|
||||||
struct __attribute__((packed)) packed_uint16_t { uint16_t v; };
|
|
||||||
#if __BYTE_ORDER == __LITTLE_ENDIAN
|
|
||||||
return __builtin_bswap16 (((packed_uint16_t *) this)->v);
|
|
||||||
#else /* __BYTE_ORDER == __BIG_ENDIAN */
|
|
||||||
return ((packed_uint16_t *) this)->v;
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
return (v[0] << 8)
|
|
||||||
+ (v[1] );
|
|
||||||
}
|
|
||||||
private: uint8_t v[2];
|
|
||||||
};
|
|
||||||
template <typename Type>
|
|
||||||
struct BEInt<Type, 3>
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
BEInt<Type, 3>& operator = (Type V)
|
|
||||||
{
|
|
||||||
v[0] = (V >> 16) & 0xFF;
|
|
||||||
v[1] = (V >> 8) & 0xFF;
|
|
||||||
v[2] = (V ) & 0xFF;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
operator Type () const
|
|
||||||
{
|
|
||||||
return (v[0] << 16)
|
|
||||||
+ (v[1] << 8)
|
|
||||||
+ (v[2] );
|
|
||||||
}
|
|
||||||
private: uint8_t v[3];
|
|
||||||
};
|
|
||||||
template <typename Type>
|
|
||||||
struct BEInt<Type, 4>
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
BEInt<Type, 4>& operator = (Type V)
|
|
||||||
{
|
|
||||||
v[0] = (V >> 24) & 0xFF;
|
|
||||||
v[1] = (V >> 16) & 0xFF;
|
|
||||||
v[2] = (V >> 8) & 0xFF;
|
|
||||||
v[3] = (V ) & 0xFF;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
operator Type () const
|
|
||||||
{
|
|
||||||
return (v[0] << 24)
|
|
||||||
+ (v[1] << 16)
|
|
||||||
+ (v[2] << 8)
|
|
||||||
+ (v[3] );
|
|
||||||
}
|
|
||||||
private: uint8_t v[4];
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Lazy loaders.
|
* Lazy loaders.
|
||||||
|
|
89
src/hb.hh
89
src/hb.hh
|
@ -553,6 +553,95 @@ _hb_memalign(void **memptr, size_t alignment, size_t size)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Big-endian integers. Here because fundamental.
|
||||||
|
*/
|
||||||
|
|
||||||
|
template <typename Type, int Bytes> struct BEInt;
|
||||||
|
|
||||||
|
template <typename Type>
|
||||||
|
struct BEInt<Type, 1>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
BEInt<Type, 1>& operator = (Type V)
|
||||||
|
{
|
||||||
|
v = V;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
operator Type () const { return v; }
|
||||||
|
private: uint8_t v;
|
||||||
|
};
|
||||||
|
template <typename Type>
|
||||||
|
struct BEInt<Type, 2>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
BEInt<Type, 2>& operator = (Type V)
|
||||||
|
{
|
||||||
|
v[0] = (V >> 8) & 0xFF;
|
||||||
|
v[1] = (V ) & 0xFF;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
operator Type () const
|
||||||
|
{
|
||||||
|
#if ((defined(__GNUC__) && __GNUC__ >= 5) || defined(__clang__)) && \
|
||||||
|
defined(__BYTE_ORDER) && \
|
||||||
|
(__BYTE_ORDER == __LITTLE_ENDIAN || __BYTE_ORDER == __BIG_ENDIAN)
|
||||||
|
/* Spoon-feed the compiler a big-endian integer with alignment 1.
|
||||||
|
* https://github.com/harfbuzz/harfbuzz/pull/1398 */
|
||||||
|
struct __attribute__((packed)) packed_uint16_t { uint16_t v; };
|
||||||
|
#if __BYTE_ORDER == __LITTLE_ENDIAN
|
||||||
|
return __builtin_bswap16 (((packed_uint16_t *) this)->v);
|
||||||
|
#else /* __BYTE_ORDER == __BIG_ENDIAN */
|
||||||
|
return ((packed_uint16_t *) this)->v;
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
return (v[0] << 8)
|
||||||
|
+ (v[1] );
|
||||||
|
}
|
||||||
|
private: uint8_t v[2];
|
||||||
|
};
|
||||||
|
template <typename Type>
|
||||||
|
struct BEInt<Type, 3>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
BEInt<Type, 3>& operator = (Type V)
|
||||||
|
{
|
||||||
|
v[0] = (V >> 16) & 0xFF;
|
||||||
|
v[1] = (V >> 8) & 0xFF;
|
||||||
|
v[2] = (V ) & 0xFF;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
operator Type () const
|
||||||
|
{
|
||||||
|
return (v[0] << 16)
|
||||||
|
+ (v[1] << 8)
|
||||||
|
+ (v[2] );
|
||||||
|
}
|
||||||
|
private: uint8_t v[3];
|
||||||
|
};
|
||||||
|
template <typename Type>
|
||||||
|
struct BEInt<Type, 4>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
BEInt<Type, 4>& operator = (Type V)
|
||||||
|
{
|
||||||
|
v[0] = (V >> 24) & 0xFF;
|
||||||
|
v[1] = (V >> 16) & 0xFF;
|
||||||
|
v[2] = (V >> 8) & 0xFF;
|
||||||
|
v[3] = (V ) & 0xFF;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
operator Type () const
|
||||||
|
{
|
||||||
|
return (v[0] << 24)
|
||||||
|
+ (v[1] << 16)
|
||||||
|
+ (v[2] << 8)
|
||||||
|
+ (v[3] );
|
||||||
|
}
|
||||||
|
private: uint8_t v[4];
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* For lack of a better place, put Zawgyi script hack here.
|
* For lack of a better place, put Zawgyi script hack here.
|
||||||
* https://github.com/harfbuzz/harfbuzz/issues/1162
|
* https://github.com/harfbuzz/harfbuzz/issues/1162
|
||||||
|
|
Loading…
Reference in New Issue