[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

Re: [pygame] BUG: SysFont('Verdana') gives me Bold+Italic variant on Unix



Hello,

the sysfont code has had a number of changes since 1.6.

Are you able to reproduce this with pygame 1.7.1release or cvs pygame 1.7.2pre?

It looks like it should be fixed from looking at the code changes.


Cheers,


On 1/9/06, Marius Gedminas <mgedmin@xxxxxxxx> wrote:
> 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
>
>
> -----BEGIN PGP SIGNATURE-----
> Version: GnuPG v1.4.1 (GNU/Linux)
>
> iD8DBQFDwYa7kVdEXeem148RAvjkAJ9ZCcouU314WGQkrobnODRYpRJaxgCcDnHU
> D6SJ4ff/sWeLNzTzQH/cajs=
> =RLlz
> -----END PGP SIGNATURE-----
>
>
>