#!/usr/bin/fontforge -script __author__ = "Stevan White " import fontforge import sys from OpenType.UnicodeRanges import * def get_kern_subtables( font ): try: tables = [] for lookup in font.gpos_lookups: if font.getLookupInfo( lookup )[0] == 'gpos_pair': sts = font.getLookupSubtables( lookup ) for st in sts: if font.isKerningClass( st ): tables.append( st ) return tables except EnvironmentError, ( e ): print >> sys.stderr, 'EnvironmentError ' + str( e ) except TypeError, ( t ): print >> sys.stderr, 'TypeError ' + str( t ) return None preamble = """ """ postamble=""" """ def print_kerns( fontPath ): font = fontforge.open( fontPath ) print '

Kerning classes in ' + font.fontname + '

' weight = '' if font.os2_weight > 500: weight = 'B' style = '' if font.italicangle < 0.0: style = 'I' print '
' subtables = get_kern_subtables( font ) for st in subtables: print '

Subtable ' + st + '

' printKernsOfSubtable( font, st ) print '
' sys.stdout.flush() def printKernsOfSubtable( font, subtable ): kclass = font.getKerningClass( subtable ) n = 0 leftclasses = kclass[0] rightclasses = kclass[1] kerns = kclass[2] nr = len( rightclasses ) print '' print '' print '' print '" print "" print "" print "
left classes: right classes:
' for lc in leftclasses: if lc: for c in lc: printentity( font, c ) print "
" print "
" for rc in rightclasses: if rc: for c in rc: printentity( font, c ) print "
" print "
" print "" print "" print "" for rc in rightclasses: if rc: sys.stdout.write( "" ) print "" for lc in leftclasses: m = 0 if lc: print "" sys.stdout.write( "" ) for rc in rightclasses: kern = kerns[ n * nr + m ] if rc: ccolor = '' ncolor = '' if kern > 0: ncolor = ' class="pos"' if kern == 0: ccolor = ' class="zero"' sys.stdout.write( '' ) if kern == 0: sys.stdout.write( ' ' ) else: sys.stdout.write( str( kern ) ) sys.stdout.write( '
' ) printpair( font, lc[0], rc[0] ) sys.stdout.write( '' ) m += 1 print "
" n += 1 print "
" ) printentity( font, rc[0] ) sys.stdout.write( "
" ) printentity( font, lc[0] ) sys.stdout.write( "
" def printentity( font, a ): s = font.findEncodingSlot( a ) v = formatted_hex_value( s ) if s == -1: v = ' ' print >> sys.stderr, font.fullname, 'Missing glyph: ' + a elif not codepointIsInSomeRange( s ): print >> sys.stderr, font.fullname, 'Non-unicode: ' + v sys.stdout.write( v ) def printpair( font, p, q ): printentity( font, p ) printentity( font, q ) sys.stdout.write( ' ' ) def formatted_hex_value( n ): return '%s%0.4x%s' %( "&#x", n, ";" ) def printlist( lst ): s = '' delim = '' for m in lst: s += delim + m delim = ' ' print s print preamble #print_kerns( '/home/swhite/font_stuff/urwsr-ttf/URWPalladioL-Roman-test.sfd' ) print_kerns( '../../sfd/FreeSerif.sfd' ) print_kerns( '../../sfd/FreeSerifItalic.sfd' ) print_kerns( '../../sfd/FreeSerifBold.sfd' ) print_kerns( '../../sfd/FreeSerifBoldItalic.sfd' ) print_kerns( '../../sfd/FreeSans.sfd' ) print_kerns( '../../sfd/FreeSansOblique.sfd' ) print_kerns( '../../sfd/FreeSansBold.sfd' ) print_kerns( '../../sfd/FreeSansBoldOblique.sfd' ) print_kerns( '../../sfd/FreeMono.sfd' ) print_kerns( '../../sfd/FreeMonoOblique.sfd' ) print_kerns( '../../sfd/FreeMonoBold.sfd' ) print_kerns( '../../sfd/FreeMonoBoldOblique.sfd' ) print postamble