зеркало из https://github.com/mozilla/gecko-dev.git
bug 701637 - clean up mark-skipping loops in gsub/gpos code. r=behdad
This commit is contained in:
Родитель
9316570c37
Коммит
7056934aed
|
@ -621,21 +621,21 @@ struct PairPosFormat1
|
||||||
inline bool apply (hb_apply_context_t *c) const
|
inline bool apply (hb_apply_context_t *c) const
|
||||||
{
|
{
|
||||||
TRACE_APPLY ();
|
TRACE_APPLY ();
|
||||||
unsigned int end = MIN (c->buffer->len, c->buffer->i + c->context_length);
|
unsigned int j = c->buffer->i;
|
||||||
if (unlikely (c->buffer->i + 2 > end))
|
unsigned int end = MIN (c->buffer->len, j + c->context_length);
|
||||||
|
if (unlikely (j >= end))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
unsigned int index = (this+coverage) (c->buffer->info[c->buffer->i].codepoint);
|
unsigned int index = (this+coverage) (c->buffer->info[j].codepoint);
|
||||||
if (likely (index == NOT_COVERED))
|
if (likely (index == NOT_COVERED))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
unsigned int j = c->buffer->i + 1;
|
do
|
||||||
while (_hb_ot_layout_skip_mark (c->layout->face, &c->buffer->info[j], c->lookup_props, NULL))
|
|
||||||
{
|
{
|
||||||
if (unlikely (j == end))
|
|
||||||
return false;
|
|
||||||
j++;
|
j++;
|
||||||
}
|
if (unlikely (j == end))
|
||||||
|
return false;
|
||||||
|
} while (_hb_ot_layout_skip_mark (c->layout->face, &c->buffer->info[j], c->lookup_props, NULL));
|
||||||
|
|
||||||
return (this+pairSet[index]).apply (c, &valueFormat1, j);
|
return (this+pairSet[index]).apply (c, &valueFormat1, j);
|
||||||
}
|
}
|
||||||
|
@ -683,21 +683,21 @@ struct PairPosFormat2
|
||||||
inline bool apply (hb_apply_context_t *c) const
|
inline bool apply (hb_apply_context_t *c) const
|
||||||
{
|
{
|
||||||
TRACE_APPLY ();
|
TRACE_APPLY ();
|
||||||
unsigned int end = MIN (c->buffer->len, c->buffer->i + c->context_length);
|
unsigned int j = c->buffer->i;
|
||||||
if (unlikely (c->buffer->i + 2 > end))
|
unsigned int end = MIN (c->buffer->len, j + c->context_length);
|
||||||
|
if (unlikely (j >= end))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
unsigned int index = (this+coverage) (c->buffer->info[c->buffer->i].codepoint);
|
unsigned int index = (this+coverage) (c->buffer->info[j].codepoint);
|
||||||
if (likely (index == NOT_COVERED))
|
if (likely (index == NOT_COVERED))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
unsigned int j = c->buffer->i + 1;
|
do
|
||||||
while (_hb_ot_layout_skip_mark (c->layout->face, &c->buffer->info[j], c->lookup_props, NULL))
|
|
||||||
{
|
{
|
||||||
|
j++;
|
||||||
if (unlikely (j == end))
|
if (unlikely (j == end))
|
||||||
return false;
|
return false;
|
||||||
j++;
|
} while (_hb_ot_layout_skip_mark (c->layout->face, &c->buffer->info[j], c->lookup_props, NULL));
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int len1 = valueFormat1.get_len ();
|
unsigned int len1 = valueFormat1.get_len ();
|
||||||
unsigned int len2 = valueFormat2.get_len ();
|
unsigned int len2 = valueFormat2.get_len ();
|
||||||
|
@ -836,21 +836,21 @@ struct CursivePosFormat1
|
||||||
if (c->property & HB_OT_LAYOUT_GLYPH_CLASS_MARK)
|
if (c->property & HB_OT_LAYOUT_GLYPH_CLASS_MARK)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
unsigned int end = MIN (c->buffer->len, c->buffer->i + c->context_length);
|
unsigned int j = c->buffer->i;
|
||||||
if (unlikely (c->buffer->i + 2 > end))
|
unsigned int end = MIN (c->buffer->len, j + c->context_length);
|
||||||
|
if (unlikely (j >= end))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
const EntryExitRecord &this_record = entryExitRecord[(this+coverage) (c->buffer->info[c->buffer->i].codepoint)];
|
const EntryExitRecord &this_record = entryExitRecord[(this+coverage) (c->buffer->info[j].codepoint)];
|
||||||
if (!this_record.exitAnchor)
|
if (!this_record.exitAnchor)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
unsigned int j = c->buffer->i + 1;
|
do
|
||||||
while (_hb_ot_layout_skip_mark (c->layout->face, &c->buffer->info[j], c->lookup_props, NULL))
|
|
||||||
{
|
{
|
||||||
|
j++;
|
||||||
if (unlikely (j == end))
|
if (unlikely (j == end))
|
||||||
return false;
|
return false;
|
||||||
j++;
|
} while (_hb_ot_layout_skip_mark (c->layout->face, &c->buffer->info[j], c->lookup_props, NULL));
|
||||||
}
|
|
||||||
|
|
||||||
const EntryExitRecord &next_record = entryExitRecord[(this+coverage) (c->buffer->info[j].codepoint)];
|
const EntryExitRecord &next_record = entryExitRecord[(this+coverage) (c->buffer->info[j].codepoint)];
|
||||||
if (!next_record.entryAnchor)
|
if (!next_record.entryAnchor)
|
||||||
|
|
|
@ -342,24 +342,25 @@ struct Ligature
|
||||||
inline bool apply (hb_apply_context_t *c) const
|
inline bool apply (hb_apply_context_t *c) const
|
||||||
{
|
{
|
||||||
TRACE_APPLY ();
|
TRACE_APPLY ();
|
||||||
unsigned int i, j;
|
unsigned int i;
|
||||||
|
unsigned int j = c->buffer->i;
|
||||||
unsigned int count = component.len;
|
unsigned int count = component.len;
|
||||||
unsigned int end = MIN (c->buffer->len, c->buffer->i + c->context_length);
|
unsigned int end = MIN (c->buffer->len, j + c->context_length);
|
||||||
if (unlikely (c->buffer->i + count > end))
|
if (unlikely (j >= end))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
bool first_was_mark = (c->property & HB_OT_LAYOUT_GLYPH_CLASS_MARK);
|
bool first_was_mark = (c->property & HB_OT_LAYOUT_GLYPH_CLASS_MARK);
|
||||||
bool found_non_mark = false;
|
bool found_non_mark = false;
|
||||||
|
|
||||||
for (i = 1, j = c->buffer->i + 1; i < count; i++, j++)
|
for (i = 1; i < count; i++)
|
||||||
{
|
{
|
||||||
unsigned int property;
|
unsigned int property;
|
||||||
while (_hb_ot_layout_skip_mark (c->layout->face, &c->buffer->info[j], c->lookup_props, &property))
|
do
|
||||||
{
|
{
|
||||||
if (unlikely (j + count - i == end))
|
|
||||||
return false;
|
|
||||||
j++;
|
j++;
|
||||||
}
|
if (unlikely (j == end))
|
||||||
|
return false;
|
||||||
|
} while (_hb_ot_layout_skip_mark (c->layout->face, &c->buffer->info[j], c->lookup_props, &property));
|
||||||
|
|
||||||
found_non_mark |= !(property & HB_OT_LAYOUT_GLYPH_CLASS_MARK);
|
found_non_mark |= !(property & HB_OT_LAYOUT_GLYPH_CLASS_MARK);
|
||||||
|
|
||||||
|
|
|
@ -126,25 +126,26 @@ static inline bool match_input (hb_apply_context_t *c,
|
||||||
const void *match_data,
|
const void *match_data,
|
||||||
unsigned int *context_length_out)
|
unsigned int *context_length_out)
|
||||||
{
|
{
|
||||||
unsigned int i, j;
|
unsigned int i;
|
||||||
unsigned int end = MIN (c->buffer->len, c->buffer->i + c->context_length);
|
unsigned int j = c->buffer->i;
|
||||||
if (unlikely (c->buffer->i + count > end))
|
unsigned int end = MIN (c->buffer->len, j + c->context_length);
|
||||||
|
if (unlikely (j + count > end))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
for (i = 1, j = c->buffer->i + 1; i < count; i++, j++)
|
for (i = 1; i < count; i++)
|
||||||
{
|
{
|
||||||
while (_hb_ot_layout_skip_mark (c->layout->face, &c->buffer->info[j], c->lookup_props, NULL))
|
do
|
||||||
{
|
{
|
||||||
if (unlikely (j + count - i == end))
|
|
||||||
return false;
|
|
||||||
j++;
|
j++;
|
||||||
}
|
if (unlikely (j >= end))
|
||||||
|
return false;
|
||||||
|
} while (_hb_ot_layout_skip_mark (c->layout->face, &c->buffer->info[j], c->lookup_props, NULL));
|
||||||
|
|
||||||
if (likely (!match_func (c->buffer->info[j].codepoint, input[i - 1], match_data)))
|
if (likely (!match_func (c->buffer->info[j].codepoint, input[i - 1], match_data)))
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
*context_length_out = j - c->buffer->i;
|
*context_length_out = j - c->buffer->i + 1;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -155,17 +156,16 @@ static inline bool match_backtrack (hb_apply_context_t *c,
|
||||||
match_func_t match_func,
|
match_func_t match_func,
|
||||||
const void *match_data)
|
const void *match_data)
|
||||||
{
|
{
|
||||||
if (unlikely (c->buffer->backtrack_len () < count))
|
unsigned int j = c->buffer->backtrack_len ();
|
||||||
return false;
|
|
||||||
|
|
||||||
for (unsigned int i = 0, j = c->buffer->backtrack_len () - 1; i < count; i++, j--)
|
for (unsigned int i = 0; i < count; i++)
|
||||||
{
|
{
|
||||||
while (_hb_ot_layout_skip_mark (c->layout->face, &c->buffer->out_info[j], c->lookup_props, NULL))
|
do
|
||||||
{
|
{
|
||||||
if (unlikely (j + 1 == count - i))
|
if (unlikely (!j))
|
||||||
return false;
|
return false;
|
||||||
j--;
|
j--;
|
||||||
}
|
} while (_hb_ot_layout_skip_mark (c->layout->face, &c->buffer->out_info[j], c->lookup_props, NULL));
|
||||||
|
|
||||||
if (likely (!match_func (c->buffer->out_info[j].codepoint, backtrack[i], match_data)))
|
if (likely (!match_func (c->buffer->out_info[j].codepoint, backtrack[i], match_data)))
|
||||||
return false;
|
return false;
|
||||||
|
@ -181,19 +181,18 @@ static inline bool match_lookahead (hb_apply_context_t *c,
|
||||||
const void *match_data,
|
const void *match_data,
|
||||||
unsigned int offset)
|
unsigned int offset)
|
||||||
{
|
{
|
||||||
unsigned int i, j;
|
unsigned int i;
|
||||||
|
unsigned int j = c->buffer->i + offset - 1;
|
||||||
unsigned int end = MIN (c->buffer->len, c->buffer->i + c->context_length);
|
unsigned int end = MIN (c->buffer->len, c->buffer->i + c->context_length);
|
||||||
if (unlikely (c->buffer->i + offset + count > end))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
for (i = 0, j = c->buffer->i + offset; i < count; i++, j++)
|
for (i = 0; i < count; i++)
|
||||||
{
|
{
|
||||||
while (_hb_ot_layout_skip_mark (c->layout->face, &c->buffer->info[j], c->lookup_props, NULL))
|
do
|
||||||
{
|
{
|
||||||
if (unlikely (j + count - i == end))
|
|
||||||
return false;
|
|
||||||
j++;
|
j++;
|
||||||
}
|
if (unlikely (j >= end))
|
||||||
|
return false;
|
||||||
|
} while (_hb_ot_layout_skip_mark (c->layout->face, &c->buffer->info[j], c->lookup_props, NULL));
|
||||||
|
|
||||||
if (likely (!match_func (c->buffer->info[j].codepoint, lookahead[i], match_data)))
|
if (likely (!match_func (c->buffer->info[j].codepoint, lookahead[i], match_data)))
|
||||||
return false;
|
return false;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче