From 1376fb7bf9ef07970f0ba13dc64d6a8ab8252762 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 29 Apr 2010 02:19:21 -0400 Subject: [PATCH] [apply] Use a context object to reduce number of parameters passed around --- src/hb-open-type-private.hh | 5 ++--- src/hb-ot-layout-gpos-private.hh | 26 ++++++++++++++----------- src/hb-ot-layout-gsub-private.hh | 37 +++++++++++++++++++----------------- src/hb-ot-layout-gsubgpos-private.hh | 29 +++++++++++++++------------- 4 files changed, 53 insertions(+), 44 deletions(-) diff --git a/src/hb-open-type-private.hh b/src/hb-open-type-private.hh index 1b33183..a062aff 100644 --- a/src/hb-open-type-private.hh +++ b/src/hb-open-type-private.hh @@ -138,15 +138,14 @@ ASSERT_STATIC (sizeof (Type) + 1 <= sizeof (_Null##Type)) context, \ (HB_DEBUG_SANITIZE ? sanitize_depth + 1 : 0) - -typedef struct _hb_sanitize_context_t hb_sanitize_context_t; -struct _hb_sanitize_context_t +struct hb_sanitize_context_t { const char *start, *end; hb_bool_t writable; unsigned int edit_count; }; + static HB_GNUC_UNUSED void _hb_sanitize_init (hb_sanitize_context_t *context, hb_blob_t *blob) diff --git a/src/hb-ot-layout-gpos-private.hh b/src/hb-ot-layout-gpos-private.hh index fe6ac63..4bfa89f 100644 --- a/src/hb-ot-layout-gpos-private.hh +++ b/src/hb-ot-layout-gpos-private.hh @@ -566,7 +566,7 @@ struct PairPosFormat1 return false; unsigned int j = buffer->in_pos + 1; - while (_hb_ot_layout_skip_mark (context->face, IN_INFO (j), lookup_flag, NULL)) + while (_hb_ot_layout_skip_mark (context->face, IN_INFO (j), apply_context->lookup_flag, NULL)) { if (HB_UNLIKELY (j == end)) return false; @@ -658,7 +658,7 @@ struct PairPosFormat2 return false; unsigned int j = buffer->in_pos + 1; - while (_hb_ot_layout_skip_mark (context->face, IN_INFO (j), lookup_flag, NULL)) + while (_hb_ot_layout_skip_mark (context->face, IN_INFO (j), apply_context->lookup_flag, NULL)) { if (HB_UNLIKELY (j == end)) return false; @@ -913,7 +913,7 @@ struct CursivePosFormat1 gpi->last = HB_OT_LAYOUT_GPOS_NO_LAST; /* We don't handle mark glyphs here. */ - if (property == HB_OT_LAYOUT_GLYPH_CLASS_MARK) + if (apply_context->property == HB_OT_LAYOUT_GLYPH_CLASS_MARK) return false; unsigned int index = (this+coverage) (IN_CURGLYPH ()); @@ -941,7 +941,7 @@ struct CursivePosFormat1 POSITION (last_pos)->x_advance = gpi->anchor_x - entry_x; } - if (lookup_flag & LookupFlag::RightToLeft) + if (apply_context->lookup_flag & LookupFlag::RightToLeft) { POSITION (last_pos)->cursive_chain = last_pos - buffer->in_pos; POSITION (last_pos)->y_offset = entry_y - gpi->anchor_y; @@ -1028,6 +1028,7 @@ struct MarkBasePosFormat1 return false; /* now we search backwards for a non-mark glyph */ + unsigned int property; unsigned int j = buffer->in_pos; do { @@ -1127,6 +1128,7 @@ struct MarkLigPosFormat1 return false; /* now we search backwards for a non-mark glyph */ + unsigned int property; unsigned int j = buffer->in_pos; do { @@ -1243,13 +1245,14 @@ struct MarkMarkPosFormat1 return false; /* now we search backwards for a suitable mark glyph until a non-mark glyph */ + unsigned int property; unsigned int j = buffer->in_pos; do { if (HB_UNLIKELY (!j)) return false; j--; - } while (_hb_ot_layout_skip_mark (context->face, IN_INFO (j), lookup_flag, &property)); + } while (_hb_ot_layout_skip_mark (context->face, IN_INFO (j), apply_context->lookup_flag, &property)); if (!(property & HB_OT_LAYOUT_GLYPH_CLASS_MARK)) return false; @@ -1454,10 +1457,12 @@ struct PosLookup : Lookup unsigned int apply_depth) const { unsigned int lookup_type = get_type (); - unsigned int lookup_flag = get_flag (); - unsigned int property; + hb_apply_context_t apply_context[1]; + + apply_context->nesting_level_left = nesting_level_left; + apply_context->lookup_flag = get_flag (); - if (!_hb_ot_layout_check_glyph_property (context->face, IN_CURINFO (), lookup_flag, &property)) + if (!_hb_ot_layout_check_glyph_property (context->face, IN_CURINFO (), apply_context->lookup_flag, &apply_context->property)) return false; for (unsigned int i = 0; i < get_subtable_count (); i++) @@ -1562,14 +1567,13 @@ static inline bool position_lookup (APPLY_ARG_DEF, unsigned int lookup_index) const GPOS &gpos = *(context->face->ot_layout.gpos); const PosLookup &l = gpos.get_lookup (lookup_index); - if (HB_UNLIKELY (nesting_level_left == 0)) + if (HB_UNLIKELY (apply_context->nesting_level_left == 0)) return false; - nesting_level_left--; if (HB_UNLIKELY (context_length < 1)) return false; - return l.apply_once (context, buffer, context_length, nesting_level_left, apply_depth); + return l.apply_once (context, buffer, context_length, apply_context->nesting_level_left - 1, apply_depth + 1); } diff --git a/src/hb-ot-layout-gsub-private.hh b/src/hb-ot-layout-gsub-private.hh index 9940eba..f3b3e83 100644 --- a/src/hb-ot-layout-gsub-private.hh +++ b/src/hb-ot-layout-gsub-private.hh @@ -49,7 +49,7 @@ struct SingleSubstFormat1 /* We inherit the old glyph class to the substituted glyph */ if (_hb_ot_layout_has_new_glyph_classes (context->face)) - _hb_ot_layout_set_glyph_property (context->face, glyph_id, property); + _hb_ot_layout_set_glyph_property (context->face, glyph_id, apply_context->property); return true; } @@ -91,7 +91,7 @@ struct SingleSubstFormat2 /* We inherit the old glyph class to the substituted glyph */ if (_hb_ot_layout_has_new_glyph_classes (context->face)) - _hb_ot_layout_set_glyph_property (context->face, glyph_id, property); + _hb_ot_layout_set_glyph_property (context->face, glyph_id, apply_context->property); return true; } @@ -165,6 +165,7 @@ struct Sequence /* This is a guess only ... */ if (_hb_ot_layout_has_new_glyph_classes (context->face)) { + unsigned int property = apply_context->property; if (property == HB_OT_LAYOUT_GLYPH_CLASS_LIGATURE) property = HB_OT_LAYOUT_GLYPH_CLASS_BASE_GLYPH; @@ -295,7 +296,7 @@ struct AlternateSubstFormat1 /* We inherit the old glyph class to the substituted glyph */ if (_hb_ot_layout_has_new_glyph_classes (context->face)) - _hb_ot_layout_set_glyph_property (context->face, glyph_id, property); + _hb_ot_layout_set_glyph_property (context->face, glyph_id, apply_context->property); return true; } @@ -364,7 +365,8 @@ struct Ligature for (i = 1, j = buffer->in_pos + 1; i < count; i++, j++) { - while (_hb_ot_layout_skip_mark (context->face, IN_INFO (j), lookup_flag, &property)) + unsigned int property; + while (_hb_ot_layout_skip_mark (context->face, IN_INFO (j), apply_context->lookup_flag, &property)) { if (HB_UNLIKELY (j + count - i == end)) return false; @@ -405,7 +407,7 @@ struct Ligature for ( i = 1; i < count; i++ ) { - while (_hb_ot_layout_skip_mark (context->face, IN_CURINFO (), lookup_flag, NULL)) + while (_hb_ot_layout_skip_mark (context->face, IN_CURINFO (), apply_context->lookup_flag, NULL)) _hb_buffer_add_output_glyph (buffer, IN_CURGLYPH (), i, lig_id); (buffer->in_pos)++; @@ -472,7 +474,7 @@ struct LigatureSubstFormat1 TRACE_APPLY (); hb_codepoint_t glyph_id = IN_CURGLYPH (); - bool first_is_mark = !!(property & HB_OT_LAYOUT_GLYPH_CLASS_MARK); + bool first_is_mark = !!(apply_context->property & HB_OT_LAYOUT_GLYPH_CLASS_MARK); unsigned int index = (this+coverage) (glyph_id); if (HB_LIKELY (index == NOT_COVERED)) @@ -757,17 +759,19 @@ struct SubstLookup : Lookup } - inline bool apply_once (hb_ot_layout_context_t *context, - hb_buffer_t *buffer, - unsigned int context_length, - unsigned int nesting_level_left, - unsigned int apply_depth) const + inline bool apply_once ( hb_ot_layout_context_t *context, + hb_buffer_t *buffer, + unsigned int context_length, + unsigned int nesting_level_left, + unsigned int apply_depth) const { unsigned int lookup_type = get_type (); - unsigned int lookup_flag = get_flag (); - unsigned int property; + hb_apply_context_t apply_context[1]; - if (!_hb_ot_layout_check_glyph_property (context->face, IN_CURINFO (), lookup_flag, &property)) + apply_context->nesting_level_left = nesting_level_left; + apply_context->lookup_flag = get_flag (); + + if (!_hb_ot_layout_check_glyph_property (context->face, IN_CURINFO (), apply_context->lookup_flag, &apply_context->property)) return false; if (HB_UNLIKELY (lookup_type == SubstLookupSubTable::Extension)) @@ -906,14 +910,13 @@ static inline bool substitute_lookup (APPLY_ARG_DEF, unsigned int lookup_index) const GSUB &gsub = *(context->face->ot_layout.gsub); const SubstLookup &l = gsub.get_lookup (lookup_index); - if (HB_UNLIKELY (nesting_level_left == 0)) + if (HB_UNLIKELY (apply_context->nesting_level_left == 0)) return false; - nesting_level_left--; if (HB_UNLIKELY (context_length < 1)) return false; - return l.apply_once (context, buffer, context_length, nesting_level_left, apply_depth); + return l.apply_once (context, buffer, context_length, apply_context->nesting_level_left - 1, apply_depth + 1); } diff --git a/src/hb-ot-layout-gsubgpos-private.hh b/src/hb-ot-layout-gsubgpos-private.hh index d27cd80..c317e54 100644 --- a/src/hb-ot-layout-gsubgpos-private.hh +++ b/src/hb-ot-layout-gsubgpos-private.hh @@ -43,22 +43,25 @@ #define APPLY_ARG_DEF \ + hb_apply_context_t *apply_context, \ hb_ot_layout_context_t *context, \ - hb_buffer_t *buffer, \ - unsigned int context_length HB_GNUC_UNUSED, \ - unsigned int nesting_level_left HB_GNUC_UNUSED, \ - unsigned int lookup_flag HB_GNUC_UNUSED, \ - unsigned int property HB_GNUC_UNUSED, /* propety of first glyph */ \ - unsigned int apply_depth HB_GNUC_UNUSED + hb_buffer_t *buffer, \ + unsigned int context_length HB_GNUC_UNUSED, \ + unsigned int apply_depth HB_GNUC_UNUSED #define APPLY_ARG \ + apply_context, \ context, \ buffer, \ context_length, \ - nesting_level_left, \ - lookup_flag, \ - property, \ (HB_DEBUG_APPLY ? apply_depth + 1 : 0) +struct hb_apply_context_t +{ + unsigned int nesting_level_left; + unsigned int lookup_flag; + unsigned int property; /* propety of first glyph (TODO remove) */ +}; + typedef bool (*match_func_t) (hb_codepoint_t glyph_id, const USHORT &value, const char *data); typedef bool (*apply_lookup_func_t) (APPLY_ARG_DEF, unsigned int lookup_index); @@ -102,7 +105,7 @@ static inline bool match_input (APPLY_ARG_DEF, for (i = 1, j = buffer->in_pos + 1; i < count; i++, j++) { - while (_hb_ot_layout_skip_mark (context->face, IN_INFO (j), lookup_flag, NULL)) + while (_hb_ot_layout_skip_mark (context->face, IN_INFO (j), apply_context->lookup_flag, NULL)) { if (HB_UNLIKELY (j + count - i == end)) return false; @@ -129,7 +132,7 @@ static inline bool match_backtrack (APPLY_ARG_DEF, for (unsigned int i = 0, j = buffer->out_pos - 1; i < count; i++, j--) { - while (_hb_ot_layout_skip_mark (context->face, OUT_INFO (j), lookup_flag, NULL)) + while (_hb_ot_layout_skip_mark (context->face, OUT_INFO (j), apply_context->lookup_flag, NULL)) { if (HB_UNLIKELY (j + 1 == count - i)) return false; @@ -157,7 +160,7 @@ static inline bool match_lookahead (APPLY_ARG_DEF, for (i = 0, j = buffer->in_pos + offset; i < count; i++, j++) { - while (_hb_ot_layout_skip_mark (context->face, OUT_INFO (j), lookup_flag, NULL)) + while (_hb_ot_layout_skip_mark (context->face, OUT_INFO (j), apply_context->lookup_flag, NULL)) { if (HB_UNLIKELY (j + count - i == end)) return false; @@ -207,7 +210,7 @@ static inline bool apply_lookup (APPLY_ARG_DEF, */ for (unsigned int i = 0; i < count; /* NOP */) { - while (_hb_ot_layout_skip_mark (context->face, IN_CURINFO (), lookup_flag, NULL)) + while (_hb_ot_layout_skip_mark (context->face, IN_CURINFO (), apply_context->lookup_flag, NULL)) { if (HB_UNLIKELY (buffer->in_pos == end)) return true; -- 2.7.4