When attempting to obtain a GlyphVector for a font, our Gtk+
peer calls FT_Outline_Decompose on the outline of the font's glyph.
However, this fails, causing a segmentation fault, if the font
is a bitmap font. This patch adds a check to ensure the outline
is valid before using it. For a full fix, we should really return
some form of outline for a bitmapped font.
ChangeLog:
2008-12-09 Andrew John Hughes <[EMAIL PROTECTED]>
PR classpath/38473:
* native/jni/gtk-peer/gnu_java_awt_peer_gtk_FreetypeGlyphVector.c:
(Java_gnu_java_awt_peer_gtk_FreetypeGlyphVector_getGlyphOutlineNative):
Check that the glyph is an outline before calling
FT_Outline_Decompose.
--
Andrew :)
Support Free Java!
Contribute to GNU Classpath and the OpenJDK
http://www.gnu.org/software/classpath
http://openjdk.java.net
PGP Key: 94EFD9D8 (http://subkeys.pgp.net)
Fingerprint = F8EF F1EA 401E 2E60 15FA 7927 142C 2591 94EF D9D8
Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_FreetypeGlyphVector.c
===================================================================
RCS file:
/sources/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_FreetypeGlyphVector.c,v
retrieving revision 1.10
diff -u -u -r1.10 gnu_java_awt_peer_gtk_FreetypeGlyphVector.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_FreetypeGlyphVector.c 6 Nov
2008 11:33:19 -0000 1.10
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_FreetypeGlyphVector.c 10 Dec
2008 21:47:17 -0000
@@ -385,8 +385,22 @@
}
FT_Get_Glyph( ft_face->glyph, &glyph );
- FT_Outline_Decompose (&(((FT_OutlineGlyph)glyph)->outline),
- &ftCallbacks, path);
+ if (glyph->format == FT_GLYPH_FORMAT_OUTLINE)
+ {
+ FT_Outline_Decompose (&(((FT_OutlineGlyph)glyph)->outline),
+ &ftCallbacks, path);
+ }
+ else
+ {
+ char format[4];
+
+ format[0] = (glyph->format & 0xFF000000) >> 24;
+ format[1] = (glyph->format & 0x00FF0000) >> 16;
+ format[2] = (glyph->format & 0x0000FF00) >> 8;
+ format[3] = (glyph->format & 0x000000FF);
+ printf("WARNING: Unable to create outline for font %s %s of format %s\n",
+ ft_face->family_name, ft_face->style_name, format);
+ }
FT_Done_Glyph( glyph );
pango_fc_font_unlock_face( font );