* src/type1/t1objs.c (T1_Face_Init): fixed a bug that crashed the library when dealing with certain weird fonts (like "Stalingrad", in "sadn.pfb". This font has no full font name entry.. ) * src/base/ftoutln.c, include/freetype/ftoutln.h: added the FT_Outline_Check API to check the consistency of outline data * src/base/ftobjs.c (FT_Load_Glyph): added a call to the new FT_Outline_Check to ensure that loaded glyphs are valid. This allows certain fonts like "tt1095m_.ttf" to be loaded even though it appears they contain really funky glyphs.. there still is a bug there though.. !!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179
diff --git a/ChangeLog b/ChangeLog
index 8e8f4ee..7f68f47 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,20 @@
+2002-01-03 David Turner <david@freetype.org>
+
+ * src/type1/t1objs.c (T1_Face_Init): fixed a bug that crashed the
+ library when dealing with certain weird fonts (like "Stalingrad",
+ in "sadn.pfb". This font has no full font name entry.. )
+
+ * src/base/ftoutln.c, include/freetype/ftoutln.h: added the
+ FT_Outline_Check API to check the consistency of outline data
+
+ * src/base/ftobjs.c (FT_Load_Glyph): added a call to the new
+ FT_Outline_Check to ensure that loaded glyphs are valid. This
+ allows certain fonts like "tt1095m_.ttf" to be loaded even though
+ it appears they contain really funky glyphs..
+
+ there still is a bug there though.. !!
+
+
2001-12-30 David Turner <david@freetype.org>
* src/autohint/ahhint.c (ah_hinter_load): Fix advance width
diff --git a/include/freetype/ftoutln.h b/include/freetype/ftoutln.h
index 9dc1c64..fcf527a 100644
--- a/include/freetype/ftoutln.h
+++ b/include/freetype/ftoutln.h
@@ -181,6 +181,24 @@ FT_BEGIN_HEADER
/*************************************************************************/
/* */
/* <Function> */
+ /* FT_Outline_Check */
+ /* */
+ /* <Description> */
+ /* Check the content of an outline descriptor */
+ /* */
+ /* <Input> */
+ /* outline :: handle to source outline */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Outline_Check( FT_Outline* outline );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
/* FT_Outline_Get_CBox */
/* */
/* <Description> */
diff --git a/src/base/ftobjs.c b/src/base/ftobjs.c
index b11ab7f..28b25fc 100644
--- a/src/base/ftobjs.c
+++ b/src/base/ftobjs.c
@@ -906,12 +906,19 @@
glyph_index, load_flags );
}
else
+ {
error = driver->clazz->load_glyph( slot,
face->size,
glyph_index,
load_flags );
- if ( error )
- goto Exit;
+ if ( error )
+ goto Exit;
+
+ /* check that the loaded outline is correct !! */
+ error = FT_Outline_Check( &slot->outline );
+ if ( error )
+ goto Exit;
+ }
Load_Ok:
/* compute the advance */
diff --git a/src/base/ftoutln.c b/src/base/ftoutln.c
index c7e3c08..18c8d77 100644
--- a/src/base/ftoutln.c
+++ b/src/base/ftoutln.c
@@ -299,6 +299,49 @@
/* documentation is in ftoutln.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Outline_Check( FT_Outline* outline )
+ {
+ if ( outline )
+ {
+ FT_Int n_points = outline->n_points;
+ FT_Int n_contours = outline->n_contours;
+ FT_Int end0, end;
+ FT_Int n;
+
+ /* empty glyph ?? */
+ if ( n_points == 0 && n_contours == 0 )
+ return 0;
+
+ /* check point and contour counts */
+ if ( n_points <= 0 || n_contours <= 0 )
+ goto Bad;
+
+ end0 = -1;
+ for ( n = 0; n < n_contours; n++ )
+ {
+ end = outline->contours[n];
+
+ /* note that we don't accept empty contours */
+ if ( end <= end0 || end >= n_points )
+ goto Bad;
+
+ end0 = end;
+ }
+
+ if ( end != n_points-1 )
+ goto Bad;
+
+ /* XXX: check the that array */
+ return 0;
+ }
+ Bad:
+ return FT_Err_Invalid_Argument;
+ }
+
+
+ /* documentation is in ftoutln.h */
FT_EXPORT_DEF( FT_Error )
FT_Outline_Copy( FT_Outline* source,
diff --git a/src/truetype/ttgload.c b/src/truetype/ttgload.c
index dd10779..32cc4fb 100644
--- a/src/truetype/ttgload.c
+++ b/src/truetype/ttgload.c
@@ -1034,7 +1034,8 @@
{
FT_TRACE0(( "Too many instructions (%d) in composite glyph %ld\n",
n_ins, subglyph->index ));
- return TT_Err_Too_Many_Hints;
+ error = TT_Err_Too_Many_Hints;
+ goto Fail;
}
/* read the instructions */
diff --git a/src/type1/t1objs.c b/src/type1/t1objs.c
index 4d4faf0..8335f6c 100644
--- a/src/type1/t1objs.c
+++ b/src/type1/t1objs.c
@@ -365,15 +365,19 @@
char* full = face->type1.font_info.full_name;
char* family = root->family_name;
-
- while ( *family && *full == *family )
+ if ( full )
{
- family++;
- full++;
+ while ( *family && *full == *family )
+ {
+ family++;
+ full++;
+ }
+
+ root->style_name = ( *full == ' ' ? full + 1
+ : (char *)"Regular" );
}
-
- root->style_name = ( *full == ' ' ? full + 1
- : (char *)"Regular" );
+ else
+ root->style_name = "Regular";
}
else
{