[apply] Use a context object to reduce number of parameters passed around

This commit is contained in:
Behdad Esfahbod 2010-04-29 02:19:21 -04:00
parent 173fde7087
commit 1376fb7bf9
4 changed files with 53 additions and 44 deletions

View File

@ -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)

View File

@ -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];
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;
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);
}

View File

@ -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);
}

View File

@ -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;