Speed up feature mask setting

Patch from Jonathan Kew.
This commit is contained in:
Behdad Esfahbod 2010-05-21 13:32:38 +01:00
parent 4fa67f34ec
commit e53d77142a
1 changed files with 25 additions and 6 deletions

View File

@ -122,6 +122,7 @@ setup_lookups (hb_face_t *face,
buffer->info[i].mask = 1; buffer->info[i].mask = 1;
unsigned int last_bit_used = 1; unsigned int last_bit_used = 1;
unsigned int global_values = 0;
for (i = 0; i < num_features; i++) for (i = 0; i < num_features; i++)
{ {
unsigned int bits_needed = _hb_bit_storage (features[i].value); unsigned int bits_needed = _hb_bit_storage (features[i].value);
@ -136,15 +137,33 @@ setup_lookups (hb_face_t *face,
&feature_index)) &feature_index))
add_feature (face, table_tag, feature_index, mask, lookups, num_lookups, room_lookups); add_feature (face, table_tag, feature_index, mask, lookups, num_lookups, room_lookups);
/* Turn mask on in the buffer, the über-slow way! */ if (features[i].start == 0 && features[i].end == (unsigned int)-1)
global_values |= value;
else
{
unsigned int start = features[i].start, end = features[i].end;
unsigned int a = 0, b = buffer->len;
while (a < b)
{
unsigned int h = a + ((b - a) / 2);
if (buffer->info[h].cluster < start)
a = h + 1;
else
b = h;
}
unsigned int count = buffer->len; unsigned int count = buffer->len;
for (unsigned int j = 0; j < count; j++) { for (unsigned int j = a; j < count && buffer->info[j].cluster < end; j++)
unsigned int cluster = buffer->info[j].cluster;
if (features[i].start <= cluster && cluster < features[i].end)
buffer->info[j].mask |= value; buffer->info[j].mask |= value;
} }
} }
if (global_values)
{
unsigned int count = buffer->len;
for (unsigned int j = 0; j < count; j++)
buffer->info[j].mask |= global_values;
}
qsort (lookups, *num_lookups, sizeof (lookups[0]), cmp_lookups); qsort (lookups, *num_lookups, sizeof (lookups[0]), cmp_lookups);
if (*num_lookups) if (*num_lookups)