Arkodeep Ray
Arkodeep Ray

Reputation: 174

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

Upvotes: 1

Views: 283

Answers (1)

Rabbid76
Rabbid76

Reputation: 210880

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()

Upvotes: 2

Related Questions