Blame tools/report/kernclasses.py

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