I've figured out what the problem was already. I also forgot to mention I
was using absolute latest version of freetype from git, but that doesn't
matter.

The problem was that I was loading the face from memory. The data (binary
font data) I passed to that function was getting garbage collected due to
it not being referenced anywhere. (embarrassing!)



On Tue, Sep 17, 2013 at 12:31 AM, Elias Hogstvedt
<[email protected]>wrote:

> 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