Commit db3ac3b3604abbf8348c06c1f130dac636ebad82

David Turner 2002-01-09T10:48:25

small speed-up to the anti-aliased renderer

diff --git a/ChangeLog b/ChangeLog
index c48fb80..c6456e9 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2002-01-09  Maxim Shemanarev  <mcseemagg@yahoo.com>
+
+        * src/smooth/ftgrays.c (gray_render_line): small optimisation to
+        the smooth anti-aliased renderer that deals with vertical segments.
+        This results in a 5-7% speedup in rendering speed..
+
 2002-01-08  David Turner  <david@freetype.org>
 
 	* configure, install: added some wrapper scripts to make
diff --git a/src/smooth/ftgrays.c b/src/smooth/ftgrays.c
index d935338..edd8b0e 100644
--- a/src/smooth/ftgrays.c
+++ b/src/smooth/ftgrays.c
@@ -635,6 +635,45 @@
       goto End;
     }
 
+    /* vertical line - avoids calling gray_render_scanline */
+    incr = 1;
+
+    if( dx == 0 )
+    {
+      TScan ex     = TRUNC( ras.x );
+      TScan two_fx = ( ras.x - SUBPIXELS( ex ) ) << 1;
+      TPos  area;
+
+      first = ONE_PIXEL;
+      if( dy < 0 )
+      {
+        first = 0;
+        incr  = -1;
+      }
+
+      delta      = first - fy1;
+      ras.area  += (TArea)two_fx * delta;
+      ras.cover += delta;
+      ey1       += incr;
+
+      gray_set_cell( raster, ex, ey1 );
+
+      delta = first + first - ONE_PIXEL;
+      area  = (TArea)two_fx * delta;
+      while( ey1 != ey2 )
+      {
+        ras.area  += area;
+        ras.cover += delta;
+        ey1       += incr;
+        gray_set_cell( raster, ex, ey1 );
+      }
+
+      delta      = fy2 - ONE_PIXEL + first;
+      ras.area  += (TArea)two_fx * delta;
+      ras.cover += delta;
+      goto End;
+    }
+
     /* ok, we have to render several scanlines */
     p     = ( ONE_PIXEL - fy1 ) * dx;
     first = ONE_PIXEL;