forked from minhngoc25a/freetype2
Ignore empty contours in CFF glyphs.
Problem reported by Albert Astals Cid <aacid@kde.org>. * src/cff/cffgload.c (cff_builder_close_contour): Synchronize with t1_builder_close_contour.
This commit is contained in:
parent
0315bb20ce
commit
fbdf127904
|
@ -1,3 +1,12 @@
|
||||||
|
2009-04-01 Werner Lemberg <wl@gnu.org>
|
||||||
|
|
||||||
|
Ignore empty contours in CFF glyphs.
|
||||||
|
|
||||||
|
Problem reported by Albert Astals Cid <aacid@kde.org>.
|
||||||
|
|
||||||
|
* src/cff/cffgload.c (cff_builder_close_contour): Synchronize with
|
||||||
|
t1_builder_close_contour.
|
||||||
|
|
||||||
2009-03-21 Werner Lemberg <wl@gnu.org>
|
2009-03-21 Werner Lemberg <wl@gnu.org>
|
||||||
|
|
||||||
Another redundant header inclusion.
|
Another redundant header inclusion.
|
||||||
|
|
|
@ -552,27 +552,24 @@
|
||||||
cff_builder_close_contour( CFF_Builder* builder )
|
cff_builder_close_contour( CFF_Builder* builder )
|
||||||
{
|
{
|
||||||
FT_Outline* outline = builder->current;
|
FT_Outline* outline = builder->current;
|
||||||
|
FT_Int first;
|
||||||
|
|
||||||
|
|
||||||
if ( !outline )
|
if ( !outline )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* XXXX: We must not include the last point in the path if it */
|
first = outline->n_contours <= 1
|
||||||
/* is located on the first point. */
|
? 0 : outline->contours[outline->n_contours - 2] + 1;
|
||||||
|
|
||||||
|
/* We must not include the last point in the path if it */
|
||||||
|
/* is located on the first point. */
|
||||||
if ( outline->n_points > 1 )
|
if ( outline->n_points > 1 )
|
||||||
{
|
{
|
||||||
FT_Int first = 0;
|
|
||||||
FT_Vector* p1 = outline->points + first;
|
FT_Vector* p1 = outline->points + first;
|
||||||
FT_Vector* p2 = outline->points + outline->n_points - 1;
|
FT_Vector* p2 = outline->points + outline->n_points - 1;
|
||||||
FT_Byte* control = (FT_Byte*)outline->tags + outline->n_points - 1;
|
FT_Byte* control = (FT_Byte*)outline->tags + outline->n_points - 1;
|
||||||
|
|
||||||
|
|
||||||
if ( outline->n_contours > 1 )
|
|
||||||
{
|
|
||||||
first = outline->contours[outline->n_contours - 2] + 1;
|
|
||||||
p1 = outline->points + first;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* `delete' last point only if it coincides with the first */
|
/* `delete' last point only if it coincides with the first */
|
||||||
/* point and if it is not a control point (which can happen). */
|
/* point and if it is not a control point (which can happen). */
|
||||||
if ( p1->x == p2->x && p1->y == p2->y )
|
if ( p1->x == p2->x && p1->y == p2->y )
|
||||||
|
@ -581,8 +578,18 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( outline->n_contours > 0 )
|
if ( outline->n_contours > 0 )
|
||||||
outline->contours[outline->n_contours - 1] =
|
{
|
||||||
(short)( outline->n_points - 1 );
|
/* Don't add contours only consisting of one point, i.e., */
|
||||||
|
/* check whether begin point and last point are the same. */
|
||||||
|
if ( first == outline->n_points - 1 )
|
||||||
|
{
|
||||||
|
outline->n_contours--;
|
||||||
|
outline->n_points--;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
outline->contours[outline->n_contours - 1] =
|
||||||
|
(short)( outline->n_points - 1 );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue