Search code examples
pythonpygamewidthglyph

Pygame Python font


I have a question regarding the glyph a font and the pygame width of a font yesterday i some code regarding this here is the code:

import pygame

pygame.init()
win = pygame.display.set_mode((800, 600))
font = pygame.font.Font("freesansbold.ttf", 32)
i = 0
text = "hello how are you?"
run = True
while run:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

    letter = text[i]
    text_1 = font.render(letter, True, (255, 255, 255))

    bw, bh = font.size(letter)
    glyph_rect = pygame.mask.from_surface(text_1).get_bounding_rects()
    # print(glyph_rect)
    if glyph_rect:
        gh = glyph_rect[0].height
        print(f"{glyph_rect[0]}")
        print(f'letter {letter}  bitmap height: {bh}  glyph height: {gh} width = {glyph_rect[0].width} width_2 = {bw}')

    win.fill((0, 0, 0))
    win.blit(text_1, (0, 0))
    pygame.display.update()

    i += 1
    run = i < len(text)

pygame.quit()
# win.blit(text_1, (0, 0))

I know why the glyph height is diffrent because i asked that in a question and i got a answer for that but why is the glyph width always a bit less than the actual width? Can someone explain me in detail


Solution

  • The width is different because there is a space between characters when they are connected to words. glyph_rect[0].width is the width of the glyph. bw is the width of the bitmap. The glyph does not fill the entire bitmap and has some space on both sides.


    You can investigate this with the following program (each letter is displayed for 1 second):

    import pygame
    
    pygame.init()
    win = pygame.display.set_mode((800, 600))
    clock = pygame.time.Clock()
    font = pygame.font.Font("freesansbold.ttf", 200)
    i = 0
    text = "hello how are you?"
    run = True
    while run:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                run = False
    
        letter = text[i]
        text_1 = font.render(letter, True, (0, 0, 0))
        text_draw = font.render(letter, True, (0, 0, 0), (255, 255, 255))
    
        bw, bh = font.size(letter)
        glyph_rect = pygame.mask.from_surface(text_1).get_bounding_rects()
        if glyph_rect:
            gh = glyph_rect[0].height
            print(f"{glyph_rect[0]}")
            print(f'letter {letter}  bitmap height: {bh}  glyph height: {gh} width = {glyph_rect[0].width} width_2 = {bw}')
    
        win.fill((128, 128, 128))
        win.blit(text_draw, (100, 100))
        for r in glyph_rect:
            draw_rect = r.move(100, 100)
            pygame.draw.rect(win, (255, 0, 0), draw_rect, 3)
        pygame.display.update()
    
        i += 1
        run = i < len(text)
        clock.tick(1)
    
    pygame.quit()