From 3087046d3144afb50bcc13e4afa2d20d9f71f2c8 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 31 Oct 2018 14:59:14 -0700 Subject: [PATCH] [mort] Refactor offset-to-index mapping --- src/hb-aat-layout-morx-table.hh | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/src/hb-aat-layout-morx-table.hh b/src/hb-aat-layout-morx-table.hh index 45dbc28..396457c 100644 --- a/src/hb-aat-layout-morx-table.hh +++ b/src/hb-aat-layout-morx-table.hh @@ -457,6 +457,14 @@ struct LigatureSubtable ligature (table+table->ligature), match_length (0) {} + template + static inline unsigned int offsetToIndex (unsigned int offset, + const void *base, + const T *array) + { + return (offset - ((const char *) array - (const char *) base)) / sizeof (T); + } + inline bool is_actionable (StateTableDriver *driver HB_UNUSED, const Entry *entry) { @@ -497,9 +505,9 @@ struct LigatureSubtable return false; // TODO Work on previous instead? unsigned int cursor = match_length; - const HBUINT32 *actionData = Types::extended ? - &ligAction[action_idx] : - &StructAtOffset (table, action_idx); + if (!Types::extended) + action_idx = offsetToIndex (action_idx, table, ligAction.arrayZ); + const HBUINT32 *actionData = &ligAction[action_idx]; do { if (unlikely (!cursor)) @@ -522,11 +530,8 @@ struct LigatureSubtable int32_t offset = (int32_t) uoffset; unsigned int component_idx = buffer->cur().codepoint + offset; if (!Types::extended) - component_idx *= 2; - - const HBUINT16 &componentData = Types::extended ? - component[component_idx] : - StructAtOffset (table, component_idx); + component_idx = offsetToIndex (component_idx * 2, table, component.arrayZ); + const HBUINT16 &componentData = component[component_idx]; if (unlikely (!componentData.sanitize (&c->sanitizer))) return false; ligature_idx += componentData; @@ -535,9 +540,9 @@ struct LigatureSubtable bool (action & LigActionLast)); if (action & (LigActionStore | LigActionLast)) { - const GlyphID &ligatureData = Types::extended ? - ligature[ligature_idx] : - StructAtOffset (table, ligature_idx); + if (!Types::extended) + ligature_idx = offsetToIndex (ligature_idx, table, ligature.arrayZ); + const GlyphID &ligatureData = ligature[ligature_idx]; if (unlikely (!ligatureData.sanitize (&c->sanitizer))) return false; hb_codepoint_t lig = ligatureData; -- 2.7.4