Merge remote-tracking branch 'fdo/master'

This commit is contained in:
Behdad Esfahbod 2018-11-28 15:08:01 -05:00
commit 9e4f03b6ed
2 changed files with 31 additions and 31 deletions

View File

@ -363,6 +363,14 @@ struct Lookup
} }
} }
inline typename T::type get_class (hb_codepoint_t glyph_id,
unsigned int num_glyphs,
unsigned int outOfRange) const
{
const T *v = get_value (glyph_id, num_glyphs);
return v ? *v : outOfRange;
}
inline bool sanitize (hb_sanitize_context_t *c) const inline bool sanitize (hb_sanitize_context_t *c) const
{ {
TRACE_SANITIZE (this); TRACE_SANITIZE (this);
@ -480,7 +488,7 @@ struct StateTable
{ {
typedef typename Types::HBUINT HBUINT; typedef typename Types::HBUINT HBUINT;
typedef typename Types::HBUSHORT HBUSHORT; typedef typename Types::HBUSHORT HBUSHORT;
typedef typename Types::ClassType ClassType; typedef typename Types::ClassTypeNarrow ClassType;
enum State enum State
{ {
@ -638,6 +646,7 @@ struct StateTable
DEFINE_SIZE_STATIC (4 * sizeof (HBUINT)); DEFINE_SIZE_STATIC (4 * sizeof (HBUINT));
}; };
template <typename HBUCHAR>
struct ClassTable struct ClassTable
{ {
inline unsigned int get_class (hb_codepoint_t glyph_id, unsigned int outOfRange) const inline unsigned int get_class (hb_codepoint_t glyph_id, unsigned int outOfRange) const
@ -645,6 +654,12 @@ struct ClassTable
unsigned int i = glyph_id - firstGlyph; unsigned int i = glyph_id - firstGlyph;
return i >= classArray.len ? outOfRange : classArray.arrayZ[i]; return i >= classArray.len ? outOfRange : classArray.arrayZ[i];
} }
inline unsigned int get_class (hb_codepoint_t glyph_id,
unsigned int num_glyphs HB_UNUSED,
unsigned int outOfRange) const
{
return get_class (glyph_id, outOfRange);
}
inline bool sanitize (hb_sanitize_context_t *c) const inline bool sanitize (hb_sanitize_context_t *c) const
{ {
TRACE_SANITIZE (this); TRACE_SANITIZE (this);
@ -652,7 +667,7 @@ struct ClassTable
} }
protected: protected:
GlyphID firstGlyph; /* First glyph index included in the trimmed array. */ GlyphID firstGlyph; /* First glyph index included in the trimmed array. */
ArrayOf<HBUINT8> classArray; /* The class codes (indexed by glyph index minus ArrayOf<HBUCHAR> classArray; /* The class codes (indexed by glyph index minus
* firstGlyph). */ * firstGlyph). */
public: public:
DEFINE_SIZE_ARRAY (4, classArray); DEFINE_SIZE_ARRAY (4, classArray);
@ -663,15 +678,9 @@ struct ObsoleteTypes
static const bool extended = false; static const bool extended = false;
typedef HBUINT16 HBUINT; typedef HBUINT16 HBUINT;
typedef HBUINT8 HBUSHORT; typedef HBUINT8 HBUSHORT;
struct ClassType : ClassTable typedef ClassTable<HBUINT8> ClassTypeNarrow;
{ typedef ClassTable<HBUINT16> ClassTypeWide;
inline unsigned int get_class (hb_codepoint_t glyph_id,
unsigned int num_glyphs HB_UNUSED,
unsigned int outOfRange) const
{
return ClassTable::get_class (glyph_id, outOfRange);
}
};
template <typename T> template <typename T>
static inline unsigned int offsetToIndex (unsigned int offset, static inline unsigned int offsetToIndex (unsigned int offset,
const void *base, const void *base,
@ -692,16 +701,9 @@ struct ExtendedTypes
static const bool extended = true; static const bool extended = true;
typedef HBUINT32 HBUINT; typedef HBUINT32 HBUINT;
typedef HBUINT16 HBUSHORT; typedef HBUINT16 HBUSHORT;
struct ClassType : Lookup<HBUINT16> typedef Lookup<HBUINT16> ClassTypeNarrow;
{ typedef Lookup<HBUINT16> ClassTypeWide;
inline unsigned int get_class (hb_codepoint_t glyph_id,
unsigned int num_glyphs,
unsigned int outOfRange) const
{
const HBUINT16 *v = get_value (glyph_id, num_glyphs);
return v ? *v : outOfRange;
}
};
template <typename T> template <typename T>
static inline unsigned int offsetToIndex (unsigned int offset, static inline unsigned int offsetToIndex (unsigned int offset,
const void *base, const void *base,

View File

@ -392,9 +392,13 @@ struct KerxSubTableFormat2
unsigned int num_glyphs = c->sanitizer.get_num_glyphs (); unsigned int num_glyphs = c->sanitizer.get_num_glyphs ();
unsigned int l = (this+leftClassTable).get_class (left, num_glyphs, 0); unsigned int l = (this+leftClassTable).get_class (left, num_glyphs, 0);
unsigned int r = (this+rightClassTable).get_class (right, num_glyphs, 0); unsigned int r = (this+rightClassTable).get_class (right, num_glyphs, 0);
unsigned int offset = l + r;
const FWORD *v = &StructAtOffset<FWORD> (&(this+array), offset); const UnsizedArrayOf<FWORD> &arrayZ = this+array;
unsigned int kern_idx = l + r;
kern_idx = Types::offsetToIndex (kern_idx, this, &arrayZ);
const FWORD *v = &arrayZ[kern_idx];
if (unlikely (!v->sanitize (&c->sanitizer))) return 0; if (unlikely (!v->sanitize (&c->sanitizer))) return 0;
return kerxTupleKern (*v, header.tuple_count (), this, c); return kerxTupleKern (*v, header.tuple_count (), this, c);
} }
@ -437,19 +441,13 @@ struct KerxSubTableFormat2
c->check_range (this, array))); c->check_range (this, array)));
} }
/* Note:
* OT kern table specifies ClassTable as having 16-bit entries, whereas
* AAT kern table specifies them as having 8bit entries.
* I've not seen any fonts with this format in kern table.
* We follow AAT. */
protected: protected:
KernSubTableHeader header; KernSubTableHeader header;
HBUINT rowWidth; /* The width, in bytes, of a row in the table. */ HBUINT rowWidth; /* The width, in bytes, of a row in the table. */
OffsetTo<typename Types::ClassType, HBUINT, false> OffsetTo<typename Types::ClassTypeWide, HBUINT, false>
leftClassTable; /* Offset from beginning of this subtable to leftClassTable; /* Offset from beginning of this subtable to
* left-hand class table. */ * left-hand class table. */
OffsetTo<typename Types::ClassType, HBUINT, false> OffsetTo<typename Types::ClassTypeWide, HBUINT, false>
rightClassTable;/* Offset from beginning of this subtable to rightClassTable;/* Offset from beginning of this subtable to
* right-hand class table. */ * right-hand class table. */
OffsetTo<UnsizedArrayOf<FWORD>, HBUINT, false> OffsetTo<UnsizedArrayOf<FWORD>, HBUINT, false>