Archived

This topic is now archived and is closed to further replies.

win32 font texture creation

This topic is 5888 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

Hey. I''m trying to create a font texture, but the texture always comes out blotchy and messy, and memory ends up getting overwritten. Take a look at my (pseudo-pseudo-code) if you want. Everything that is pseudoish has already been checked out and has been found to work perfectly. // create the font, bitmap, hdc, etc. hfont = CreateFont( 16x16 ); hbitmap = CreateBitmap( 256x256 monochrome ); hdc = CreateCompatibleDC( NULL ); SelectObject( hdc, hbitmap ); SelectObject( hdc, hfont ); SetTextColor( hdc, white ); SetBkColor( hdc, black ); SetTextAlign( hdc, top-left ); // fill the bitmap with blackness. hbrush = GetStockObject( BLACK_BRUSH ); rect.right = rect.bottom = max_size; FillRect( hdc, &rect, hbrush ); DeleteObject( hbrush ); // draw all 256 characters for the font. for ( i = 0; i < 256; i++ ) { x = i - ( i / 16 * 16 ); y = i / 16 * 16; TextOut( hdc, x, y, ( char * )&i, 1 ); } pbits = new unsigned char[256 * 256 / 8]; bmi.bmiHeader.biSize = sizeof( bmi.bmiHeader ); bmi.bmiHeader.biWidth = 256; bmi.bmiHeader.biHeight = -256; bmi.bmiHeader.biPlanes = 1; bmi.bmiHeader.biBitCount = 1; bmi.bmiHeader.biCompression = BI_RGB; bmi.bmiHeader.biSizeImage = 256 * 256 / 8; // its monochrome bmi.bmiHeader.biXPelsPerMeter = 0; bmi.bmiHeader.biYPelsPerMeter = 0; bmi.bmiHeader.biClrUsed = 0; bmi.bmiHeader.biClrImportant = 0; GetDIBits( hdc, hbitmap, 0, 256, pbits, &bmi, DIB_RGB_COLORS ); DeleteDC( hdc ); DeleteObject( hfont ); DeleteObject( hbitmap ); now pbits should contain the monochrome bits for the font texture. However, the bitmap is messy with blotches all over the place, in a different manner each time I run the program. Any ideas? Thanks, BlueGrass

Share this post


Link to post
Share on other sites
pbits = new unsigned char[256 * 256 / 8];
bmi.bmiHeader.biSizeImage = 256 * 256 / 8;

That''s technically the right way to allocate exactly enough memory for a 256x256 monochromeimage, but then you''d have to fill it by setting each bit, which GetDIBits does not, it sets each BYTE as filled or not, so remove the / 8 part and you''ll have enough memory

------------
- outRider -

Share this post


Link to post
Share on other sites