| Index: third_party/harfbuzz-ng/src/hb-open-type-private.hh
|
| diff --git a/third_party/harfbuzz-ng/src/hb-open-type-private.hh b/third_party/harfbuzz-ng/src/hb-open-type-private.hh
|
| index 558103a8ecca2290fc6dca46262cf3f075e241e0..046df976596a8caea3fac16f3ca501a4d664941e 100644
|
| --- a/third_party/harfbuzz-ng/src/hb-open-type-private.hh
|
| +++ b/third_party/harfbuzz-ng/src/hb-open-type-private.hh
|
| @@ -42,36 +42,36 @@ namespace OT {
|
|
|
| /* Cast to struct T, reference to reference */
|
| template<typename Type, typename TObject>
|
| -inline const Type& CastR(const TObject &X)
|
| +static inline const Type& CastR(const TObject &X)
|
| { return reinterpret_cast<const Type&> (X); }
|
| template<typename Type, typename TObject>
|
| -inline Type& CastR(TObject &X)
|
| +static inline Type& CastR(TObject &X)
|
| { return reinterpret_cast<Type&> (X); }
|
|
|
| /* Cast to struct T, pointer to pointer */
|
| template<typename Type, typename TObject>
|
| -inline const Type* CastP(const TObject *X)
|
| +static inline const Type* CastP(const TObject *X)
|
| { return reinterpret_cast<const Type*> (X); }
|
| template<typename Type, typename TObject>
|
| -inline Type* CastP(TObject *X)
|
| +static inline Type* CastP(TObject *X)
|
| { return reinterpret_cast<Type*> (X); }
|
|
|
| /* StructAtOffset<T>(P,Ofs) returns the struct T& that is placed at memory
|
| * location pointed to by P plus Ofs bytes. */
|
| template<typename Type>
|
| -inline const Type& StructAtOffset(const void *P, unsigned int offset)
|
| +static inline const Type& StructAtOffset(const void *P, unsigned int offset)
|
| { return * reinterpret_cast<const Type*> ((const char *) P + offset); }
|
| template<typename Type>
|
| -inline Type& StructAtOffset(void *P, unsigned int offset)
|
| +static inline Type& StructAtOffset(void *P, unsigned int offset)
|
| { return * reinterpret_cast<Type*> ((char *) P + offset); }
|
|
|
| /* StructAfter<T>(X) returns the struct T& that is placed after X.
|
| * Works with X of variable size also. X must implement get_size() */
|
| template<typename Type, typename TObject>
|
| -inline const Type& StructAfter(const TObject &X)
|
| +static inline const Type& StructAfter(const TObject &X)
|
| { return StructAtOffset<Type>(&X, X.get_size()); }
|
| template<typename Type, typename TObject>
|
| -inline Type& StructAfter(TObject &X)
|
| +static inline Type& StructAfter(TObject &X)
|
| { return StructAtOffset<Type>(&X, X.get_size()); }
|
|
|
|
|
| @@ -132,7 +132,7 @@ inline Type& StructAfter(TObject &X)
|
|
|
| /* Global nul-content Null pool. Enlarge as necessary. */
|
| /* TODO This really should be a extern HB_INTERNAL and defined somewhere... */
|
| -static const void *_NullPool[64 / sizeof (void *)];
|
| +static const void *_NullPool[(256+8) / sizeof (void *)];
|
|
|
| /* Generic nul-content Null objects. */
|
| template <typename Type>
|
| @@ -145,7 +145,7 @@ static inline const Type& Null (void) {
|
| #define DEFINE_NULL_DATA(Type, data) \
|
| static const char _Null##Type[sizeof (Type) + 1] = data; /* +1 is for nul-termination in data */ \
|
| template <> \
|
| -inline const Type& Null<Type> (void) { \
|
| +/*static*/ inline const Type& Null<Type> (void) { \
|
| return *CastP<Type> (_Null##Type); \
|
| } /* The following line really exists such that we end in a place needing semicolon */ \
|
| ASSERT_STATIC (Type::min_size + 1 <= sizeof (_Null##Type))
|
| @@ -266,6 +266,15 @@ struct hb_sanitize_context_t
|
| return TRACE_RETURN (this->writable);
|
| }
|
|
|
| + template <typename Type, typename ValueType>
|
| + inline bool try_set (Type *obj, const ValueType &v) {
|
| + if (this->may_edit (obj, obj->static_size)) {
|
| + obj->set (v);
|
| + return true;
|
| + }
|
| + return false;
|
| + }
|
| +
|
| mutable unsigned int debug_depth;
|
| const char *start, *end;
|
| bool writable;
|
| @@ -572,6 +581,7 @@ struct IntType
|
| DEFINE_SIZE_STATIC (Size);
|
| };
|
|
|
| +typedef uint8_t BYTE; /* 8-bit unsigned integer. */
|
| typedef IntType<uint16_t, 2> USHORT; /* 16-bit unsigned integer. */
|
| typedef IntType<int16_t, 2> SHORT; /* 16-bit signed integer. */
|
| typedef IntType<uint32_t, 4> ULONG; /* 32-bit unsigned integer. */
|
| @@ -616,24 +626,17 @@ typedef USHORT GlyphID;
|
|
|
| /* Script/language-system/feature index */
|
| struct Index : USHORT {
|
| - static const unsigned int NOT_FOUND_INDEX = 0xFFFF;
|
| + static const unsigned int NOT_FOUND_INDEX = 0xFFFFu;
|
| };
|
| DEFINE_NULL_DATA (Index, "\xff\xff");
|
|
|
| -/* Offset to a table, same as uint16 (length = 16 bits), Null offset = 0x0000 */
|
| -struct Offset : USHORT
|
| +/* Offset, Null offset = 0 */
|
| +template <typename Type=USHORT>
|
| +struct Offset : Type
|
| {
|
| inline bool is_null (void) const { return 0 == *this; }
|
| public:
|
| - DEFINE_SIZE_STATIC (2);
|
| -};
|
| -
|
| -/* LongOffset to a table, same as uint32 (length = 32 bits), Null offset = 0x00000000 */
|
| -struct LongOffset : ULONG
|
| -{
|
| - inline bool is_null (void) const { return 0 == *this; }
|
| - public:
|
| - DEFINE_SIZE_STATIC (4);
|
| + DEFINE_SIZE_STATIC (sizeof(Type));
|
| };
|
|
|
|
|
| @@ -682,12 +685,12 @@ struct FixedVersion
|
|
|
|
|
| /*
|
| - * Template subclasses of Offset and LongOffset that do the dereferencing.
|
| + * Template subclasses of Offset that do the dereferencing.
|
| * Use: (base+offset)
|
| */
|
|
|
| -template <typename OffsetType, typename Type>
|
| -struct GenericOffsetTo : OffsetType
|
| +template <typename Type, typename OffsetType=USHORT>
|
| +struct OffsetTo : Offset<OffsetType>
|
| {
|
| inline const Type& operator () (const void *base) const
|
| {
|
| @@ -721,40 +724,25 @@ struct GenericOffsetTo : OffsetType
|
| return TRACE_RETURN (likely (obj.sanitize (c, user_data)) || neuter (c));
|
| }
|
|
|
| - inline bool try_set (hb_sanitize_context_t *c, const OffsetType &v) {
|
| - if (c->may_edit (this, this->static_size)) {
|
| - this->set (v);
|
| - return true;
|
| - }
|
| - return false;
|
| - }
|
| /* Set the offset to Null */
|
| inline bool neuter (hb_sanitize_context_t *c) {
|
| - if (c->may_edit (this, this->static_size)) {
|
| - this->set (0); /* 0 is Null offset */
|
| - return true;
|
| - }
|
| - return false;
|
| + return c->try_set (this, 0);
|
| }
|
| + DEFINE_SIZE_STATIC (sizeof(OffsetType));
|
| };
|
| template <typename Base, typename OffsetType, typename Type>
|
| -inline const Type& operator + (const Base &base, const GenericOffsetTo<OffsetType, Type> &offset) { return offset (base); }
|
| +static inline const Type& operator + (const Base &base, const OffsetTo<Type, OffsetType> &offset) { return offset (base); }
|
| template <typename Base, typename OffsetType, typename Type>
|
| -inline Type& operator + (Base &base, GenericOffsetTo<OffsetType, Type> &offset) { return offset (base); }
|
| -
|
| -template <typename Type>
|
| -struct OffsetTo : GenericOffsetTo<Offset, Type> {};
|
| -
|
| -template <typename Type>
|
| -struct LongOffsetTo : GenericOffsetTo<LongOffset, Type> {};
|
| +static inline Type& operator + (Base &base, OffsetTo<Type, OffsetType> &offset) { return offset (base); }
|
|
|
|
|
| /*
|
| * Array Types
|
| */
|
|
|
| -template <typename LenType, typename Type>
|
| -struct GenericArrayOf
|
| +/* An array with a number of elements. */
|
| +template <typename Type, typename LenType=USHORT>
|
| +struct ArrayOf
|
| {
|
| const Type *sub_array (unsigned int start_offset, unsigned int *pcount /* IN/OUT */) const
|
| {
|
| @@ -837,6 +825,16 @@ struct GenericArrayOf
|
| return TRACE_RETURN (true);
|
| }
|
|
|
| + template <typename SearchType>
|
| + inline int lsearch (const SearchType &x) const
|
| + {
|
| + unsigned int count = len;
|
| + for (unsigned int i = 0; i < count; i++)
|
| + if (!this->array[i].cmp (x))
|
| + return i;
|
| + return -1;
|
| + }
|
| +
|
| private:
|
| inline bool sanitize_shallow (hb_sanitize_context_t *c) {
|
| TRACE_SANITIZE (this);
|
| @@ -850,26 +848,10 @@ struct GenericArrayOf
|
| DEFINE_SIZE_ARRAY (sizeof (LenType), array);
|
| };
|
|
|
| -/* An array with a USHORT number of elements. */
|
| -template <typename Type>
|
| -struct ArrayOf : GenericArrayOf<USHORT, Type> {};
|
| -
|
| -/* An array with a ULONG number of elements. */
|
| -template <typename Type>
|
| -struct LongArrayOf : GenericArrayOf<ULONG, Type> {};
|
| -
|
| /* Array of Offset's */
|
| template <typename Type>
|
| struct OffsetArrayOf : ArrayOf<OffsetTo<Type> > {};
|
|
|
| -/* Array of LongOffset's */
|
| -template <typename Type>
|
| -struct LongOffsetArrayOf : ArrayOf<LongOffsetTo<Type> > {};
|
| -
|
| -/* LongArray of LongOffset's */
|
| -template <typename Type>
|
| -struct LongOffsetLongArrayOf : LongArrayOf<LongOffsetTo<Type> > {};
|
| -
|
| /* Array of offsets relative to the beginning of the array itself. */
|
| template <typename Type>
|
| struct OffsetListOf : OffsetArrayOf<Type>
|
| @@ -892,9 +874,8 @@ struct OffsetListOf : OffsetArrayOf<Type>
|
| };
|
|
|
|
|
| -/* An array with a USHORT number of elements,
|
| - * starting at second element. */
|
| -template <typename Type>
|
| +/* An array starting at second element. */
|
| +template <typename Type, typename LenType=USHORT>
|
| struct HeadlessArrayOf
|
| {
|
| inline const Type& operator [] (unsigned int i) const
|
| @@ -941,19 +922,19 @@ struct HeadlessArrayOf
|
| return TRACE_RETURN (true);
|
| }
|
|
|
| - USHORT len;
|
| + LenType len;
|
| Type array[VAR];
|
| public:
|
| - DEFINE_SIZE_ARRAY (sizeof (USHORT), array);
|
| + DEFINE_SIZE_ARRAY (sizeof (LenType), array);
|
| };
|
|
|
|
|
| /* An array with sorted elements. Supports binary searching. */
|
| -template <typename Type>
|
| -struct SortedArrayOf : ArrayOf<Type> {
|
| -
|
| +template <typename Type, typename LenType=USHORT>
|
| +struct SortedArrayOf : ArrayOf<Type, LenType>
|
| +{
|
| template <typename SearchType>
|
| - inline int search (const SearchType &x) const
|
| + inline int bsearch (const SearchType &x) const
|
| {
|
| /* Hand-coded bsearch here since this is in the hot inner loop. */
|
| int min = 0, max = (int) this->len - 1;
|
|
|