Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/src/pygame/sysfont.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/pygame/sysfont.py')
-rw-r--r--src/pygame/sysfont.py633
1 files changed, 633 insertions, 0 deletions
diff --git a/src/pygame/sysfont.py b/src/pygame/sysfont.py
new file mode 100644
index 0000000..175879a
--- /dev/null
+++ b/src/pygame/sysfont.py
@@ -0,0 +1,633 @@
+## pygame - Python Game Library
+## Copyright (C) 2000-2003 Pete Shinners
+##
+## This library is free software; you can redistribute it and/or
+## modify it under the terms of the GNU Library General Public
+## License as published by the Free Software Foundation; either
+## version 2 of the License, or (at your option) any later version.
+##
+## This library 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
+## Library General Public License for more details.
+##
+## You should have received a copy of the GNU Library General Public
+## License along with this library; if not, write to the Free
+## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+##
+## Pete Shinners
+## pete@shinners.org
+
+"sysfont, used in the font module to find system fonts"
+
+import os, sys
+
+#Python 3 compatibility
+try:
+ bytes
+except NameError:
+ def toascii(raw):
+ return raw.decode('ascii', 'ignore').encode('ascii')
+else:
+ def toascii(raw):
+ return raw.decode('ascii', 'ignore')
+
+#create simple version of the font name
+def _simplename(name):
+ return ''.join([c.lower() for c in name if c.isalnum()])
+
+
+#insert a font and style into the font dictionary
+def _addfont(name, bold, italic, font, fontdict):
+ if name not in fontdict:
+ fontdict[name] = {}
+ fontdict[name][bold, italic] = font
+
+
+#read the fonts on windows
+# Info taken from:
+# http://www.microsoft.com/typography/fonts/winxp.htm
+# with extra files added from:
+# http://www.ampsoft.net/webdesign-l/windows-fonts-by-version.html
+# File name, family, (Bold, Italic)
+_XP_default_font_files = [
+ ('ahronbd.ttf', 'Aharoni', True, False),
+ ('andlso.ttf', 'Andalus', False, False),
+ ('angsa.ttf', 'Angsana New', False, False),
+ ('angsab.ttf', 'Angsana New', True, False),
+ ('angsai.ttf', 'Angsana New', False, True),
+ ('angsaz.ttf', 'Angsana New', True, True),
+ ('angsau.ttf', 'AngsanaUPC', False, False),
+ ('angsaub.ttf', 'AngsanaUPC', True, False),
+ ('angsaui.ttf', 'AngsanaUPC', False, True),
+ ('angsauz.ttf', 'AngsanaUPC', True, True),
+ ('artro.ttf', 'Arabic Transparent', False, False),
+ ('artrbdo.ttf', 'Arabic Transparent', True, False),
+ ('agatha.ttf', 'Agatha', False, False),
+ ('arial.ttf', 'Arial', False, False),
+ ('arialbd.ttf', 'Arial', True, False),
+ ('ariali.ttf', 'Arial', False, True),
+ ('arialbi.ttf', 'Arial', True, True),
+ ('ariblk.ttf', 'Arial Black', False, False),
+ ('browa.ttf', 'Browallia New', False, False),
+ ('browab.ttf', 'Browallia New', True, False),
+ ('browai.ttf', 'Browallia New', False, True),
+ ('browaz.ttf', 'Browallia New', True, True),
+ ('browau.ttf', 'BrowalliaUPC', False, False),
+ ('browaub.ttf', 'BrowalliaUPC', True, False),
+ ('browaui.ttf', 'BrowalliaUPC', False, True),
+ ('browauz.ttf', 'BrowalliaUPC', True, True),
+ ('comic.ttf', 'Comic Sans MS', False, False),
+ ('comicbd.ttf', 'Comic Sans MS', True, False),
+ ('cordia.ttf', 'Cordia New', False, False),
+ ('cordiab.ttf', 'Cordia New', True, False),
+ ('cordiai.ttf', 'Cordia New', False, True),
+ ('cordiaz.ttf', 'Cordia New', True, True),
+ ('cordiau.ttf', 'CordiaUPC', False, False),
+ ('cordiaub.ttf', 'CordiaUPC', True, False),
+ ('cordiaui.ttf', 'CordiaUPC', False, True),
+ ('cordiauz.ttf', 'CordiaUPC', True, True),
+ ('cour.ttf', 'Courier New', False, False),
+ ('courbd.ttf', 'Courier New', True, False),
+ ('couri.ttf', 'Courier New', False, True),
+ ('courbi.ttf', 'Courier New', True, True),
+ ('david.ttf', 'David', False, False),
+ ('davidbd.ttf', 'David', True, False),
+ ('davidtr.ttf', 'David Transparent', False, False),
+ ('upcdl.ttf', 'DilleniaUPC', False, False),
+ ('upcdb.ttf', 'DilleniaUPC', True, False),
+ ('upcdi.ttf', 'DilleniaUPC', False, True),
+ ('upcdbi.ttf', 'DilleniaUPC', True, True),
+ ('estre.ttf', 'Estrangelo Edessa', False, False),
+ ('upcel.ttf', 'EucrosialUPC', False, False),
+ ('upceb.ttf', 'EucrosialUPC', True, False),
+ ('upcei.ttf', 'EucrosialUPC', False, True),
+ ('upcebi.ttf', 'EucrosialUPC', True, True),
+ ('mriamfx.ttf', 'Fixed Miriam Transparent', False, False),
+ ('framd.ttf', 'Franklin Gothic Medium', False, False),
+ ('framdit.ttf', 'Franklin Gothic Medium', False, True),
+ ('frank.ttf', 'FrankRuehl', False, False),
+ ('upcfl.ttf', 'FreesialUPC', False, False),
+ ('upcfb.ttf', 'FreesialUPC', True, False),
+ ('upcfi.ttf', 'FreesialUPC', False, True),
+ ('upcfbi.ttf', 'FreesialUPC', True, True),
+ ('gautami.ttf', 'Gautami', False, False),
+ ('georgia.ttf', 'Georgia', False, False),
+ ('georgiab.ttf', 'Georgia', True, False),
+ ('georgiai.ttf', 'Georgia', False, True),
+ ('georgiaz.ttf', 'Georgia', True, True),
+ ('impact.ttf', 'Impact', False, False),
+ ('upcil.ttf', 'IrisUPC', False, False),
+ ('upcib.ttf', 'IrisUPC', True, False),
+ ('upcii.ttf', 'IrisUPC', False, True),
+ ('upcibi.ttf', 'IrisUPC', True, True),
+ ('upcjl.ttf', 'JasmineUPC', False, False),
+ ('upcjb.ttf', 'JasmineUPC', True, False),
+ ('upcji.ttf', 'JasmineUPC', False, True),
+ ('upcjbi.ttf', 'JasmineUPC', True, True),
+ ('upckl.ttf', 'KodchiangUPC', False, False),
+ ('upckb.ttf', 'KodchiangUPC', True, False),
+ ('upcki.ttf', 'KodchiangUPC', False, True),
+ ('upckbi.ttf', 'KodchiangUPC', True, True),
+ ('latha.ttf', 'Latha', False, False),
+ ('lvnm.ttf', 'Levenim MT', False, False),
+ ('lvnmbd.ttf', 'Levenim MT', True, False),
+ ('upcll.ttf', 'LilyUPC', False, False),
+ ('upclb.ttf', 'LilyUPC', True, False),
+ ('upcli.ttf', 'LilyUPC', False, True),
+ ('upclbi.ttf', 'LilyUPC', True, True),
+ ('lucon.ttf', 'Lucida Console', False, False),
+ ('l_10646.ttf', 'Lucida Sans Unicode', False, False),
+ ('mangal.ttf', 'Mangal', False, False),
+ ('marlett.ttf', 'Marlett', False, False),
+ ('micross.ttf', 'Microsoft Sans Serif', False, False),
+ ('mriam.ttf', 'Miriam', False, False),
+ ('mriamc.ttf', 'Miriam Fixed', False, False),
+ ('mriamtr.ttf', 'Miriam Transparent', False, False),
+ ('mvboli.ttf', 'MV Boli', False, False),
+ ('nrkis.ttf', 'Narkisim', False, False),
+ ('pala.ttf', 'Falatino Linotype', False, False),
+ ('palab.ttf', 'Falatino Linotype', True, False),
+ ('palai.ttf', 'Falatino Linotype', False, True),
+ ('palabi.ttf', 'Falatino Linotype', True, True),
+ ('raavi.ttf', 'Raavi', False, False),
+ ('rod.ttf', 'Rod', False, False),
+ ('rodtr.ttf', 'Rod Transparent', False, False),
+ ('shruti.ttf', 'Shruti', False, False),
+ ('simpo.ttf', 'Simplified Arabic', False, False),
+ ('simpbdo.ttf', 'Simplified Arabic', True, False),
+ ('simpfxo.ttf', 'Simplified Arabic Fixed', False, False),
+ ('sylfaen.ttf', 'Sylfaen', False, False),
+ ('symbol.ttf', 'Symbol', False, False),
+ ('tahoma.ttf', 'Tahoma', False, False),
+ ('tahomabd.ttf', 'Tahoma', True, False),
+ ('times.ttf', 'Times New Roman', False, False),
+ ('timesbd.ttf', 'Times New Roman', True, False),
+ ('timesi.ttf', 'Times New Roman', False, True),
+ ('timesbi.ttf', 'Times New Roman', True, True),
+ ('trado.ttf', 'Traditional Arabic', False, False),
+ ('tradbdo.ttf', 'Traditional Arabic', True, False),
+ ('Trebuc.ttf', 'Trebuchet MS', False, False),
+ ('Trebucbd.ttf', 'Trebuchet MS', True, False),
+ ('Trebucit.ttf', 'Trebuchet MS', False, True),
+ ('Trebucbi.ttf', 'Trebuchet MS', True, True),
+ ('tunga.ttf', 'Tunga', False, False),
+ ('verdana.ttf', 'Verdana', False, False),
+ ('verdanab.ttf', 'Verdana', True, False),
+ ('verdanai.ttf', 'Verdana', False, True),
+ ('verdanaz.ttf', 'Verdana', True, True),
+ ('webdings.ttf', 'Webdings', False, False),
+ ('wingding.ttf', 'Wingdings', False, False),
+ ('simhei.ttf', 'SimHei', False, False),
+ ('simfang.ttf', 'FangSong_GB2312', False, False),
+ ('kaiu.ttf', 'DFKai-SB', False, False),
+ ('simkai.ttf', 'KaiTi_GB2312', False, False),
+ ('msgothic.ttc', 'MS Gothic', False, False),
+ ('msmincho.ttc', 'MS Mincho', False, False),
+ ('gulim.ttc', 'Gulim', False, False),
+ ('mingliu.ttc', 'Mingliu', False, False),
+ ('simsun.ttc', 'Simsun', False, False),
+ ('batang.ttc', 'Batang', False, False),
+ ]
+
+
+
+
+def initsysfonts_win32():
+ try:
+ import _winreg
+ except ImportError:
+ import winreg as _winreg
+
+ if 'WINDIR' in os.environ:
+ windir = os.environ['WINDIR']
+ elif 'windir' in os.environ:
+ windir = os.environ['windir']
+ else:
+ windir = "C:\\Windows\\"
+
+
+ fonts = {}
+ mods = 'demibold', 'narrow', 'light', 'unicode', 'bt', 'mt'
+ fontdir = os.path.join(windir, "Fonts")
+
+ #this is a list of registry keys containing information
+ #about fonts installed on the system.
+ keys = []
+
+ #add recognized fonts from the fonts directory because the default
+ #fonts may not be entered in the registry.
+ win_font_files_mapping = dict(
+ [(file_name.lower(), (_simplename(name), bold, italic))
+ for file_name, name, bold, italic in _XP_default_font_files])
+
+ font_dir_path = os.path.join(windir, 'fonts')
+ try:
+ font_file_paths = glob.glob(os.path.join(font_dir_path, '*.tt?'))
+ except Exception:
+ pass
+ else:
+ for font in font_file_paths:
+ file_name = os.path.basename(font)
+ try:
+ name, bold, italic = win_font_file_mapping[file_name]
+ except KeyError:
+ pass
+ else:
+ _addfont(name, bold, italic, font, fonts)
+
+ #add additional fonts entered in the registry.
+
+ #find valid registry keys containing font information.
+ possible_keys = [
+ r"SOFTWARE\Microsoft\Windows\CurrentVersion\Fonts",
+ r"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts",
+ r"SOFTWARE\Microsoft\Windows[NT]\CurrentVersion\Fonts",
+ ]
+
+ for key_name in possible_keys:
+ try:
+ key = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, key_name)
+ keys.append(key)
+ except WindowsError:
+ pass
+
+ for key in keys:
+ fontdict = {}
+ for i in range(_winreg.QueryInfoKey(key)[1]):
+ try: name, font, t = _winreg.EnumValue(key,i)
+ except EnvironmentError: break
+
+ # try and handle windows unicode strings for some file names.
+
+ # here are two documents with some information about it:
+ # http://www.python.org/peps/pep-0277.html
+ # https://www.microsoft.com/technet/archive/interopmigration/linux/mvc/lintowin.mspx#ECAA
+ try:
+ font = str(font)
+ except UnicodeEncodeError:
+ # MBCS is the windows encoding for unicode file names.
+ try:
+ font = font.encode('MBCS')
+ except:
+ # no goodness with str or MBCS encoding... skip this font.
+ continue
+
+ if font[-4:].lower() not in [".ttf", ".ttc"]:
+ continue
+ if os.sep not in font:
+ font = os.path.join(fontdir, font)
+
+ if name[-10:] == '(TrueType)':
+ name = name[:-11]
+ name = name.lower().split()
+
+ bold = italic = 0
+ for m in mods:
+ if m in name:
+ name.remove(m)
+ if 'bold' in name:
+ name.remove('bold')
+ bold = 1
+ if 'italic' in name:
+ name.remove('italic')
+ italic = 1
+ name = ''.join(name)
+
+ name=_simplename(name)
+
+ _addfont(name, bold, italic, font, fonts)
+
+ return fonts
+
+
+
+
+
+_OSX_default_font_files = {
+ 'albayan': {(False, False): '/Library/Fonts/AlBayan.ttf',
+ (True, False): '/Library/Fonts/AlBayanBold.ttf'},
+ 'andalemono': {(False, False): '/Library/Fonts/Andale Mono.ttf'},
+ 'applebraille': {(False, False): '/System/Library/Fonts/Apple Braille Outline 6 Dot.ttf'},
+ 'applegothic': {(False, False): '/System/Library/Fonts/AppleGothic.ttf'},
+ 'applesymbols': {(False, False): '/System/Library/Fonts/Apple Symbols.ttf'},
+ 'arial': {(False, False): '/Library/Fonts/Arial.ttf',
+ (False, True): '/Library/Fonts/Arial Italic.ttf',
+ (True, False): '/Library/Fonts/Arial Bold.ttf',
+ (True, True): '/Library/Fonts/Arial Bold Italic.ttf'},
+ 'arialblack': {(False, False): '/Library/Fonts/Arial Black.ttf'},
+ 'arialhebrew': {(False, False): '/Library/Fonts/ArialHB.ttf',
+ (True, False): '/Library/Fonts/ArialHBBold.ttf'},
+ 'arialnarrow': {(False, False): '/Library/Fonts/Arial Narrow.ttf',
+ (False, True): '/Library/Fonts/Arial Narrow Italic.ttf',
+ (True, False): '/Library/Fonts/Arial Narrow Bold.ttf',
+ (True, True): '/Library/Fonts/Arial Narrow Bold Italic.ttf'},
+ 'arialroundedmtbold': {(False, False): '/Library/Fonts/Arial Rounded Bold.ttf'},
+ 'arialunicodems': {(False, False): '/Library/Fonts/Arial Unicode.ttf'},
+ 'ayuthaya': {(False, False): '/Library/Fonts/Ayuthaya.ttf'},
+ 'baghdad': {(False, False): '/Library/Fonts/Baghdad.ttf'},
+ 'brushscriptmt': {(False, True): '/Library/Fonts/Brush Script.ttf'},
+ 'chalkboard': {(False, False): '/Library/Fonts/Chalkboard.ttf',
+ (True, False): '/Library/Fonts/ChalkboardBold.ttf'},
+ 'comicsansms': {(False, False): '/Library/Fonts/Comic Sans MS.ttf',
+ (True, False): '/Library/Fonts/Comic Sans MS Bold.ttf'},
+ 'corsivahebrew': {(False, False): '/Library/Fonts/Corsiva.ttf',
+ (True, False): '/Library/Fonts/CorsivaBold.ttf'},
+ 'couriernew': {(False, False): '/Library/Fonts/Courier New.ttf',
+ (False, True): '/Library/Fonts/Courier New Italic.ttf',
+ (True, False): '/Library/Fonts/Courier New Bold.ttf',
+ (True, True): '/Library/Fonts/Courier New Bold Italic.ttf'},
+ 'decotypenaskh': {(False, False): '/Library/Fonts/DecoTypeNaskh.ttf'},
+ 'devanagarimt': {(False, False): '/Library/Fonts/DevanagariMT.ttf',
+ (True, False): '/Library/Fonts/DevanagariMTBold.ttf'},
+ 'euphemiaucas': {(False, False): '/Library/Fonts/EuphemiaCASRegular.ttf',
+ (False, True): '/Library/Fonts/EuphemiaCASItalic.ttf',
+ (True, False): '/Library/Fonts/EuphemiaCASBold.ttf'},
+ 'gb18030bitmap': {(False, False): '/Library/Fonts/NISC18030.ttf'},
+ 'geezapro': {(False, False): '/System/Library/Fonts/Geeza Pro.ttf',
+ (True, False): '/System/Library/Fonts/Geeza Pro Bold.ttf'},
+ 'georgia': {(False, False): '/Library/Fonts/Georgia.ttf',
+ (False, True): '/Library/Fonts/Georgia Italic.ttf',
+ (True, False): '/Library/Fonts/Georgia Bold.ttf',
+ (True, True): '/Library/Fonts/Georgia Bold Italic.ttf'},
+ 'gujaratimt': {(False, False): '/Library/Fonts/GujaratiMT.ttf',
+ (True, False): '/Library/Fonts/GujaratiMTBold.ttf'},
+ 'gurmukhimt': {(False, False): '/Library/Fonts/Gurmukhi.ttf'},
+ 'impact': {(False, False): '/Library/Fonts/Impact.ttf'},
+ 'inaimathi': {(False, False): '/Library/Fonts/InaiMathi.ttf'},
+ 'kailasa': {(False, False): '/Library/Fonts/Kailasa.ttf'},
+ 'kokonor': {(False, False): '/Library/Fonts/Kokonor.ttf'},
+ 'krungthep': {(False, False): '/Library/Fonts/Krungthep.ttf'},
+ 'kufistandardgk': {(False, False): '/Library/Fonts/KufiStandardGK.ttf'},
+ 'liheipro': {(False, False): '/System/Library/Fonts/ Pro.ttf'},
+ 'lisongpro': {(False, False): '/Library/Fonts/ Pro.ttf'},
+ 'microsoftsansserif': {(False, False): '/Library/Fonts/Microsoft Sans Serif.ttf'},
+ 'mshtakan': {(False, False): '/Library/Fonts/MshtakanRegular.ttf',
+ (False, True): '/Library/Fonts/MshtakanOblique.ttf',
+ (True, False): '/Library/Fonts/MshtakanBold.ttf',
+ (True, True): '/Library/Fonts/MshtakanBoldOblique.ttf'},
+ 'nadeem': {(False, False): '/Library/Fonts/Nadeem.ttf'},
+ 'newpeninimmt': {(False, False): '/Library/Fonts/NewPeninimMT.ttf',
+ (True, False): '/Library/Fonts/NewPeninimMTBoldInclined.ttf'},
+ 'plantagenetcherokee': {(False, False): '/Library/Fonts/PlantagenetCherokee.ttf'},
+ 'raanana': {(False, False): '/Library/Fonts/Raanana.ttf',
+ (True, False): '/Library/Fonts/RaananaBold.ttf'},
+ 'sathu': {(False, False): '/Library/Fonts/Sathu.ttf'},
+ 'silom': {(False, False): '/Library/Fonts/Silom.ttf'},
+ 'stfangsong': {(False, False): '/Library/Fonts/.ttf'},
+ 'stheiti': {(False, False): '/System/Library/Fonts/.ttf'},
+ 'stkaiti': {(False, False): '/Library/Fonts/.ttf'},
+ 'stsong': {(False, False): '/Library/Fonts/.ttf'},
+ 'tahoma': {(False, False): '/Library/Fonts/Tahoma.ttf',
+ (True, False): '/Library/Fonts/Tahoma Bold.ttf'},
+ 'thonburi': {(False, False): '/System/Library/Fonts/Thonburi.ttf',
+ (True, False): '/System/Library/Fonts/ThonburiBold.ttf'},
+ 'timesnewroman': {(False, False): '/Library/Fonts/Times New Roman.ttf',
+ (False, True): '/Library/Fonts/Times New Roman Italic.ttf',
+ (True, False): '/Library/Fonts/Times New Roman Bold.ttf',
+ (True, True): '/Library/Fonts/Times New Roman Bold Italic.ttf'},
+ 'trebuchetms': {(False, False): '/Library/Fonts/Trebuchet MS.ttf',
+ (False, True): '/Library/Fonts/Trebuchet MS Italic.ttf',
+ (True, False): '/Library/Fonts/Trebuchet MS Bold.ttf',
+ (True, True): '/Library/Fonts/Trebuchet MS Bold Italic.ttf'},
+ 'verdana': {(False, False): '/Library/Fonts/Verdana.ttf',
+ (False, True): '/Library/Fonts/Verdana Italic.ttf',
+ (True, False): '/Library/Fonts/Verdana Bold.ttf',
+ (True, True): '/Library/Fonts/Verdana Bold Italic.ttf'},
+ 'webdings': {(False, False): '/Library/Fonts/Webdings.ttf'},
+ 'wingdings': {(False, False): '/Library/Fonts/Wingdings.ttf'},
+ 'wingdings2': {(False, False): '/Library/Fonts/Wingdings 2.ttf'},
+ 'wingdings3': {(False, False): '/Library/Fonts/Wingdings 3.ttf'}}
+
+
+def _search_osx_font_paths(fonts):
+
+ for name, details in _OSX_default_font_files.items():
+ for k, apath in details.items():
+ if os.path.exists(apath):
+ bold, italic = k
+ _addfont(name, bold, italic, apath, fonts)
+
+
+def initsysfonts_darwin():
+ """ read the fonts on OSX.
+ """
+ # if the X11 binary exists... try and use that.
+ # Not likely to be there on pre 10.4.x ...
+ # so still need to do other OSX specific method below.
+ if os.path.exists("/usr/X11/bin/fc-list"):
+ fonts = initsysfonts_unix()
+
+ # we look for the default paths.
+ _search_osx_font_paths(fonts)
+
+ return fonts
+
+
+
+
+
+ paths = ['/Library/Fonts',
+ '~/Library/Fonts',
+ '/Local/Library/Fonts',
+ '/Network/Library/Fonts']
+ fonts = {}
+ for p in paths:
+ if os.path.isdir(p):
+ pass
+ #os.path.walk(p, _fontwalk, fonts)
+ return fonts
+
+
+
+
+#read the fonts on unix
+def initsysfonts_unix():
+ import subprocess
+
+ fonts = {}
+
+ # we use the fc-list from fontconfig to get a list of fonts.
+
+ try:
+ # note, we capture stderr so if fc-list isn't there to stop stderr printing.
+ flout, flerr = subprocess.Popen('fc-list : file family style', shell=True,
+ stdout=subprocess.PIPE, stderr=subprocess.PIPE,
+ close_fds=True).communicate()
+ except Exception:
+ return fonts
+
+ entries = toascii(flout)
+ try:
+ for line in entries.split('\n'):
+ try:
+ filename, family, style = line.split(':', 2)
+ if filename[-4:].lower() in ['.ttf', '.ttc']:
+ bold = style.find('Bold') >= 0
+ italic = style.find('Italic') >= 0
+ oblique = style.find('Oblique') >= 0
+ for name in family.split(','):
+ if name:
+ break
+ else:
+ name = os.path.splitext(os.path.basename(filename))[0]
+ _addfont(_simplename(name),
+ bold, italic or oblique, filename, fonts)
+ except Exception:
+ # try the next one.
+ pass
+ except Exception:
+ pass
+
+ return fonts
+
+
+
+#create alias entries
+def create_aliases():
+ aliases = (
+ ('monospace', 'misc-fixed', 'courier', 'couriernew', 'console',
+ 'fixed', 'mono', 'freemono', 'bitstreamverasansmono',
+ 'verasansmono', 'monotype', 'lucidaconsole'),
+ ('sans', 'arial', 'helvetica', 'swiss', 'freesans',
+ 'bitstreamverasans', 'verasans', 'verdana', 'tahoma'),
+ ('serif', 'times', 'freeserif', 'bitstreamveraserif', 'roman',
+ 'timesroman', 'timesnewroman', 'dutch', 'veraserif',
+ 'georgia'),
+ ('wingdings', 'wingbats'),
+ )
+ for set in aliases:
+ found = None
+ fname = None
+ for name in set:
+ if name in Sysfonts:
+ found = Sysfonts[name]
+ fname = name
+ break
+ if not found:
+ continue
+ for name in set:
+ if name not in Sysfonts:
+ Sysalias[name] = found
+
+
+Sysfonts = {}
+Sysalias = {}
+
+#initialize it all, called once
+def initsysfonts():
+ if sys.platform == 'win32':
+ fonts = initsysfonts_win32()
+ elif sys.platform == 'darwin':
+ fonts = initsysfonts_darwin()
+ else:
+ fonts = initsysfonts_unix()
+ Sysfonts.update(fonts)
+ create_aliases()
+ if not Sysfonts: #dummy so we don't try to reinit
+ Sysfonts[None] = None
+
+
+
+#the exported functions
+
+def SysFont(name, size, bold=False, italic=False):
+ """pygame.font.SysFont(name, size, bold=False, italic=False) -> Font
+ create a pygame Font from system font resources
+
+ This will search the system fonts for the given font
+ name. You can also enable bold or italic styles, and
+ the appropriate system font will be selected if available.
+
+ This will always return a valid Font object, and will
+ fallback on the builtin pygame font if the given font
+ is not found.
+
+ Name can also be a comma separated list of names, in
+ which case set of names will be searched in order. Pygame
+ uses a small set of common font aliases, if the specific
+ font you ask for is not available, a reasonable alternative
+ may be used.
+ """
+ import pygame.font
+
+ if not Sysfonts:
+ initsysfonts()
+
+ gotbold = gotitalic = False
+ fontname = None
+ if name:
+ allnames = name
+ for name in allnames.split(','):
+ name = _simplename(name)
+ styles = Sysfonts.get(name)
+ if not styles:
+ styles = Sysalias.get(name)
+ if styles:
+ while not fontname:
+ plainname = styles.get((False, False))
+ fontname = styles.get((bold, italic))
+ if not fontname:
+ fontname = plainname
+ elif plainname != fontname:
+ gotbold = bold
+ gotitalic = italic
+ if fontname: break
+
+ font = pygame.font.Font(fontname, size)
+ if bold and not gotbold:
+ font.set_bold(1)
+ if italic and not gotitalic:
+ font.set_italic(1)
+
+ return font
+
+
+def get_fonts():
+ """pygame.font.get_fonts() -> list
+ get a list of system font names
+
+ Returns the list of all found system fonts. Note that
+ the names of the fonts will be all lowercase with spaces
+ removed. This is how pygame internally stores the font
+ names for matching.
+ """
+ if not Sysfonts:
+ initsysfonts()
+ return list(Sysfonts.keys())
+
+
+def match_font(name, bold=0, italic=0):
+ """pygame.font.match_font(name, bold=0, italic=0) -> name
+ find the filename for the named system font
+
+ This performs the same font search as the SysFont()
+ function, only it returns the path to the TTF file
+ that would be loaded. The font name can be a comma
+ separated list of font names to try.
+
+ If no match is found, None is returned.
+ """
+ if not Sysfonts:
+ initsysfonts()
+
+ fontname = None
+ allnames = name
+ for name in allnames.split(','):
+ name = _simplename(name)
+ styles = Sysfonts.get(name)
+ if not styles:
+ styles = Sysalias.get(name)
+ if styles:
+ while not fontname:
+ fontname = styles.get((bold, italic))
+ if italic:
+ italic = 0
+ elif bold:
+ bold = 0
+ elif not fontname:
+ fontname = list(styles.values())[0]
+ if fontname: break
+ return fontname
+
+