freetype
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[ft] [2.3.4] crash on windows rendering ttf fonts


From: Christopher Lux
Subject: [ft] [2.3.4] crash on windows rendering ttf fonts
Date: Sun, 20 May 2007 02:06:28 +0200
User-agent: Opera Mail/9.20 (Win32)

hi,
i have a strange crash on windows (visual studio 2005 sp1) with the following 
code:

the strange thing is, do i comment out the copy of the bitmap buffer in the 
loop at the middle the crash does not occur. i checked everything twice, all 
indices are correct. i also tried the NeHe demo for freetype font loading for 
opengl rendering [1] with the cour.ttf file and the crash also occured there 
(using freetype 2.1.4). also strange is that the crash occurs at different 
character codes with different ttf files. the courier ttf crashes very early 
(around 144).

please, if someone knows any workarounds let me know...

-chris

[1] http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=43

bool init_font_rendering()
{
     // soon to be parameters
     std::string     _font_file_name         = 
std::string("C:/WINDOWS/fonts/cour.ttf");//consola.ttf");//
     unsigned        _font_pixel_size        = 12;
     unsigned        _display_dpi_resolution = 96;

     FT_Library      ft_lib;

     // initialize freetype
     if (FT_Init_FreeType(&ft_lib) != 0) {
         std::cout << "error initializing freetype library" << std::endl;
         return (false);
     }

     // load font face
     FT_Face         ft_face;
     if (FT_New_Face(ft_lib, _font_file_name.c_str(), 0, &ft_face) != 0) {
         std::cout << "error loading font file (" << _font_file_name << ")" << 
std::endl;
         return (false);
     }

     // rendering the font bullshit into a texture
     if (FT_Set_Char_Size(ft_face, 0, _font_pixel_size << 6, 0, 
_display_dpi_resolution) != 0) {
     //if (FT_Set_Pixel_Sizes(ft_face, 0, _font_pixel_size) != 0) {
         std::cout << "error setting font sizes" << std::endl;
         return (false);
     }

     unsigned font_glyph_size_x  = ft_face->size->metrics.max_advance >> 6;
     unsigned font_glyph_size_y  = ft_face->size->metrics.height >> 6;

     unsigned font_tex_size_x    = font_glyph_size_x * 16u;
     unsigned font_tex_size_y    = font_glyph_size_y * 16u;

     unsigned char*   font_tex = new unsigned char[font_tex_size_x * 
font_tex_size_y];

     // clear texture background to black
     memset(font_tex, 0u, font_tex_size_x * font_tex_size_y);

     unsigned dst_x, dst_y;

     for (int i = 0; i < 256; ++i) {
         if(FT_Load_Glyph(ft_face, FT_Get_Char_Index(ft_face, i), 
FT_LOAD_DEFAULT)) {
             std::cout << "error loading glyph at char code: " << i << 
std::endl;
         }
         else {
             if (FT_Render_Glyph(ft_face->glyph, FT_RENDER_MODE_NORMAL)) {
                 std::cout << "error rendering glyph at char code: " << i << 
std::endl;
             }
             FT_Bitmap& bitmap = ft_face->glyph->bitmap;

             dst_x = (i & 0x0F) * font_glyph_size_x;
             dst_y = (i >> 4)   * font_glyph_size_y;

             //std::cout << i << " w: " << bitmap.width << "\th: " << 
bitmap.rows << "\tp: " << bitmap.pitch << std::endl;

             for (int dy = 0; dy < bitmap.rows; ++dy) {
                 for (int dx = 0; dx < bitmap.width; ++dx) {

                     unsigned src_off = dx + dy * bitmap.width;
                     unsigned dst_off = (dst_x + dx) + (dst_y + dy) * 
font_tex_size_y;

                     font_tex[dst_off] = bitmap.buffer[src_off];
                 }
             }

         }
     }


     // shutdown font face
     if (FT_Done_Face(ft_face) != 0) {
         std::cout << "error closing font face" << std::endl;
         return (false);
     }

     // shutfdown freetype
     if (FT_Done_FreeType(ft_lib) != 0) {
         std::cout << "error shutting down freetype library" << std::endl;
     }

     return (true);
}

-- 
Christopher Lux |
                 | Bauhaus University Weimar
                 | Faculty of Media - Virtual Reality Systems Group




reply via email to

[Prev in Thread] Current Thread [Next in Thread]