[HB] ChainContext complete

IranNastaliq renders perfectly again!
This commit is contained in:
Behdad Esfahbod 2009-05-18 03:56:39 -04:00
parent e072c24e79
commit d0ba055700
1 changed files with 55 additions and 26 deletions

View File

@ -71,28 +71,6 @@ static inline bool match_coverage (hb_codepoint_t glyph_id, const USHORT &value,
}
static inline bool match_backtrack (LOOKUP_ARGS_DEF,
unsigned int count,
const USHORT backtrack[],
match_func_t match_func,
char *match_data)
{
unsigned int i, j;
for (i = 0, j = buffer->out_pos - 1; i < count; i++, j--) {
while (!_hb_ot_layout_check_glyph_property (layout, OUT_ITEM (j), lookup_flag, &property)) {
if (HB_UNLIKELY (j + 1 == count - i))
return false;
j--;
}
if (HB_LIKELY (match_func (OUT_GLYPH(j), backtrack[i], match_data)))
return false;
}
return true;
}
static inline bool match_input (LOOKUP_ARGS_DEF,
unsigned int count, /* Including the first glyph (not matched) */
const USHORT input[], /* Array of input values--start with second glyph */
@ -112,12 +90,56 @@ static inline bool match_input (LOOKUP_ARGS_DEF,
j++;
}
if (HB_LIKELY (match_func (IN_GLYPH(j), input[i - 1], match_data)))
if (HB_LIKELY (!match_func (IN_GLYPH(j), input[i - 1], match_data)))
return false;
}
/* XXX right? or j - buffer_inpos? */
*context_length_out = count;
*context_length_out = j - buffer->in_pos;
return true;
}
static inline bool match_backtrack (LOOKUP_ARGS_DEF,
unsigned int count,
const USHORT backtrack[],
match_func_t match_func,
char *match_data)
{
unsigned int i, j;
for (i = 0, j = buffer->out_pos - 1; i < count; i++, j--) {
while (!_hb_ot_layout_check_glyph_property (layout, OUT_ITEM (j), lookup_flag, &property)) {
if (HB_UNLIKELY (j + 1 == count - i))
return false;
j--;
}
if (HB_LIKELY (!match_func (OUT_GLYPH(j), backtrack[i], match_data)))
return false;
}
return true;
}
static inline bool match_lookahead (LOOKUP_ARGS_DEF,
unsigned int count,
const USHORT lookahead[],
match_func_t match_func,
char *match_data,
unsigned int offset)
{
unsigned int i, j;
for (i = 0, j = buffer->in_pos + offset; i < count; i++, j++) {
while (!_hb_ot_layout_check_glyph_property (layout, OUT_ITEM (j), lookup_flag, &property)) {
if (HB_UNLIKELY (j + count - i == buffer->in_length))
return false;
j++;
}
if (HB_LIKELY (!match_func (IN_GLYPH(j), lookahead[i], match_data)))
return false;
}
return true;
}
@ -406,13 +428,20 @@ static inline bool chain_context_lookup (LOOKUP_ARGS_DEF,
buffer->in_pos + inputCount + lookaheadCount > buffer->in_length))
return false;
unsigned int offset;
return match_backtrack (LOOKUP_ARGS,
backtrackCount, backtrack,
context.funcs.match, context.match_data[0]) &&
match_input (LOOKUP_ARGS,
inputCount, input,
context.funcs.match, context.match_data[1],
&context_length) &&
&offset) &&
(context_length -= offset, true) &&
match_lookahead (LOOKUP_ARGS,
lookaheadCount, lookahead,
context.funcs.match, context.match_data[2],
offset) &&
(context_length = offset, true) &&
apply_lookup (LOOKUP_ARGS,
inputCount,
lookupCount, lookupRecord,