shithub: freetype+ttf2subf

Download patch

ref: 5556dd21309171492c3c17275675b597a0a6ba9a
parent: 8439fe85757e391d833246c9e4940730836b119a
author: Werner Lemberg <[email protected]>
date: Tue Mar 21 16:36:33 EST 2006

* src/base/ftoutln.c (FT_Outline_Get_Orientation): Improve
algorithm.

git/fs: mount .git/fs: mount/attach disallowed
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2006-03-21  Zhe Su  <[email protected]>
+
+	* src/base/ftoutln.c (FT_Outline_Get_Orientation): Improve
+	algorithm.
+
 2006-03-21  Werner Lemberg  <[email protected]>
 
 	* src/cff/cfftypes.h (CFF_CharsetRec): Add `max_cid' member.
--- a/src/base/ftoutln.c
+++ b/src/base/ftoutln.c
@@ -955,8 +955,11 @@
           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;
 
       /* skip degenerate contours */
@@ -963,16 +966,27 @@
       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, 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 )
@@ -980,6 +994,23 @@
 
     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 ) )