We are currently in the process of converting the website to the new design. Some pages, like this one, are still broken. We appreciate your patience.
Handmade Hero»Forums»Code
107 posts
is this a good way to invert bitmap?
Edited by C_Worm on
I used the stbtt_truetype.h to render a bitmapfont.

However, like stb_image.h the bitmaps loaded are upside down.

In stb_image there's this function stbi_set_flip_vertically_on_load(true); which inverts the bitmap automatically.

I didn't find a corresponding function for stb_truetype so i came up with this little algorithm, but is this a good way to go or
is there a better way?


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
    bool success = 0;
    const u32 pxlw = 2048;
    const u32 pxlh = 2048;
    const u32 fontf_sz = pxlw*pxlh;
    unsigned char font_file[fontf_sz] = {};
    unsigned char pixels[fontf_sz] = {};
    stbtt_packedchar packed_char[124] = {};
    stbtt_pack_context pack_c = {};
    
    size_t bytes_read = 0;
    bytes_read = fread(font_file, 1, fontf_sz, fopen("C:/windows/fonts/arial.ttf", "rb"));
    
    // init pixel_bitmap
    success = stbtt_PackBegin(&pack_c, pixels, pxlw, pxlh, 0, 1, 0);
    
    // set detail level of characters in font which requires the pixel_bitmap to be bigger
    stbtt_PackSetOversampling(&pack_c, 8, 8);
    
    // Set what characters in the pixel_map you want STBTT_POINT_SIZE makes the charcter size in pixels
    stbtt_PackFontRange(&pack_c, font_file, 0, 32, 0, 124,  packed_char);

    for(i32 y = 0; y < pxlh / 2; y++)
    {
        for(i32 x = 0; x < pxlw; x++)
        {
            i32 temp = pixels[x + (y * pxlw)];
            pixels[x + (y * pxlw)] = pixels[x + ((pxlh - 1) * pxlw) - (y * pxlw)];
            pixels[x + ((pxlh - 1) * pxlw) - (y * pxlw)] = temp;
        }
    }
    
    stbtt_PackEnd(&pack_c);
    
Simon Anciaux
1363 posts
is this a good way to invert bitmap?
As far as I know stb_truetype doesn't provide a way to flip the atlas vertically. I have a similar thing in my code to invert the atlas.

Do you have a particular reason for setting the oversampling to 8 and 8 ? It seems overkill and I don't think it will improve the quality (it'll probably decrease it depending on how you render, but I haven't tested this in a long time) and it will take 64 times (8*8) the memory of a non over-sampled font. In my code I use 2 and 2 which seems fine.
107 posts
is this a good way to invert bitmap?
Okay, then i guess it won't be a "problem" to use this invert-algortihm.

This is my first time trying out this way of loading a font bitmap with stb_truetype, so im only playing around with the values,
hence the oversampling with (8, 8).

But i guess im just going to use (2, 2) or something, like u mentioned :)