1

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

0

1 Answer 1

2

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()
Sign up to request clarification or add additional context in comments.

6 Comments

Thank you so much for explaining me biitmap font and bitmap and glyphs and many other things.
so the charecter " " has no connecting pixels with it as it is the background so i will get an empty list as glyph_rect
so the charecter " " has no connecting pixels with it as it is the background so i will get an empty list as glyph_rect
@Rohit12345 Yes, for " " the list is empty. For "?" the list has 2 elements.
ok ya it has two elements because there is a space between the . in the question mark right
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.