#!/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, 2011 Stevan White"
__date__ = "$Date: 2011-11-27 01:33:15 +0100 (Sun, 27 Nov 2011) $"
__version__ = "$Revision: 1907 $"
__doc__ = """
For most unicode ranges, glyph slot numbers should be the same as the
Unicode value.
The Private Use ranges are the exception: those characters should have a
definate non-Unicode number: -1
This script checks that this is the case, and prints out a warning
whenever it isn't.
"""
import fontforge
import sys
problem = False
def inPrivateUseRange( glyph ):
e = glyph.encoding
return ( ( e >= 0xE800 and e <= 0xF8FF )
or ( e >= 0xFF000 and e <= 0xFFFFD )
or ( e >= 0x100000 and e <= 0x10FFFD ) )
def isSpecialTrueType( glyph ):
""" Fontforge treats three control characters as the special
TrueType characters recommended by that standard
"""
e = glyph.encoding
return e == 0 or e == 1 or e == 0xD
from os import path
def checkGlyphNumbers( fontDir, fontFile ):
if isinstance( fontFile, ( list, tuple ) ):
print "In directory " + fontDir
for fontName in fontFile:
checkGlyphNumbers( fontDir, fontName )
return
print "Checking slot numbers in " + fontFile
font = fontforge.open( path.join( fontDir, fontFile ) )
g = font.selection.all()
g = font.selection.byGlyphs
valid = True
for glyph in g:
if isSpecialTrueType( glyph ):
# FIXME really should complain if it DOESNT exist
pass
elif inPrivateUseRange( glyph ):
if glyph.unicode != -1:
print "Glyph at slot " + str( glyph.encoding ) \
+ " is Private Use but has Unicode"
problem = True
else:
if glyph.encoding != glyph.unicode:
print "Glyph at slot " + str( glyph.encoding ) \
+ " has wrong Unicode"
problem = True
# --------------------------------------------------------------------------
args = sys.argv[1:]
if len( args ) < 1 or len( args[0].strip() ) == 0:
checkGlyphNumbers( '../../sfd/',
( 'FreeSerif.sfd', 'FreeSerifItalic.sfd',
'FreeSerifBold.sfd', 'FreeSerifBoldItalic.sfd',
'FreeSans.sfd', 'FreeSansOblique.sfd',
'FreeSansBold.sfd', 'FreeSansBoldOblique.sfd',
'FreeMono.sfd', 'FreeMonoOblique.sfd',
'FreeMonoBold.sfd', 'FreeMonoBoldOblique.sfd' ) )
else:
checkGlyphNumbers( args[0], args[1:] )
if problem:
sys.exit( 1 )