diff -uprw /home/otaylor/cvs/gnome2/pango-head/pango/opentype/ftxopen.c ./opentype-munge/ftxopen.c --- /home/otaylor/cvs/gnome2/pango-head/pango/opentype/ftxopen.c 2003-07-25 12:59:44.000000000 -0400 +++ ./opentype-munge/ftxopen.c 2003-07-25 12:55:55.000000000 -0400 @@ -892,44 +889,34 @@ FT_UShort glyphID, FT_UShort* index ) { - FT_UShort min, max, new_min, new_max, middle; - - FT_UShort* array = cf1->GlyphArray; - + FT_UShort *min, *max, *middle; /* binary search */ - new_min = 0; - new_max = cf1->GlyphCount - 1; + min = cf1->GlyphArray; + max = min + cf1->GlyphCount - 1; do { - min = new_min; - max = new_max; - /* we use (min + max) / 2 = max - (max - min) / 2 to avoid overflow and rounding errors */ middle = max - ( ( max - min ) >> 1 ); - if ( glyphID == array[middle] ) + if ( glyphID == *middle ) { - *index = middle; + *index = middle - cf1->GlyphArray; return TT_Err_Ok; } - else if ( glyphID < array[middle] ) + else if ( glyphID < *middle ) { - if ( middle == min ) - break; - new_max = middle - 1; + max = middle - 1; } else { - if ( middle == max ) - break; - new_min = middle + 1; + min = middle + 1; } - } while ( min < max ); + } while ( min <= max ); return TTO_Err_Not_Covered; } @@ -939,44 +926,35 @@ FT_UShort glyphID, FT_UShort* index ) { - FT_UShort min, max, new_min, new_max, middle; - - TTO_RangeRecord* rr = cf2->RangeRecord; - + TTO_RangeRecord* min, *max, *middle; /* binary search */ - new_min = 0; - new_max = cf2->RangeCount - 1; + min = cf2->RangeRecord; + max = min + cf2->RangeCount - 1; do { - min = new_min; - max = new_max; /* we use (min + max) / 2 = max - (max - min) / 2 to avoid overflow and rounding errors */ middle = max - ( ( max - min ) >> 1 ); - if ( glyphID >= rr[middle].Start && glyphID <= rr[middle].End ) + if ( glyphID >= middle->Start && glyphID <= middle->End ) { - *index = rr[middle].StartCoverageIndex + glyphID - rr[middle].Start; + *index = middle->StartCoverageIndex + glyphID - middle->Start; return TT_Err_Ok; } - else if ( glyphID < rr[middle].Start ) + else if ( glyphID < middle->Start ) { - if ( middle == min ) - break; - new_max = middle - 1; + max = middle - 1; } else { - if ( middle == max ) - break; - new_min = middle + 1; + min = middle + 1; } - } while ( min < max ); + } while ( min <= max ); return TTO_Err_Not_Covered; } @@ -1277,22 +1240,20 @@ FT_UShort* class, FT_UShort* index ) { - FT_Error error = TT_Err_Ok; - FT_UShort min, max, new_min, new_max, middle; + FT_Error error = TTO_Err_Not_Covered; + int min, max, middle; TTO_ClassRangeRecord* crr = cdf2->ClassRangeRecord; + *class = 0; /* binary search */ - new_min = 0; - new_max = cdf2->ClassRangeCount - 1; + min = 0; + max = cdf2->ClassRangeCount - 1; do { - min = new_min; - max = new_max; - /* we use (min + max) / 2 = max - (max - min) / 2 to avoid overflow and rounding errors */ @@ -1301,31 +1262,19 @@ if ( glyphID >= crr[middle].Start && glyphID <= crr[middle].End ) { *class = crr[middle].Class; - error = TT_Err_Ok; - break; + return TT_Err_Ok; } else if ( glyphID < crr[middle].Start ) { - if ( middle == min ) - { - *class = 0; - error = TTO_Err_Not_Covered; - break; - } - new_max = middle - 1; + max = middle - 1; } else { - if ( middle == max ) - { - *class = 0; - error = TTO_Err_Not_Covered; - break; + min = middle + 1; } - new_min = middle + 1; - } - } while ( min < max ); + } while ( min <= max ); + *class = 0; if ( index ) *index = middle;