Hi,
Attached is a patch against 2.1.10 to prevent
FT_Outline_Get_Orientation() from getting wrong result in some
situation. Please refer to
https://bugzilla.novell.com/show_bug.cgi?id=158573 for details.
This patch can be applied to cvs head as well.
Regards
James Su
diff -ur freetype-2.1.10.built/src/base/ftoutln.c freetype-2.1.10/src/base/ftoutln.c
--- freetype-2.1.10.built/src/base/ftoutln.c 2006-03-18 01:01:26.000000000 +0800
+++ freetype-2.1.10/src/base/ftoutln.c 2006-03-18 01:06:18.000000000 +0800
@@ -778,7 +778,10 @@
contour++, first = last + 1 )
{
FT_Vector* point;
-
+ FT_Int on_curve;
+ FT_Int on_curve_count = 0;
+ FT_Pos tmp_xmin = 32768L;
+ FT_Vector* tmp_xmin_point = NULL;
last = outline->points + *contour;
@@ -786,16 +789,28 @@
if ( last < first + 2 )
continue;
- for ( point = first; point <= last; point++ )
+ for ( point = first; point <= last; ++point )
{
- if ( point->x < xmin )
+ /* Count on curve points, if there are less than 3 on curve points,
+ then just bypass this contour.
+ */
+ on_curve = (outline->tags [point - outline->points] & 1);
+ on_curve_count += on_curve;
+
+ if ( point->x < tmp_xmin && on_curve)
{
- xmin = point->x;
- xmin_point = point;
- xmin_first = first;
- xmin_last = last;
+ tmp_xmin = point->x;
+ tmp_xmin_point = point;
}
}
+
+ if (on_curve_count > 2 && tmp_xmin < xmin)
+ {
+ xmin = tmp_xmin;
+ xmin_point = tmp_xmin_point;
+ xmin_first = first;
+ xmin_last = last;
+ }
}
if ( !xmin_point )
@@ -804,6 +819,19 @@
prev = ( xmin_point == xmin_first ) ? xmin_last : xmin_point - 1;
next = ( xmin_point == xmin_last ) ? xmin_first : xmin_point + 1;
+ /* Skip off curve points */
+ while ((outline->tags [prev - outline->points] & 1) == 0)
+ {
+ if (prev == xmin_first) prev = xmin_last;
+ else --prev;
+ }
+
+ while ((outline->tags [next - outline->points] & 1) == 0)
+ {
+ if (next == xmin_last) next = xmin_first;
+ else ++next;
+ }
+
if ( FT_Atan2( prev->x - xmin_point->x, prev->y - xmin_point->y ) >
FT_Atan2( next->x - xmin_point->x, next->y - xmin_point->y ) )
return FT_ORIENTATION_POSTSCRIPT;
_______________________________________________
Freetype-devel mailing list
[email protected]
http://lists.nongnu.org/mailman/listinfo/freetype-devel