/* compare two kerning pairs, for sorting */ static int compare_kern_pairs( const void* a, const void* b ) { TT_Kern_0_Pair* pair1 = (TT_Kern_0_Pair*)a; TT_Kern_0_Pair* pair2 = (TT_Kern_0_Pair*)b; TT_ULong index1 = KERN_INDEX( pair1->left, pair1->right ); TT_ULong index2 = KERN_INDEX( pair2->left, pair2->right ); return ( index1 < index2 ? -1 : ( index1 > index2 ? 1 : 0 )); }
compare_kern_pairs( const void* a, const void* b ) { AFM_KernPair pair1 = (AFM_KernPair)a; AFM_KernPair pair2 = (AFM_KernPair)b; FT_ULong index1 = KERN_INDEX( pair1->index1, pair1->index2 ); FT_ULong index2 = KERN_INDEX( pair2->index1, pair2->index2 ); return (int)( index1 - index2 ); }
compare_kern_pairs( const void* a, const void* b ) { T1_Kern_Pair* pair1 = (T1_Kern_Pair*)a; T1_Kern_Pair* pair2 = (T1_Kern_Pair*)b; FT_ULong index1 = KERN_INDEX( pair1->glyph1, pair1->glyph2 ); FT_ULong index2 = KERN_INDEX( pair2->glyph1, pair2->glyph2 ); return (int)( index1 - index2 ); }
compare_kern_pairs( const void* a, const void* b ) { AFM_KernPair pair1 = (AFM_KernPair)a; AFM_KernPair pair2 = (AFM_KernPair)b; FT_ULong index1 = KERN_INDEX( pair1->index1, pair1->index2 ); FT_ULong index2 = KERN_INDEX( pair2->index1, pair2->index2 ); if ( index1 > index2 ) return 1; else if ( index1 < index2 ) return -1; else return 0; }
T1_Get_Kerning( AFM_FontInfo fi, FT_UInt glyph1, FT_UInt glyph2, FT_Vector* kerning ) { AFM_KernPair min, mid, max; FT_ULong idx = KERN_INDEX( glyph1, glyph2 ); /* simple binary search */ min = fi->KernPairs; max = min + fi->NumKernPair - 1; while ( min <= max ) { FT_ULong midi; mid = min + ( max - min ) / 2; midi = KERN_INDEX( mid->index1, mid->index2 ); if ( midi == idx ) { kerning->x = mid->x; kerning->y = mid->y; return; } if ( midi < idx ) min = mid + 1; else max = mid - 1; } kerning->x = 0; kerning->y = 0; }
/* find the kerning for a given glyph pair */ FT_LOCAL_DEF void CID_Get_Kerning( CID_AFM* afm, FT_UInt glyph1, FT_UInt glyph2, FT_Vector* kerning ) { CID_Kern_Pair *min, *mid, *max; FT_ULong index = KERN_INDEX( glyph1, glyph2 ); /* simple binary search */ min = afm->kern_pairs; max = min + afm->num_pairs - 1; while ( min <= max ) { FT_ULong midi; mid = min + ( max - min ) / 2; midi = KERN_INDEX( mid->glyph1, mid->glyph2 ); if ( midi == index ) { *kerning = mid->kerning; return; } if ( midi < index ) min = mid + 1; else max = mid - 1; } kerning->x = 0; kerning->y = 0; }