Merge remote-tracking branch 'fdo/master'
This commit is contained in:
commit
9e4f03b6ed
|
@ -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,
|
||||||
|
|
|
@ -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>
|
||||||
|
|
Loading…
Reference in New Issue