freetype
[Top][All Lists]
Advanced

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

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


From: David Turner
Subject: Re: [ft] [2.3.4] crash on windows rendering ttf fonts
Date: Mon, 21 May 2007 10:12:39 +0200

Hello,

you don't even tell us where your code crashes, this is not very informative... 
:(

your code assumes that all bitmaps returned by FT_Load_Glyph/FT_Render_Glyph
are 8-bit gray-maps. This is not the case, since FT_Load_Glyph might return
a 1-bit bitmap if one is found in the font file. Use the FT_LOAD_NO_BITMAP flag
to disable this feature when loading glyphs.

Second, you shouldn't use bitmap.width but bitmap.pitch to compute the source 
pixel
position, as in:

  char*  buffer = bitmap.buffer;
  int    pitch  = bitmap.pitch;

  if (pitch < 0)
    buffer -= (bitmap.rows-1)*pitch;

  ....
  src_off = dx + dy*pitch;


Hope this helps,

- David Turner
- The FreeType Project  (www.freetype.org)


On Sun, 20 May 2007 02:06:28 +0200, "Christopher Lux" <address@hidden> said:
> 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
> 
> 
> _______________________________________________
> Freetype mailing list
> address@hidden
> http://lists.nongnu.org/mailman/listinfo/freetype




reply via email to

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