Hi, I have a laptop running Ubuntu Breezy and pygame version 1.6. I want to use pygame.font.SysFont instead of specifying a font path manually. However watch this: >>> import pygame >>> pygame.font.init() >>> pygame.font.match_font('Verdana') /usr/share/fonts/truetype/msttcorefonts/verdanaz.ttf >>> pygame.font.match_font('Verdana', bold=True) /usr/share/fonts/truetype/msttcorefonts/verdanaz.ttf >>> pygame.font.match_font('Verdana', italic=True) /usr/share/fonts/truetype/msttcorefonts/verdanaz.ttf >>> pygame.font.match_font('Verdana', bold=True, italic=True) /usr/share/fonts/truetype/msttcorefonts/verdanaz.ttf All four requests returned the same font file name name! /usr/share/fonts/truetype/msttcorefonts/ contains all four versions of Verdana: Verdana.ttf Verdana_Bold.ttf Verdana_Italic.ttf Verdana_Bold_Italic.ttf plus these symlinks verdana.ttf -> Verdana.ttf verdanab.ttf -> Verdana_Bold.ttf verdanai.ttf -> Verdana_Italic.ttf verdanaz.ttf -> Verdana_Bold_Italic.ttf There are no fonts.dir nor fonts.scale files in this directory. There is a file named fonts.cache-1. pygame/sysfont.py reads the fonts.cache-1 like this: def read_unix_fontscache(dir, file, fonts): file = open(os.path.join(dir, file)) for line in file.readlines(): try: font, num, vals = line.split(' ', 2) except ValueError: continue font = font.replace('"', '') if font[-4:].lower() != '.ttf': continue font = os.path.join(dir, font) vals = vals.split(':') name = _simplename(vals[0][1:]) bold = vals[1].find('Bold') >= 0 italic = vals[1].find('Italic') >= 0 _addfont(name, bold, italic, font, fonts) And herein lies the bug. The relevant line from my fonts.cache-1 says this about verdanaz.ttf: "verdanaz.ttf" 0 "Verdana:familylang=en:style=Bold Italic,[...]" The code of read_unix_fontscache splits the font description into a vals list vals[0] == '"Verdana' vals[1] == 'familylang=en' vals[2] == 'style=Bold Italic,[...]' and then blindly assumes the second element in the list defines the font style. Since neither 'Bold' nor 'Italic' appear in vals[1], read_unix_fontscache assumes verdanaz.ttf is the regular font variant. Fix: replace the last few lines of the function with something like vals = vals.split(':') name = _simplename(vals[0][1:]) bold = italic = 0 for prop in vals[1:]: if prop.startswith('style='): bold = prop.find('Bold') >= 0 italic = prop.find('Italic') >= 0 _addfont(name, bold, italic, font, fonts) In the meantime I'll probably resort to using pygame.font.match_font to locate the font directory, and then splice the file names manually with os.path.dirname/os.path.join. Marius Gedminas -- Computo, ergo sum. -- Curt Suplee
Attachment:
signature.asc
Description: Digital signature