Blob Blame History Raw
#!/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: 2011-11-03 01:51:05 +0100 (Thu, 03 Nov 2011) $"
__version__ = "$Revision: 1864 $"

__doc__ = """
Diagnostic tool that checks that fonts are really monospace.

Allows characters to have 0 width though (note this is controversial)

Also: in order for box-drawing characters to connect properly, it is 
important that the glyphs all lie between 800 and -200EM vertically.
"""

import fontforge
import sys

problem = False

def ismonomono( fontfilename ):
	print "Checking character bounding boxes: " + fontfilename
	font = fontforge.open( fontfilename )

	g = font.selection.all()
	g = font.selection.byGlyphs

	nonzero = 0

	for e in g:
		if nonzero == 0:
			if e.width > 0:
				nonzero = e.width
		else:
			if e.width > 0 and e.width != nonzero:
				print '  ' + e.glyphname \
					+ '(' + str( e.encoding ) \
					+ ') width is ' + str( e.width ) \
					+ ' not ' + str( nonzero )
				problem = True

		( xmin, ymin, xmax, ymax ) = e.boundingBox()
		if ymin < -200 or ymax > 800:
			print '  ' + e.glyphname + ' goes between heights ' \
				+ str( ymin )  + ' and ' + str( ymax )
	""" 
	For FontForge handling of TrueType/OpenType magic characters:
	1) check that 0x0000 0x0001, 0x000D exist and have names
		.notdef, .null, nonmarkingreturn
	2) check that 0x0000 and 0x000D are width 600, and
	0x0001 has no glyph and is width 0

	Othewise complain that FontForge may not treat it right.
	"""
	if not font[0x0000] \
		or font[0x0000].glyphname != '.notdef' \
		or font[0x0000].width != nonzero:
		print 'Should be full-width ".notdef" glyph at 0x0000.'
	if not font[0x0001] \
		or font[0x0001].glyphname != '.null' \
		or font[0x0001].width != 0:
		print 'Should be zero-width ".null" glyph at 0x0001.'
	if not font[0x000D] \
		or font[0x000D].glyphname != 'nonmarkingreturn' \
		or font[0x000D].width != nonzero:
		print 'Should be full-width "nonmarkingreturn" glyph at 0x000D.'

scriptname = sys.argv[0];
argc = len( sys.argv )

if argc > 1:
	for i in range( 1, argc ):
		ismonomono( sys.argv[i] )

if problem:
	sys.exit( 1 )
else:
	sys.exit( 0 )