|
|
|
@ -267,14 +267,22 @@ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
FT_LOCAL_DEF( void ) |
|
|
|
|
af_sort_widths( FT_UInt count, |
|
|
|
|
AF_Width table ) |
|
|
|
|
af_sort_and_quantize_widths( FT_UInt* count, |
|
|
|
|
AF_Width table, |
|
|
|
|
FT_Pos threshold ) |
|
|
|
|
{ |
|
|
|
|
FT_UInt i, j; |
|
|
|
|
FT_UInt cur_idx; |
|
|
|
|
FT_Pos cur_val; |
|
|
|
|
FT_Pos sum; |
|
|
|
|
AF_WidthRec swap; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for ( i = 1; i < count; i++ ) |
|
|
|
|
if ( *count == 1 ) |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
/* sort */ |
|
|
|
|
for ( i = 1; i < *count; i++ ) |
|
|
|
|
{ |
|
|
|
|
for ( j = i; j > 0; j-- ) |
|
|
|
|
{ |
|
|
|
@ -286,6 +294,51 @@ |
|
|
|
|
table[j - 1] = swap; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
cur_idx = 0; |
|
|
|
|
cur_val = table[cur_idx].org; |
|
|
|
|
|
|
|
|
|
/* compute and use mean values for clusters not larger than */ |
|
|
|
|
/* `threshold'; this is very primitive and might not yield */ |
|
|
|
|
/* the best result, but normally, using reference character */ |
|
|
|
|
/* `o', `*count' is 2, so the code below is fully sufficient */ |
|
|
|
|
for ( i = 1; i < *count; i++ ) |
|
|
|
|
{ |
|
|
|
|
if ( table[i].org - cur_val > threshold || |
|
|
|
|
i == *count - 1 ) |
|
|
|
|
{ |
|
|
|
|
sum = 0; |
|
|
|
|
|
|
|
|
|
/* fix loop for end of array */ |
|
|
|
|
if ( table[i].org - cur_val <= threshold && |
|
|
|
|
i == *count - 1 ) |
|
|
|
|
i++; |
|
|
|
|
|
|
|
|
|
for ( j = cur_idx; j < i; j++ ) |
|
|
|
|
{ |
|
|
|
|
sum += table[j].org; |
|
|
|
|
table[j].org = 0; |
|
|
|
|
} |
|
|
|
|
table[cur_idx].org = sum / j; |
|
|
|
|
|
|
|
|
|
if ( i < *count - 1 ) |
|
|
|
|
{ |
|
|
|
|
cur_idx = i + 1; |
|
|
|
|
cur_val = table[cur_idx].org; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
cur_idx = 1; |
|
|
|
|
|
|
|
|
|
/* compress array to remove zero values */ |
|
|
|
|
for ( i = 1; i < *count; i++ ) |
|
|
|
|
{ |
|
|
|
|
if ( table[i].org ) |
|
|
|
|
table[cur_idx++] = table[i]; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
*count = cur_idx; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|