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

Reply via email to