bitmap-fonts/bitmapfonts2otb.py

63 lines
1.7 KiB
Python

#!/usr/bin/python3
# Automatically group the font files by family names and style names,
# and assume each bitmap font only contains one font face.
#
# Generates one otb file per (family name, style name) tuple, named
# after the tuple.
#
# This tool requires ftdump and fonttosfnt.
# Written by Peng Wu as
# https://pwu.fedorapeople.org/fonts/convertbitmap/convertfont.py
# Some changes by Hans Ulrich Niedermann.
import sys
import subprocess
usage = '''
bitmapfonts2otb.py [BITMAPFONTFILE]...
'''
fontnames = dict()
# get font family name and style name by ftdump
def getfullname(fontname):
output = subprocess.check_output(['ftdump', fontname])
output = output.decode('utf8')
# only contain one font face
assert not 'Face number: 1' in output
result = {}
for row in output.split('\n'):
if ':' in row:
key, value = row.split(': ')
result[key.strip()] = value.strip()
familyname, stylename = result['family'], result['style']
if stylename == 'Regular':
return familyname
else:
return familyname + ' ' + stylename
def generate_fonts():
for fullname, filenames in fontnames.items():
outputfilename = fullname.replace(' ', '-') + '.otb'
argv = ['fonttosfnt', '-b', '-c', '-g', '2', '-m', '2', '-o', outputfilename ]
argv.extend(filenames)
print(outputfilename)
print(' '.join(argv))
print(subprocess.check_output(argv).decode('utf8'))
if __name__ == '__main__':
for bitmapfontname in sys.argv[1:]:
fullname = getfullname(bitmapfontname)
if fullname in fontnames:
fontnames[fullname].append(bitmapfontname)
else:
fontnames[fullname] = [bitmapfontname]
generate_fonts()