Created
August 22, 2011 16:07
-
-
Save jasharpe/1162771 to your computer and use it in GitHub Desktop.
Patch fixing pygame Sysfont infinite loop
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff -r fe49604b5709 lib/sysfont.py | |
--- a/lib/sysfont.py Fri Aug 19 18:14:22 2011 -0700 | |
+++ b/lib/sysfont.py Mon Aug 22 12:05:57 2011 -0400 | |
@@ -581,14 +581,25 @@ | |
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 | |
+ plainname = styles.get((False, False)) | |
+ fontname = styles.get((bold, italic)) | |
+ if not fontname and not plainname: | |
+ # Neither requested style, nor plain font exists, so | |
+ # return a font with the name requested, but an | |
+ # arbitrary style. | |
+ (style, fontname) = list(styles.items())[0] | |
+ # Attempt to style it as requested. This can't | |
+ # unbold or unitalicize anything, but it can | |
+ # fake bold and/or fake italicize. | |
+ if bold and style[0]: | |
+ gotbold = True | |
+ if italic and style[1]: | |
+ gotitalic = True | |
+ elif not fontname: | |
+ fontname = plainname | |
+ elif plainname != fontname: | |
+ gotbold = bold | |
+ gotitalic = italic | |
if fontname: break | |
set_bold = set_italic = False |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import pygame, time | |
class FontTester: | |
def __init__(self): | |
self.i = 0 | |
self.fonts = sorted(pygame.font.get_fonts()) | |
def done(self): | |
if self.i >= 4 * len(self.fonts): | |
return True | |
def get_font_tuple(self): | |
font = self.fonts[self.i / 4] | |
bold = (self.i % 4) == 1 or (self.i % 4) == 3 | |
italic = (self.i % 4) == 2 or (self.i % 4) == 3 | |
return (font, bold, italic) | |
def update(self, events): | |
for event in events: | |
if event.type == pygame.KEYDOWN and event.key == pygame.K_RIGHT: | |
self.i = (self.i + 1) % (4 * len(self.fonts)) | |
elif event.type == pygame.KEYDOWN and event.key == pygame.K_LEFT: | |
self.i = (self.i - 1) % (4 * len(self.fonts)) | |
def draw(self, screen): | |
(font, bold, italic) = self.get_font_tuple() | |
sysfont = pygame.font.SysFont(font, 30, bold, italic) | |
text = sysfont.render("font '%s'" % (font), 1, (255, 255, 255)) | |
text_pos = text.get_rect(center = (400, 250)) | |
screen.blit(text, text_pos) | |
text = sysfont.render("bold: %s" % (bold), 1, (255, 255, 255)) | |
text_pos.top += text.get_height() | |
screen.blit(text, text_pos) | |
text = sysfont.render("italic: %s" % (italic), 1, (255, 255, 255)) | |
text_pos.top += text.get_height() | |
screen.blit(text, text_pos) | |
if __name__ == "__main__": | |
pygame.init() | |
screen = pygame.display.set_mode((800, 600)) | |
pygame.display.set_caption('sysfont test') | |
font_tester = FontTester() | |
clock = pygame.time.Clock() | |
exit_program = False | |
while not exit_program: | |
clock.tick(60) | |
events = pygame.event.get() | |
for event in events: | |
if event.type == pygame.QUIT: | |
exit_program = True | |
font_tester.update(events) | |
screen.fill((0, 0, 0)) | |
font_tester.draw(screen) | |
pygame.display.flip() | |
pygame.quit() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment