freetype-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[freetype2] master 028b0d5c1: * src/raster/ftraster.c (Line_Up): Updated


From: Werner Lemberg
Subject: [freetype2] master 028b0d5c1: * src/raster/ftraster.c (Line_Up): Updated and fixed up.
Date: Fri, 10 Nov 2023 23:34:19 -0500 (EST)

branch: master
commit 028b0d5c1be1b1fe9305e073760ba6ac614ba6d8
Author: Alexei Podtelezhnikov <apodtele@gmail.com>
Commit: Alexei Podtelezhnikov <apodtele@gmail.com>

    * src/raster/ftraster.c (Line_Up): Updated and fixed up.
    
    This largely synchronizes the entries into `Line_Up` and `Bezier_Up`.
    Minor bugs in the remainder calculations and accumulations are fixed.
---
 src/raster/ftraster.c | 128 +++++++++++++++++++++-----------------------------
 1 file changed, 54 insertions(+), 74 deletions(-)

diff --git a/src/raster/ftraster.c b/src/raster/ftraster.c
index 6725af0a3..dd3858aea 100644
--- a/src/raster/ftraster.c
+++ b/src/raster/ftraster.c
@@ -927,107 +927,87 @@
                     Long  miny,
                     Long  maxy )
   {
-    Long   Dx, Dy;
-    Int    e1, e2, f1, f2, size;
-    Long   Ix, Rx, Ax;
+    Long  e, e2, Dx, Dy;
+    Long  Ix, Rx, Ax;
+    Int   size;
 
-    PLong  top;
+    PLong top;
 
 
-    Dx = x2 - x1;
-    Dy = y2 - y1;
+    top = ras.top;
 
-    if ( Dy <= 0 || y2 < miny || y1 > maxy )
-      return SUCCESS;
+    if ( y2 == y1 || y2 < miny || y1 > maxy )
+      goto Fin;
 
-    if ( y1 < miny )
-    {
-      /* Take care: miny-y1 can be a very large value; we use     */
-      /*            a slow MulDiv function to avoid clipping bugs */
-      x1 += SMulDiv( Dx, miny - y1, Dy );
-      e1  = (Int)TRUNC( miny );
-      f1  = 0;
-    }
-    else
-    {
-      e1 = (Int)TRUNC( y1 );
-      f1 = (Int)FRAC( y1 );
-    }
+    e2 = y2 > maxy ? maxy : FLOOR( y2 );
+    e  = y1 < miny ? miny : CEILING( y1 );
 
-    if ( y2 > maxy )
-    {
-      /* x2 += FMulDiv( Dx, maxy - y2, Dy );  UNNECESSARY */
-      e2  = (Int)TRUNC( maxy );
-      f2  = 0;
-    }
-    else
+    if ( ras.fresh )
     {
-      e2 = (Int)TRUNC( y2 );
-      f2 = (Int)FRAC( y2 );
+      ras.cProfile->start = (Int)TRUNC( e );
+      ras.fresh = FALSE;
     }
 
-    if ( f1 > 0 )
-    {
-      if ( e1 == e2 )
-        return SUCCESS;
-      else
-      {
-        x1 += SMulDiv( Dx, ras.precision - f1, Dy );
-        e1 += 1;
-      }
-    }
-    else
-      if ( ras.joint )
-      {
-        ras.top--;
-        ras.joint = FALSE;
-      }
+    if ( y1 == e && ras.joint )
+      top--;
 
-    ras.joint = (char)( f2 == 0 );
+    ras.joint = (Bool)( y2 == e2 );
 
-    if ( ras.fresh )
-    {
-      ras.cProfile->start = e1;
-      ras.fresh           = FALSE;
-    }
+    if ( e2 < e )
+      goto Fin;
 
-    size = e2 - e1 + 1;
-    if ( ras.top + size >= ras.maxBuff )
+    size = (Int)TRUNC( e2 - e ) + 1;
+
+    if ( top + size >= ras.maxBuff )
     {
       ras.error = FT_THROW( Raster_Overflow );
       return FAILURE;
     }
 
-    if ( Dx > 0 )
-    {
-      Ix = SMulDiv_No_Round( ras.precision, Dx, Dy );
-      Rx = ( ras.precision * Dx ) % Dy;
-      Dx = 1;
-    }
-    else
+    Dx = x2 - x1;
+    Dy = y2 - y1;
+
+    if ( Dx == 0 )  /* very easy */
     {
-      Ix = -SMulDiv_No_Round( ras.precision, -Dx, Dy );
-      Rx = ( ras.precision * -Dx ) % Dy;
-      Dx = -1;
+      do
+        *top++ = x1;
+      while ( --size );
+      goto Fin;
     }
 
-    Ax  = -Dy;
-    top = ras.top;
+    Ix     = SMulDiv_No_Round( e - y1, Dx, Dy );
+    x1    += Ix;
+    *top++ = x1;
 
-    while ( size > 0 )
+    if ( --size )
     {
-      *top++ = x1;
+      Ax = Dx * ( e - y1 )    - Dy * Ix;  /* remainder */
+      Ix = FMulDiv( ras.precision, Dx, Dy );
+      Rx = Dx * ras.precision - Dy * Ix;  /* remainder */
+      Dx = 1;
 
-      x1 += Ix;
-      Ax += Rx;
-      if ( Ax >= 0 )
+      if ( x2 < x1 )
       {
-        Ax -= Dy;
-        x1 += Dx;
+        Ax = -Ax;
+        Rx = -Rx;
+        Dx = -Dx;
       }
-      size--;
+
+      do
+      {
+        x1 += Ix;
+        Ax += Rx;
+        if ( Ax >= Dy )
+        {
+          Ax -= Dy;
+          x1 += Dx;
+        }
+        *top++ = x1;
+      }
+      while ( --size );
     }
 
+  Fin:
     ras.top = top;
     return SUCCESS;
   }



reply via email to

[Prev in Thread] Current Thread [Next in Thread]