* Make reverse charmap lookup a binary search

* Style fixes
This commit is contained in:
Craig White 2023-06-25 23:43:23 -04:00
parent 62378cca3a
commit 37e3e348b5
2 changed files with 38 additions and 16 deletions

View File

@ -4,7 +4,7 @@
#include <freetype/internal/ftmemory.h>
#include <freetype/internal/ftdebug.h>
#define AF_ADJUSTMENT_DATABASE_LENGTH (sizeof(adjustment_database)/sizeof(adjustment_database[0]))
#define AF_ADJUSTMENT_DATABASE_LENGTH ( sizeof(adjustment_database)/sizeof(adjustment_database[0]) )
#undef FT_COMPONENT
#define FT_COMPONENT afadjust
@ -38,15 +38,22 @@ adjustment_database[] =
FT_LOCAL_DEF( const AF_AdjustmentDatabaseEntry* )
af_adjustment_database_lookup( FT_UInt32 codepoint ) {
/* Binary search for database entry */
FT_UInt low = 0;
FT_UInt high = AF_ADJUSTMENT_DATABASE_LENGTH - 1;
while (high > low) {
FT_UInt mid = (low + high) / 2;
if (adjustment_database[mid].codepoint < codepoint) {
FT_Int low = 0;
FT_Int high = AF_ADJUSTMENT_DATABASE_LENGTH - 1;
while ( high > low )
{
FT_Int mid = ( low + high ) / 2;
FT_UInt32 mid_codepoint = adjustment_database[mid].codepoint;
if ( mid_codepoint < codepoint )
{
low = mid + 1;
} else if (adjustment_database[mid].codepoint > codepoint) {
}
else if ( mid_codepoint > codepoint )
{
high = mid - 1;
} else {
}
else
{
return &adjustment_database[mid];
}
}
@ -77,19 +84,31 @@ typedef struct AF_ReverseCharacterMap_
AF_ReverseMapEntry *entries;
} AF_ReverseCharacterMap_Rec;
FT_LOCAL_DEF(FT_UInt32)
FT_LOCAL_DEF( FT_UInt32 )
af_reverse_character_map_lookup( AF_ReverseCharacterMap map, FT_Int glyph_index )
{
if ( map == NULL )
{
return 0;
}
for ( FT_UInt entry = 0; entry < map->length; entry++ )
/* Binary search for reverse character map entry */
FT_Int low = 0;
FT_Int high = map->length - 1;
while ( high > low )
{
if ( map->entries[entry].glyph_index == glyph_index )
FT_Int mid = ( high + low ) / 2;
FT_Int mid_glyph_index = map->entries[mid].glyph_index;
if ( glyph_index < mid_glyph_index )
{
return map->entries[entry].codepoint;
high = mid - 1;
}
else if ( glyph_index > mid_glyph_index )
{
low = mid + 1;
}
else
{
return map->entries[mid].codepoint;
}
}
@ -131,7 +150,7 @@ af_reverse_character_map_new( FT_Face face, AF_ReverseCharacterMap *map, FT_Memo
FT_Int capacity = 10;
FT_Int size = 0;
if ( FT_NEW_ARRAY((*map)->entries, capacity) )
if ( FT_NEW_ARRAY( ( *map )->entries, capacity) )
{
goto Exit;
}

View File

@ -2832,7 +2832,8 @@ af_glyph_hints_apply_vertical_separation_adjustments( AF_GlyphHints hints,
}
FT_TRACE4(( " Pushing top contour %d units up\n", adjustment_amount ));
if ( adjustment_amount > 0 ) {
if ( adjustment_amount > 0 )
{
AF_Point point = hints->contours[highest_contour];
AF_Point first_point = point;
if ( point != NULL )
@ -2844,7 +2845,9 @@ af_glyph_hints_apply_vertical_separation_adjustments( AF_GlyphHints hints,
} while ( point != first_point );
}
}
} else {
}
else
{
FT_TRACE4(( "af_glyph_hints_apply_vertical_separation_adjustments: No vertical adjustment needed\n" ));
}
}