#!/usr/bin/env ../utility/fontforge-interp.sh
__license__ = """
This file is part of Gnu FreeFont.
Gnu FreeFont is free software: you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
Foundation, either version 3 of the License, or (at your option) any later
version.
Gnu FreeFont is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with
Gnu FreeFont. If not, see <http://www.gnu.org/licenses/>.
"""
__author__ = "Stevan White"
__email__ = "stevan.white@googlemail.com"
__copyright__ = "Copyright 2009, 2010, Stevan White"
__date__ = "$Date: 2010-09-14 13:02:02 $"
__version__ = "$Revision: 1.5 $"
__doc__ = """
Runs the FontForge validate function on all the font faces.
Prints report on standard output.
Returns 1 if problems found 0 otherwise.
"""
import fontforge
import sys
problem = False
""" Haven't really figured out why TT limit warniings are turndd on,
or where the limits are set.
"""
def countPointsInLayer( layer ):
problem = True
p = 0
for c in layer:
p += len( c )
return p
def printProblemLine( e, msg ):
print "\t" + e.glyphname + msg
def dealWithValidationState( state, e ):
if state & 0x2:
printProblemLine( e, " has open contour" )
if state & 0x4:
printProblemLine( e, " intersects itself" )
if state & 0x8:
printProblemLine( e, " is drawn in wrong direction" )
if state & 0x10:
printProblemLine( e, " has a flipped reference" )
if state & 0x20:
printProblemLine( e, " is missing extrema" )
if state & 0x40:
printProblemLine( e, " is missing a reference in a table" )
if state & 0x80:
printProblemLine( e, " has more than 1500 pts" )
if state & 0x100:
printProblemLine( e, " has more than 96 hints" )
if state & 0x200:
printProblemLine( e, " has invalid PS name" )
"""
# Not meaningfully set for non-TrueType fonts )
if state & 0x400:
printProblemLine( e, " has more points than allowed by TT: " + str( countPointsInLayer( e.layers[1] ) ) )
if state & 0x800:
printProblemLine( e, " has more paths than allowed by TT" )
if state & 0x1000:
printProblemLine( e, " has more points in composite than allowed by TT" )
if state & 0x2000:
printProblemLine( e, " has more paths in composite than allowed by TT" )
if state & 0x4000:
printProblemLine( e, " has instruction longer than allowed" )
if state & 0x8000:
printProblemLine( e, " has more references than allowed" )
if state & 0x10000:
printProblemLine( e, " has references deeper than allowed" )
if state & 0x20000:
print e.glyphname + " fpgm or prep tables longer than allowed" )
"""
def validate( dir, fontFile ):
try:
font = fontforge.open( dir + fontFile )
print "Validating " + fontFile
g = font.selection.all()
g = font.selection.byGlyphs
valid = True
for e in g:
state = e.validate()
if state != 0:
dealWithValidationState( state, e )
font.validate
except Exception, e:
problem = True
print >> sys.stderr, str( e )
validate( '../sfd/', 'FreeSerif.sfd' )
validate( '../sfd/', 'FreeSerifItalic.sfd' )
validate( '../sfd/', 'FreeSerifBold.sfd' )
validate( '../sfd/', 'FreeSerifBoldItalic.sfd' )
validate( '../sfd/', 'FreeSans.sfd' )
validate( '../sfd/', 'FreeSansOblique.sfd' )
validate( '../sfd/', 'FreeSansBold.sfd' )
validate( '../sfd/', 'FreeSansBoldOblique.sfd' )
validate( '../sfd/', 'FreeMono.sfd' )
validate( '../sfd/', 'FreeMonoOblique.sfd' )
validate( '../sfd/', 'FreeMonoBold.sfd' )
validate( '../sfd/', 'FreeMonoBoldOblique.sfd' )
validate( '../sfd/', 'FreeSerif.ttf' )
validate( '../sfd/', 'FreeSerifItalic.ttf' )
validate( '../sfd/', 'FreeSerifBold.ttf' )
validate( '../sfd/', 'FreeSerifBoldItalic.ttf' )
validate( '../sfd/', 'FreeSans.ttf' )
validate( '../sfd/', 'FreeSansOblique.ttf' )
validate( '../sfd/', 'FreeSansBold.ttf' )
validate( '../sfd/', 'FreeSansBoldOblique.ttf' )
validate( '../sfd/', 'FreeMono.ttf' )
validate( '../sfd/', 'FreeMonoOblique.ttf' )
validate( '../sfd/', 'FreeMonoBold.ttf' )
validate( '../sfd/', 'FreeMonoBoldOblique.ttf' )
validate( '../sfd/', 'FreeSerif.otf' )
validate( '../sfd/', 'FreeSerifItalic.otf' )
validate( '../sfd/', 'FreeSerifBold.otf' )
validate( '../sfd/', 'FreeSerifBoldItalic.otf' )
validate( '../sfd/', 'FreeSans.otf' )
validate( '../sfd/', 'FreeSansOblique.otf' )
validate( '../sfd/', 'FreeSansBold.otf' )
validate( '../sfd/', 'FreeSansBoldOblique.otf' )
validate( '../sfd/', 'FreeMono.otf' )
validate( '../sfd/', 'FreeMonoOblique.otf' )
validate( '../sfd/', 'FreeMonoBold.otf' )
validate( '../sfd/', 'FreeMonoBoldOblique.otf' )
if problem:
sys.exit( 1 )