Commit 06174dbb207aa782e2a2827a2f52d7f1369b3d3f

Alexei Podtelezhnikov 2012-12-19T22:46:27

[base] Clean up trigonometric core. * src/base/fttrrigon.c (ft_trig_pseudo_polarize): Align algorithm with `ft_trig_pseudo_rotate'.

diff --git a/ChangeLog b/ChangeLog
index a112602..a6198eb 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2012-12-19  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[base] Clean up trigonometric core.
+
+	* src/base/fttrrigon.c (ft_trig_pseudo_polarize): Align algorithm
+	with `ft_trig_pseudo_rotate'.
+
 2012-12-18  Infinality  <infinality@infinality.net>
 
 	[truetype] Minor performance enhancement.
diff --git a/src/base/fttrigon.c b/src/base/fttrigon.c
index a638f8c..4aeb565 100644
--- a/src/base/fttrigon.c
+++ b/src/base/fttrigon.c
@@ -260,9 +260,9 @@
   static void
   ft_trig_pseudo_polarize( FT_Vector*  vec )
   {
-    FT_Fixed         theta;
-    FT_Fixed         yi, i;
-    FT_Fixed         x, y;
+    FT_Angle         theta;
+    FT_Int           i;
+    FT_Fixed         x, y, xtemp;
     const FT_Fixed  *arctanptr;
 
 
@@ -283,41 +283,38 @@
 
     arctanptr = ft_trig_arctan_table;
 
-    if ( y < 0 )
+    if ( y > 0 )
     {
-      /* Rotate positive */
-      yi     = y + ( x << 1 );
-      x      = x - ( y << 1 );
-      y      = yi;
-      theta -= *arctanptr++;  /* Subtract angle */
+      xtemp  = x + ( y << 1 );
+      y      = y - ( x << 1 );
+      x      = xtemp;
+      theta += *arctanptr++;
     }
     else
     {
-      /* Rotate negative */
-      yi     = y - ( x << 1 );
-      x      = x + ( y << 1 );
-      y      = yi;
-      theta += *arctanptr++;  /* Add angle */
+      xtemp  = x - ( y << 1 );
+      y      = y + ( x << 1 );
+      x      = xtemp;
+      theta -= *arctanptr++;
     }
 
+    /* Subsequent pseudorotations, with right shifts */
     i = 0;
     do
     {
-      if ( y < 0 )
+      if ( y > 0 )
       {
-        /* Rotate positive */
-        yi     = y + ( x >> i );
-        x      = x - ( y >> i );
-        y      = yi;
-        theta -= *arctanptr++;
+        xtemp  = x + ( y >> i );
+        y      = y - ( x >> i );
+        x      = xtemp;
+        theta += *arctanptr++;
       }
       else
       {
-        /* Rotate negative */
-        yi     = y - ( x >> i );
-        x      = x + ( y >> i );
-        y      = yi;
-        theta += *arctanptr++;
+        xtemp  = x - ( y >> i );
+        y      = y + ( x >> i );
+        x      = xtemp;
+        theta -= *arctanptr++;
       }
     } while ( ++i < FT_TRIG_MAX_ITERS );