Commit adf07a930cb0ce44a57018a2c5edbc9ac8916d88

David Turner 2001-10-30T23:51:24

* src/smooth/ftgrays.c: adding experimental "gamma" support. This produces smoother glyphs at small sizes for very little cost * src/autohint/ahglyph.c, src/autohint/ahhint.c: various fixes to the auto-hinter. They merely improve the output of sans-serif fonts. Note that there are still problems with serifed fonts and composites (accented characters) * tests/gview.c: updated the debugging glyph viewer to show the hints generated by the "autohint" module

diff --git a/ChangeLog b/ChangeLog
index 1a3d575..e7c5239 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,17 @@
+2001-10-29  David Turner       <david@freetype.org>
+
+	* src/smooth/ftgrays.c: adding experimental "gamma" support. This
+	produces smoother glyphs at small sizes for very little cost
+	
+	* src/autohint/ahglyph.c, src/autohint/ahhint.c: various fixes to
+	the auto-hinter. They merely improve the output of sans-serif fonts.
+	Note that there are still problems with serifed fonts and composites
+	(accented characters)
+	
+	* tests/gview.c: updated the debugging glyph viewer to show the
+	hints generated by the "autohint" module
+
+
 2001-10-27  David Turner       <david@freetype.org>
 
 	* src/cache/ftchunk.c (ftc_chunk_cache_lookup): fixed a bug that
diff --git a/src/autohint/ahglyph.c b/src/autohint/ahglyph.c
index 667f830..5c2f4f7 100644
--- a/src/autohint/ahglyph.c
+++ b/src/autohint/ahglyph.c
@@ -994,7 +994,7 @@
                 dist = -dist;
 
               if ( len < 8 )
-                score = 300 + dist;
+                score = 300*8 + dist - len*3;
               else
                 score = dist + 300/len;
 
diff --git a/src/autohint/ahhint.c b/src/autohint/ahhint.c
index 11ace9f..1dd003c 100644
--- a/src/autohint/ahhint.c
+++ b/src/autohint/ahhint.c
@@ -169,10 +169,12 @@
     if ( base->flags & ah_edge_done )
     {
       if ( dist >= 64 )
-        dist = ( dist + 8 ) & -64;
+        dist = (dist+8) & -64;
 
       else if ( dist <= 32 && !vertical )
         dist = ( dist + 33 ) >> 1;
+      else
+        dist = 0;
     }
 
     serif->pos = base->pos + sign * dist;
diff --git a/src/smooth/ftgrays.c b/src/smooth/ftgrays.c
index 54a814f..031a1d9 100644
--- a/src/smooth/ftgrays.c
+++ b/src/smooth/ftgrays.c
@@ -84,6 +84,10 @@
 #include <string.h>             /* for memcpy() */
 #include <setjmp.h>
 
+
+/* experimental support for gamma correction within the rasterizer */
+#define  GRAYS_USE_GAMMA
+
   /*************************************************************************/
   /*                                                                       */
   /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
@@ -305,6 +309,10 @@
     void*    memory;
     jmp_buf  jump_buffer;
 
+#ifdef  GRAYS_USE_GAMMA
+    FT_Byte   gamma[257];
+#endif
+
   } TRaster, *PRaster;
 
 
@@ -1230,15 +1238,21 @@
 
     for ( ; count > 0; count--, spans++ )
     {
-      if ( spans->coverage )
+      FT_UInt  coverage = spans->coverage;
+
+#ifdef GRAYS_USE_GAMMA
+      coverage = raster->gamma[(FT_Byte)coverage];
+#endif
+      
+      if ( coverage )
 #if 1
-        MEM_Set( p + spans->x, (unsigned char)spans->coverage, spans->len );
+        MEM_Set( p + spans->x, (unsigned char)coverage, spans->len );
 #else /* 1 */
       {
         q     = p + spans->x;
         limit = q + spans->len;
         for ( ; q < limit; q++ )
-          q[0] = (unsigned char)spans->coverage;
+          q[0] = (unsigned char)coverage;
       }
 #endif /* 1 */
     }
@@ -1960,6 +1974,33 @@
   /**** RASTER OBJECT CREATION: In standalone mode, we simply use *****/
   /****                         a static object.                  *****/
 
+#ifdef  GRAYS_USE_GAMMA
+
+  /* initialize the "gamma" table. Yes, this is really a crummy function */
+  /* but the results look pretty good for something that simple..        */
+  /*                                                                     */
+#define  M_MAX  255
+#define  M_X    128
+#define  M_Y    96
+
+  static void
+  grays_init_gamma( PRaster  raster )
+  {
+    FT_UInt  x, a;
+    
+    for ( x = 0; x < 256; x++ )
+    {
+      if ( x <= M_X )
+        a = (x * M_Y + (M_X/2)) / M_X;
+      else
+        a = M_Y + ((x-M_X)*(M_MAX-M_Y) + (M_MAX-M_X)/2)/(M_MAX-M_X);
+      
+      raster->gamma[x] = (FT_Byte)a;
+    }
+  }
+  
+#endif /* GRAYS_USE_GAMMA */
+
 #ifdef _STANDALONE_
 
   static int
@@ -1974,6 +2015,10 @@
     *araster = (FT_Raster)&the_raster;
     MEM_Set( &the_raster, 0, sizeof ( the_raster ) );
 
+#ifdef GRAYS_USE_GAMMA
+    grays_init_gamma( (PRaster)*araster );
+#endif
+    
     return 0;
   }
 
@@ -2000,6 +2045,10 @@
     {
       raster->memory = memory;
       *araster = (FT_Raster)raster;
+
+#ifdef GRAYS_USE_GAMMA
+      grays_init_gamma( raster );
+#endif
     }
 
     return error;