I've been learning how to use freetype with opengl but I've ran into this
problem I can't find any information about on google. I'm new to opengl as
well so excuse the newbieness!

It's called from luajit using its ffi interface but I've compiled debug
dlls so I can debug with visual studio. It tells me it crashes in the
function "static FT_UInt tt_cmap4_char_map_binary" here:
___________________________________________________________________
....
    1104   p = cmap->data + 6;
 > 1105   num_segs2 = FT_PAD_FLOOR( TT_PEEK_USHORT( p ), 2 );
......
___________________________________________________________________

Where visual studio says p is a bad pointer. ( Unhandled exception at
0x0f814c0c (libfreetype_d.dll) in luajit.exe: 0xC0000005: Access violation
reading location 0x7bcf581a. )

I've tried compiling both mt and st release but it happens with both.

The font I'm using is unifont.ttf. I've also tried other fonts but it's the
same.

It's hard to show related code, so instead I made something that logs all
freetype calls instead:
____________________________________________________
0 = FT_Init_FreeType(cdata<struct FT_LibraryRec_ *[1]>: 0x02fc0058)
0 = FT_New_Memory_Face(cdata<struct FT_LibraryRec_ *>: 0x041bb858, *unifont.ttf
binary content*, 13552768, 0, cdata<struct FT_FaceRec_ *[1]>: 0x05d3d440)
0 = FT_Set_Char_Size(cdata<struct FT_FaceRec_ *>: 0x041c64c0, 0, 1008, 72,
72)
___________________________________________________________________

Then it crashes calling "FT_Get_Char_Index(cdata<struct FT_FaceRec_ *>:
0x041c64c0, 230)"

A successful run looks like this:
___________________________________________________________________
0 = FT_Init_FreeType(cdata<struct FT_LibraryRec_ *[1]>: 0x03118450)
0 = FT_New_Memory_Face(cdata<struct FT_LibraryRec_ *>: 0x03bfe0f0, *unifont.ttf
binary content*, 13552768, 0, cdata<struct FT_FaceRec_ *[1]>: 0x0309de80)
0 = FT_Set_Char_Size(cdata<struct FT_FaceRec_ *>: 0x03c0a1a8, 0, 1008, 72,
72)
232 = FT_Get_Char_Index(cdata<struct FT_FaceRec_ *>: 0x03c0a1a8, 230)
0 = FT_Load_Glyph(cdata<struct FT_FaceRec_ *>: 0x03c0a1a8, 232, 0)
0 = FT_Render_Glyph(cdata<struct FT_GlyphSlotRec_ *>: 0x00bec2e8, 0)
250 = FT_Get_Char_Index(cdata<struct FT_FaceRec_ *>: 0x03c0a1a8, 248)
0 = FT_Load_Glyph(cdata<struct FT_FaceRec_ *>: 0x03c0a1a8, 250, 0)
0 = FT_Render_Glyph(cdata<struct FT_GlyphSlotRec_ *>: 0x00bec2e8, 0)
231 = FT_Get_Char_Index(cdata<struct FT_FaceRec_ *>: 0x03c0a1a8, 229)
0 = FT_Load_Glyph(cdata<struct FT_FaceRec_ *>: 0x03c0a1a8, 231, 0)
0 = FT_Render_Glyph(cdata<struct FT_GlyphSlotRec_ *>: 0x00bec2e8, 0)
127 = FT_Get_Char_Index(cdata<struct FT_FaceRec_ *>: 0x03c0a1a8, 124)
0 = FT_Load_Glyph(cdata<struct FT_FaceRec_ *>: 0x03c0a1a8, 127, 0)
0 = FT_Render_Glyph(cdata<struct FT_GlyphSlotRec_ *>: 0x00bec2e8, 0)
114 = FT_Get_Char_Index(cdata<struct FT_FaceRec_ *>: 0x03c0a1a8, 111)
0 = FT_Load_Glyph(cdata<struct FT_FaceRec_ *>: 0x03c0a1a8, 114, 0)
0 = FT_Render_Glyph(cdata<struct FT_GlyphSlotRec_ *>: 0x00bec2e8, 0)
115 = FT_Get_Char_Index(cdata<struct FT_FaceRec_ *>: 0x03c0a1a8, 112)
0 = FT_Load_Glyph(cdata<struct FT_FaceRec_ *>: 0x03c0a1a8, 115, 0)
0 = FT_Render_Glyph(cdata<struct FT_GlyphSlotRec_ *>: 0x00bec2e8, 0)
118 = FT_Get_Char_Index(cdata<struct FT_FaceRec_ *>: 0x03c0a1a8, 115)
0 = FT_Load_Glyph(cdata<struct FT_FaceRec_ *>: 0x03c0a1a8, 118, 0)
0 = FT_Render_Glyph(cdata<struct FT_GlyphSlotRec_ *>: 0x00bec2e8, 0)
26024 = FT_Get_Char_Index(cdata<struct FT_FaceRec_ *>: 0x03c0a1a8, 27721)
0 = FT_Load_Glyph(cdata<struct FT_FaceRec_ *>: 0x03c0a1a8, 26024, 0)
0 = FT_Render_Glyph(cdata<struct FT_GlyphSlotRec_ *>: 0x00bec2e8, 0)
34124 = FT_Get_Char_Index(cdata<struct FT_FaceRec_ *>: 0x03c0a1a8, 35821)
0 = FT_Load_Glyph(cdata<struct FT_FaceRec_ *>: 0x03c0a1a8, 34124, 0)
0 = FT_Render_Glyph(cdata<struct FT_GlyphSlotRec_ *>: 0x00bec2e8, 0)
50 = FT_Get_Char_Index(cdata<struct FT_FaceRec_ *>: 0x03c0a1a8, 47)
0 = FT_Load_Glyph(cdata<struct FT_FaceRec_ *>: 0x03c0a1a8, 50, 0)
0 = FT_Render_Glyph(cdata<struct FT_GlyphSlotRec_ *>: 0x00bec2e8, 0)
26753 = FT_Get_Char_Index(cdata<struct FT_FaceRec_ *>: 0x03c0a1a8, 28450)
0 = FT_Load_Glyph(cdata<struct FT_FaceRec_ *>: 0x03c0a1a8, 26753, 0)
0 = FT_Render_Glyph(cdata<struct FT_GlyphSlotRec_ *>: 0x00bec2e8, 0)
33789 = FT_Get_Char_Index(cdata<struct FT_FaceRec_ *>: 0x03c0a1a8, 35486)
0 = FT_Load_Glyph(cdata<struct FT_FaceRec_ *>: 0x03c0a1a8, 33789, 0)
0 = FT_Render_Glyph(cdata<struct FT_GlyphSlotRec_ *>: 0x00bec2e8, 0)
___________________________________________________________________

The text I'm getting glyph information from is "æøå|ops汉语/漢語" and it
renders successfully in opengl when doesn't crash.
_______________________________________________
Freetype mailing list
[email protected]
https://lists.nongnu.org/mailman/listinfo/freetype

Reply via email to