Hello, thank you very much for your explanation!
So if there is no plain one available, it should try and use the italic or bold instead I guess. So I think that should be the fix we should apply. Are you able to supply a patch for that? cheers, On Wed, Aug 17, 2011 at 11:20 PM, Jeremy Sharpe < [email protected]> wrote: > Ah sorry, I posted it through the Google Groups mirror and I think it > may have eaten my original message. Here it is again: > > SysFont hangs when loading certain fonts. For example, on my Windows 7 > machine, I can produce a hang with the line > > pygame.font.SysFont("vivaldi", 12) > > (See the attached script, sysfont_hang.py, which should reproduce it > on any machine.) > > The problem is that SysFont assumes that every system font has a > non-bold, non-italic version, and this assumption causes it to enter > an infinite loop. In the example above, the font "vivaldi" in fact > only has one version, an italic, non-bold version. This messes with > the following code from lib/sysfont.py: > > ------------------- > > def SysFont(name, size, bold=False, italic=False, constructor=None): > if constructor is None: > constructor = font_constructor > 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 > set_bold = set_italic = False > if bold and not gotbold: > set_bold = True > if italic and not gotitalic: > set_italic = True > return constructor(fontname, size, set_bold, set_italic) > > ------------------- > > This while loop is the part that hangs: > > ------------------- > > 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 > > ------------------- > > The problem is that "styles", in the case of a font like "vivaldi" on > Windows 7, is this map: > > {(0, 1): "PATH_TO_FONT"} > > With a bit of examination, it can be seen that in such a case, this > while loop will never terminate. > > I haven't attached a patch because I'm not sure exactly the right way > to fix this. Should it simply return list(styles.values())[0] in this > case, should it throw an exception, or should it default to pygame's > default font? > > Thanks for reading, > > Jeremy Sharpe > > On Wed, Aug 17, 2011 at 5:18 PM, René Dudfield <[email protected]> wrote: > > On Wed, Aug 17, 2011 at 11:10 PM, Jeremy Sharpe > > <[email protected]> wrote: > >> > >> I see that rev 964 fixed a similar bug in this area of code, but seems > to > >> have missed the case where both fontname AND plainname are None, which > is > >> what results in the infinite loop. > > > > Hello, > > > > I think I may have missed an earlier email... What should be changed to > fix > > it? > > >
