inline unsigned int get_class (hb_codepoint_t glyph_id, unsigned int num_glyphs) const
{
if (unlikely (glyph_id == DELETED_GLYPH)) return CLASS_DELETED_GLYPH;
- const HBUINT16 *v = (this+classTable).get_value (glyph_id, num_glyphs);
- return v ? (unsigned) *v : (unsigned) CLASS_OUT_OF_BOUNDS;
+ return (this+classTable).get_class (glyph_id, num_glyphs);
}
inline const Entry<Extra> *get_entries () const
{
if (unlikely (klass >= nClasses)) return nullptr;
- const HBUINT16 *states = (this+stateArrayTable).arrayZ;
+ const HBUSHORT *states = (this+stateArrayTable).arrayZ;
const Entry<Extra> *entries = (this+entryTable).arrayZ;
unsigned int entry = states[state * nClasses + klass];
if (unlikely (!(c->check_struct (this) &&
classTable.sanitize (c, this)))) return_trace (false);
- const HBUINT16 *states = (this+stateArrayTable).arrayZ;
+ const HBUSHORT *states = (this+stateArrayTable).arrayZ;
const Entry<Extra> *entries = (this+entryTable).arrayZ;
unsigned int num_classes = nClasses;
if ((c->max_ops -= num_states - state) < 0)
return_trace (false);
{ /* Sweep new states. */
- const HBUINT16 *stop = &states[num_states * num_classes];
- for (const HBUINT16 *p = &states[state * num_classes]; p < stop; p++)
+ const HBUSHORT *stop = &states[num_states * num_classes];
+ for (const HBUSHORT *p = &states[state * num_classes]; p < stop; p++)
num_entries = MAX<unsigned int> (num_entries, *p + 1);
state = num_states;
}
* mort/morx/kerx/trak
*/
-// static inline const AAT::mort&
-// _get_mort (hb_face_t *face, hb_blob_t **blob = nullptr)
-// {
-// if (unlikely (!hb_ot_shaper_face_data_ensure (face)))
-// {
-// if (blob)
-// *blob = hb_blob_get_empty ();
-// return Null(AAT::mort);
-// }
-// const AAT::morx& mort = *(hb_ot_face_data (face)->mort.get ());
-// if (blob)
-// *blob = hb_ot_face_data (face)->mort.get_blob ();
-// return mort;
-// }
+static inline const AAT::mort&
+_get_mort (hb_face_t *face, hb_blob_t **blob = nullptr)
+{
+ if (unlikely (!hb_ot_shaper_face_data_ensure (face)))
+ {
+ if (blob)
+ *blob = hb_blob_get_empty ();
+ return Null(AAT::mort);
+ }
+ const AAT::mort& mort = *(hb_ot_face_data (face)->mort.get ());
+ if (blob)
+ *blob = hb_ot_face_data (face)->mort.get_blob ();
+ return mort;
+}
static inline const AAT::morx&
_get_morx (hb_face_t *face, hb_blob_t **blob = nullptr)
{
hb_bool_t
hb_aat_layout_has_substitution (hb_face_t *face)
{
- return _get_morx (face).has_data ();
+ return _get_morx (face).has_data () ||
+ _get_mort (face).has_data ();
}
void
hb_buffer_t *buffer)
{
hb_blob_t *blob;
+
const AAT::morx& morx = _get_morx (font->face, &blob);
+ if (morx.has_data ())
+ {
+ AAT::hb_aat_apply_context_t c (plan, font, buffer, blob);
+ morx.apply (&c);
+ return;
+ }
- AAT::hb_aat_apply_context_t c (plan, font, buffer, blob);
- morx.apply (&c);
+ const AAT::mort& mort = _get_mort (font->face, &blob);
+ if (mort.has_data ())
+ {
+ AAT::hb_aat_apply_context_t c (plan, font, buffer, blob);
+ mort.apply (&c);
+ return;
+ }
}