summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBehdad Esfahbod <behdad@behdad.org>2010-04-29 02:19:21 -0400
committerBehdad Esfahbod <behdad@behdad.org>2010-04-29 02:19:21 -0400
commit1376fb7bf9ef07970f0ba13dc64d6a8ab8252762 (patch)
tree4ee124edbc533a64789b6ba1b823e19886c1fb72
parent173fde7087c0db3e99409f1119530477c14072f5 (diff)
[apply] Use a context object to reduce number of parameters passed around
-rw-r--r--src/hb-open-type-private.hh5
-rw-r--r--src/hb-ot-layout-gpos-private.hh26
-rw-r--r--src/hb-ot-layout-gsub-private.hh37
-rw-r--r--src/hb-ot-layout-gsubgpos-private.hh29
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;