|
Packit |
f0e7df |
#!/usr/bin/fontforge -script
|
|
Packit |
f0e7df |
|
|
Packit |
f0e7df |
__author__ = "Stevan White <stevan.white@googlemail.com>"
|
|
Packit |
f0e7df |
|
|
Packit |
f0e7df |
import fontforge
|
|
Packit |
f0e7df |
import sys
|
|
Packit |
f0e7df |
from OpenType.UnicodeRanges import *
|
|
Packit |
f0e7df |
|
|
Packit |
f0e7df |
def get_kern_subtables( font ):
|
|
Packit |
f0e7df |
try:
|
|
Packit |
f0e7df |
tables = []
|
|
Packit |
f0e7df |
for lookup in font.gpos_lookups:
|
|
Packit |
f0e7df |
if font.getLookupInfo( lookup )[0] == 'gpos_pair':
|
|
Packit |
f0e7df |
sts = font.getLookupSubtables( lookup )
|
|
Packit |
f0e7df |
for st in sts:
|
|
Packit |
f0e7df |
if font.isKerningClass( st ):
|
|
Packit |
f0e7df |
tables.append( st )
|
|
Packit |
f0e7df |
return tables
|
|
Packit |
f0e7df |
except EnvironmentError, ( e ):
|
|
Packit |
f0e7df |
print >> sys.stderr, 'EnvironmentError ' + str( e )
|
|
Packit |
f0e7df |
except TypeError, ( t ):
|
|
Packit |
f0e7df |
print >> sys.stderr, 'TypeError ' + str( t )
|
|
Packit |
f0e7df |
return None
|
|
Packit |
f0e7df |
preamble = """
|
|
Packit |
f0e7df |
<html>
|
|
Packit |
f0e7df |
<head>
|
|
Packit |
f0e7df |
<style type="text/css">
|
|
Packit |
f0e7df |
.nonexistent { background-color: red; }
|
|
Packit |
f0e7df |
td { text-align: right; font-family: inherit; }
|
|
Packit |
f0e7df |
.I td { font-style: italic; }
|
|
Packit |
f0e7df |
.B td { font-weight: bold; }
|
|
Packit |
f0e7df |
.BI td { font-weight: bold; font-style: italic; }
|
|
Packit |
f0e7df |
td { line-height: 1; }
|
|
Packit |
f0e7df |
.classes td { text-align: left; vertical-align: top; }
|
|
Packit |
f0e7df |
td span { font-weight: normal; font-style: normal; font-size: smaller; color: lime; }
|
|
Packit |
f0e7df |
td span.pos { color: magenta; }
|
|
Packit |
f0e7df |
td.zero { color: gray; }
|
|
Packit |
f0e7df |
</style>
|
|
Packit |
f0e7df |
</head>
|
|
Packit |
f0e7df |
<body>
|
|
Packit |
f0e7df |
"""
|
|
Packit |
f0e7df |
postamble="""
|
|
Packit |
f0e7df |
</body>
|
|
Packit |
f0e7df |
</html>
|
|
Packit |
f0e7df |
"""
|
|
Packit |
f0e7df |
|
|
Packit |
f0e7df |
def print_kerns( fontPath ):
|
|
Packit |
f0e7df |
font = fontforge.open( fontPath )
|
|
Packit |
f0e7df |
print 'Kerning classes in ' + font.fontname + ''
|
|
Packit |
f0e7df |
weight = ''
|
|
Packit |
f0e7df |
if font.os2_weight > 500:
|
|
Packit |
f0e7df |
weight = 'B'
|
|
Packit |
f0e7df |
style = ''
|
|
Packit |
f0e7df |
if font.italicangle < 0.0:
|
|
Packit |
f0e7df |
style = 'I'
|
|
Packit |
f0e7df |
print '
|
|
Packit |
f0e7df |
+ 'class="' + weight + style + '">'
|
|
Packit |
f0e7df |
subtables = get_kern_subtables( font )
|
|
Packit |
f0e7df |
for st in subtables:
|
|
Packit |
f0e7df |
print 'Subtable ' + st + ''
|
|
Packit |
f0e7df |
printKernsOfSubtable( font, st )
|
|
Packit |
f0e7df |
print ''
|
|
Packit |
f0e7df |
sys.stdout.flush()
|
|
Packit |
f0e7df |
|
|
Packit |
f0e7df |
def printKernsOfSubtable( font, subtable ):
|
|
Packit |
f0e7df |
kclass = font.getKerningClass( subtable )
|
|
Packit |
f0e7df |
n = 0
|
|
Packit |
f0e7df |
leftclasses = kclass[0]
|
|
Packit |
f0e7df |
rightclasses = kclass[1]
|
|
Packit |
f0e7df |
kerns = kclass[2]
|
|
Packit |
f0e7df |
nr = len( rightclasses )
|
|
Packit |
f0e7df |
print ''
|
|
Packit |
f0e7df |
print 'left classes: '
|
|
Packit |
f0e7df |
print 'right classes: '
|
|
Packit |
f0e7df |
print ''
|
|
Packit |
f0e7df |
for lc in leftclasses:
|
|
Packit |
f0e7df |
if lc:
|
|
Packit |
f0e7df |
for c in lc:
|
|
Packit |
f0e7df |
printentity( font, c )
|
|
Packit |
f0e7df |
print " "
|
|
Packit |
f0e7df |
print ""
|
|
Packit |
f0e7df |
print ""
|
|
Packit |
f0e7df |
for rc in rightclasses:
|
|
Packit |
f0e7df |
if rc:
|
|
Packit |
f0e7df |
for c in rc:
|
|
Packit |
f0e7df |
printentity( font, c )
|
|
Packit |
f0e7df |
print " "
|
|
Packit |
f0e7df |
print ""
|
|
Packit |
f0e7df |
print ""
|
|
Packit |
f0e7df |
print ""
|
|
Packit |
f0e7df |
print ""
|
|
Packit |
f0e7df |
print ""
|
|
Packit |
f0e7df |
print ""
|
|
Packit |
f0e7df |
for rc in rightclasses:
|
|
Packit |
f0e7df |
if rc:
|
|
Packit |
f0e7df |
sys.stdout.write( "" )
|
|
Packit |
f0e7df |
printentity( font, rc[0] )
|
|
Packit |
f0e7df |
sys.stdout.write( "" )
|
|
Packit |
f0e7df |
print ""
|
|
Packit |
f0e7df |
for lc in leftclasses:
|
|
Packit |
f0e7df |
m = 0
|
|
Packit |
f0e7df |
if lc:
|
|
Packit |
f0e7df |
print ""
|
|
Packit |
f0e7df |
sys.stdout.write( "" )
|
|
Packit |
f0e7df |
printentity( font, lc[0] )
|
|
Packit |
f0e7df |
sys.stdout.write( "" )
|
|
Packit |
f0e7df |
for rc in rightclasses:
|
|
Packit |
f0e7df |
kern = kerns[ n * nr + m ]
|
|
Packit |
f0e7df |
if rc:
|
|
Packit |
f0e7df |
ccolor = ''
|
|
Packit |
f0e7df |
ncolor = ''
|
|
Packit |
f0e7df |
if kern > 0:
|
|
Packit |
f0e7df |
ncolor = ' class="pos"'
|
|
Packit |
f0e7df |
if kern == 0:
|
|
Packit |
f0e7df |
ccolor = ' class="zero"'
|
|
Packit |
f0e7df |
sys.stdout.write( '<td' + ccolor + '><span' + ncolor + '>' )
|
|
Packit |
f0e7df |
if kern == 0:
|
|
Packit |
f0e7df |
sys.stdout.write( ' ' )
|
|
Packit |
f0e7df |
else:
|
|
Packit |
f0e7df |
sys.stdout.write( str( kern ) )
|
|
Packit |
f0e7df |
sys.stdout.write( ' ' )
|
|
Packit |
f0e7df |
printpair( font, lc[0], rc[0] )
|
|
Packit |
f0e7df |
sys.stdout.write( '' )
|
|
Packit |
f0e7df |
m += 1
|
|
Packit |
f0e7df |
print ""
|
|
Packit |
f0e7df |
n += 1
|
|
Packit |
f0e7df |
print ""
|
|
Packit |
f0e7df |
|
|
Packit |
f0e7df |
def printentity( font, a ):
|
|
Packit |
f0e7df |
s = font.findEncodingSlot( a )
|
|
Packit |
f0e7df |
v = formatted_hex_value( s )
|
|
Packit |
f0e7df |
if s == -1:
|
|
Packit |
f0e7df |
v = ' '
|
|
Packit |
f0e7df |
print >> sys.stderr, font.fullname, 'Missing glyph: ' + a
|
|
Packit |
f0e7df |
elif not codepointIsInSomeRange( s ):
|
|
Packit |
f0e7df |
print >> sys.stderr, font.fullname, 'Non-unicode: ' + v
|
|
Packit |
f0e7df |
sys.stdout.write( v )
|
|
Packit |
f0e7df |
|
|
Packit |
f0e7df |
def printpair( font, p, q ):
|
|
Packit |
f0e7df |
printentity( font, p )
|
|
Packit |
f0e7df |
printentity( font, q )
|
|
Packit |
f0e7df |
sys.stdout.write( ' ' )
|
|
Packit |
f0e7df |
|
|
Packit |
f0e7df |
def formatted_hex_value( n ):
|
|
Packit |
f0e7df |
return '%s%0.4x%s' %( "&#x", n, ";" )
|
|
Packit |
f0e7df |
|
|
Packit |
f0e7df |
def printlist( lst ):
|
|
Packit |
f0e7df |
s = ''
|
|
Packit |
f0e7df |
delim = ''
|
|
Packit |
f0e7df |
for m in lst:
|
|
Packit |
f0e7df |
s += delim + m
|
|
Packit |
f0e7df |
delim = ' '
|
|
Packit |
f0e7df |
print s
|
|
Packit |
f0e7df |
|
|
Packit |
f0e7df |
print preamble
|
|
Packit |
f0e7df |
#print_kerns( '/home/swhite/font_stuff/urwsr-ttf/URWPalladioL-Roman-test.sfd' )
|
|
Packit |
f0e7df |
print_kerns( '../../sfd/FreeSerif.sfd' )
|
|
Packit |
f0e7df |
print_kerns( '../../sfd/FreeSerifItalic.sfd' )
|
|
Packit |
f0e7df |
print_kerns( '../../sfd/FreeSerifBold.sfd' )
|
|
Packit |
f0e7df |
print_kerns( '../../sfd/FreeSerifBoldItalic.sfd' )
|
|
Packit |
f0e7df |
print_kerns( '../../sfd/FreeSans.sfd' )
|
|
Packit |
f0e7df |
print_kerns( '../../sfd/FreeSansOblique.sfd' )
|
|
Packit |
f0e7df |
print_kerns( '../../sfd/FreeSansBold.sfd' )
|
|
Packit |
f0e7df |
print_kerns( '../../sfd/FreeSansBoldOblique.sfd' )
|
|
Packit |
f0e7df |
print_kerns( '../../sfd/FreeMono.sfd' )
|
|
Packit |
f0e7df |
print_kerns( '../../sfd/FreeMonoOblique.sfd' )
|
|
Packit |
f0e7df |
print_kerns( '../../sfd/FreeMonoBold.sfd' )
|
|
Packit |
f0e7df |
print_kerns( '../../sfd/FreeMonoBoldOblique.sfd' )
|
|
Packit |
f0e7df |
print postamble
|