shithub: freetype+ttf2subf

Download patch

ref: 0d0d78dadc9ae38aa0aafbddb5f08d381b7d27cc
parent: a95e5c62decad738707748efe78f8dba349c6d51
author: Werner Lemberg <[email protected]>
date: Tue Nov 14 05:37:10 EST 2006

formatting

git/fs: mount .git/fs: mount/attach disallowed
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,28 +1,48 @@
 2006-11-13  David Turner  <[email protected]>
 
-      * src/truetype/ttinterp.c: undefined the FIX_BYTECODE macro,
-      since the interpreter "enhancements" are still too buggy for
-      general use
+	* src/truetype/ttinterp.c (FIX_BYTECODE): Undefine.  The interpreter
+	`enhancements' are still too buggy for general use.
 
-      * src/base/ftlcdfil.c: added support for FT_FORCE_LIGHT_LCD_FILTER
-      and FT_FORCE_LEGACY_LCD_FILTER at compile time. Define these macros
-      when building the library to change the default LCD filter to be
-      used. This is only useful for experimentation
+	* src/base/ftlcdfil.c: Add support for FT_FORCE_LIGHT_LCD_FILTER and
+	FT_FORCE_LEGACY_LCD_FILTER at compile time.  Define these macros
+	when building the library to change the default LCD filter to be
+	used.  This is only useful for experimentation.
 
-      * include/freetype/ftlcdfil.h: updating documentation
+	* include/freetype/ftlcdfil.h: Update documentation.
 
 2006-11-10  David Turner  <[email protected]>
 
-       * include/freetype/ftlcdfil.h, include/internal/ftobjs.h,
-       src/base/ftlcdfilt.c, src/smooth/ftsmooth.c: API change for
-       the LCD filter, the FT_LcdFilter value is a enum describing
-       which filter to apply, new values FT_LCD_FILTER_LIGHT and
-       FT_LCD_FILTER_LEGACY (the latter implements the LibXft original
-       algorithm which produces incredible color fringes for everything
-       except very-well hinted text)
+	* src/smooth/ftsmooth.c: API change for the LCD
+	filter.  The FT_LcdFilter value is an enumeration describing which
+	filter to apply, with new values FT_LCD_FILTER_LIGHT and
+	FT_LCD_FILTER_LEGACY (the latter implements the LibXft original
+	algorithm which produces strong color fringes for everything
+	except very-well hinted text).
 
-       * src/autofit/aflatin.c: various tiny improvements that drastically
-       improve the handling of serif fonts and of LCD/LCD_V hinting modes.
+	* include/freetype/ftlcdfil.h (FT_Library_SetLcdFilter): Change
+	second parameter to an enum type.
+
+	* src/base/ftlcdfil.c (USE_LEGACY): Define.
+	(_ft_lcd_filter): Rename to...
+	(_ft_lcd_filter_fir): This.
+	Update parameters.
+	(_ft_lcd_filter_legacy) [USE_LEGACY]: New filter function.
+	(FT_Library_Set_LcdFilter): Update parameters.
+	Handle new filter modes.
+
+	* include/internal/ftobjs.h: Include FT_LCD_FILTER_H.
+	(FT_Bitmap_LcdFilterFunc): Change third argument to `FT_Library'.
+	(FT_LibraryRec) [FT_CONFIG_OPTION_SUBPIXEL_RENDERING]: Add filtering
+	callback and update other fields.
+
+	* src/smooth/ftsmooth.c (ft_smooth_render_generic)
+	[FT_CONFIG_OPTION_SUBPIXEL_RENDERING]: Update.
+	Other minor improvements.
+
+	* src/autofit/aflatin.c: Various tiny improvements that drastically
+	improve the handling of serif fonts and of LCD/LCD_V hinting modes.
+	(af_latin_hints_compute_edges): Fix typo.
+	(af_latin_compute_stem_width): Take better care of diagonal stems.
 
 2006-11-09  David Turner  <[email protected]>
 
--- a/README
+++ b/README
@@ -51,7 +51,7 @@
 
 ----------------------------------------------------------------------
 
-Copyright 2001-2006 by
+Copyright 2006 by
 David Turner, Robert Wilhelm, and Werner Lemberg.
 
 This  file is  part of  the FreeType  project, and  may only  be used,
--- a/include/freetype/ftlcdfil.h
+++ b/include/freetype/ftlcdfil.h
@@ -27,40 +27,39 @@
 FT_BEGIN_HEADER
 
 
- /****************************************************************************
-  *
-  * @func:
-  *   FT_LcdFilter
-  *
-  * @description:
-  *    a list of values used to identify various types of LCD filters
-  *
-  * @values:
-  *   FT_LCD_FILTER_NONE :: value 0 means do not perform filtering. when
-  *     used with subpixel rendering, this will result in sometimes severe
-  *     color fringes
-  *
-  *   FT_LCD_FILTER_DEFAULT ::
-  *      the default filter reduces color fringes considerably, at the cost of
-  *      a slight bluriness in the output
-  *
-  *   FT_LCD_FILTER_LIGHT ::
-  *      the light filter is a variant that produces less bluriness
-  *      at the cost of slightly more color fringes than the default one. It
-  *      might be better than the default one, depending on your monitor and
-  *      personal vision.
-  *
-  *   FT_LCD_FILTER_LEGACY ::
-  *      this filter corresponds to the original libXft color filter, this
-  *      provides high contrast output, but can exhibit really bad color fringes
-  *      if your glyphs are not extremely well hinted to the pixel grid. In
-  *      other words, it only works well when enabling the TrueType bytecode
-  *      interpreter *and* using high-quality hinted fonts. It will suck for
-  *      all other cases.
-  *
-  *      this filter is only provided for comparison purposes, and might be
-  *      disabled/unsupported in the future...
-  */
+  /****************************************************************************
+   *
+   * @func:
+   *   FT_LcdFilter
+   *
+   * @description:
+   *   A list of values to identify various types of LCD filters.
+   *
+   * @values:
+   *   FT_LCD_FILTER_NONE ::
+   *     Do not perform filtering.  When used with subpixel rendering, this
+   *     results in sometimes severe color fringes.
+   *
+   *   FT_LCD_FILTER_DEFAULT ::
+   *     The default filter reduces color fringes considerably, at the cost
+   *     of a slight blurriness in the output.
+   *
+   *   FT_LCD_FILTER_LIGHT ::
+   *     The light filter is a variant that produces less blurriness at the
+   *     cost of slightly more color fringes than the default one.  It might
+   *     be better than the default one, depending on the monitor, personal
+   *     vision, and taste.
+   *
+   *   FT_LCD_FILTER_LEGACY ::
+   *     This filter corresponds to the original libXft color filter.  It
+   *     provides high contrast output but can exhibit really bad color
+   *     fringes if glyphs are not extremely well hinted to the pixel grid. 
+   *     In other words, it only works well if the TrueType bytecode
+   *     interpreter is enabled *and* high-quality hinted fonts are used.
+   *
+   *     This filter is only provided for comparison purposes, and might be
+   *     disabled or stay unsupported in the future.
+   */
   typedef enum
   {
     FT_LCD_FILTER_NONE    = 0,
@@ -84,9 +83,11 @@
    *   @FT_RENDER_MODE_LCD or @FT_RENDER_MODE_LCD_V.
    *
    * @input:
-   *   library :: A handle to the target library instance.
+   *   library ::
+   *     A handle to the target library instance.
    *
-   *   filter  :: filter type.
+   *   filter ::
+   *     The filter type.
    *
    *     You can use @FT_LCD_FILTER_NONE here to disable this feature, or
    *     @FT_LCD_FILTER_DEFAULT to use a default filter that should work
@@ -97,8 +98,8 @@
    *
    * @note:
    *   This feature is always disabled by default.  Clients must make an
-   *   explicit call to this function with a `filter' value other
-   *   than @FT_LCD_FILTER_NONE in order to enable it.
+   *   explicit call to this function with a `filter' value other than
+   *   @FT_LCD_FILTER_NONE in order to enable it.
    *
    *   Due to *PATENTS* covering subpixel rendering, this function doesn't
    *   do anything except returning @FT_Err_Unimplemented_Feature if the
@@ -106,8 +107,8 @@
    *   defined in your build of the library, which should correspond to all
    *   default builds of the library.
    *
-   *   The filter affects glyph bitmaps rendered through FT_Render_Glyph,
-   *   @@FT_Glyph_Get_Bitmap, @FT_Load_Glyph, and FT_Load_Char.
+   *   The filter affects glyph bitmaps rendered through @FT_Render_Glyph,
+   *   @FT_Glyph_Get_Bitmap, @FT_Load_Glyph, and @FT_Load_Char.
    *
    *   It does _not_ affect the output of @FT_Outline_Render and
    *   @FT_Outline_Get_Bitmap.
--- a/src/autofit/aflatin.c
+++ b/src/autofit/aflatin.c
@@ -1538,6 +1538,7 @@
       /* strong hinting process: snap the stem width to integer pixels */
       FT_Pos  org_dist = dist;
 
+
       dist = af_latin_snap_width( axis->widths, axis->width_count, dist );
 
       if ( vertical )
@@ -1573,14 +1574,15 @@
 
           else if ( dist < 128 )
           {
-           /* ok, we're only going to round to an integer width if
-            * the corresponding distorsion is less than 1/4 pixel
-            * otherwise, this really screws everything, since the
-            * diagonals, which are not hinted, will appear a lot
-            * more bolder or thinner than the vertical stems
-            */
+            /* We only round to an integer width if the corresponding */
+            /* distortion is less than 1/4 pixel.  Otherwise this     */
+            /* makes everything worse since the diagonals, which are  */
+            /* not hinted, appear a lot bolder or thinner than the    */
+            /* vertical stems.                                        */
+
             FT_Int  delta;
 
+
             dist = ( dist + 22 ) & ~63;
             delta = dist - org_dist;
             if ( delta < 0 )
@@ -1590,7 +1592,7 @@
             {
               dist = org_dist;
               if ( dist < 48 )
-                dist = (dist + 64) >> 1;
+                dist = ( dist + 64 ) >> 1;
             }
           }
           else
--- a/src/base/ftlcdfil.c
+++ b/src/base/ftlcdfil.c
@@ -33,9 +33,9 @@
                       FT_Render_Mode  mode,
                       FT_Library      library )
   {
-    FT_Byte* weights = library->lcd_weights;
-    FT_UInt  width   = (FT_UInt)bitmap->width;
-    FT_UInt  height  = (FT_UInt)bitmap->rows;
+    FT_Byte*  weights = library->lcd_weights;
+    FT_UInt   width   = (FT_UInt)bitmap->width;
+    FT_UInt   height  = (FT_UInt)bitmap->rows;
 
 
     /* horizontal in-place FIR filter */
@@ -160,6 +160,7 @@
 
 
 #ifdef USE_LEGACY
+
   /* FIR filter used by the default and light filters */
   static void
   _ft_lcd_filter_legacy( FT_Bitmap*      bitmap,
@@ -166,19 +167,20 @@
                          FT_Render_Mode  mode,
                          FT_Library      library )
   {
-    FT_UInt  width   = (FT_UInt)bitmap->width;
-    FT_UInt  height  = (FT_UInt)bitmap->rows;
-    FT_Int   pitch   = bitmap->pitch;
+    FT_UInt  width  = (FT_UInt)bitmap->width;
+    FT_UInt  height = (FT_UInt)bitmap->rows;
+    FT_Int   pitch  = bitmap->pitch;
 
-    static const int    filters[3][3] =
+    static const int  filters[3][3] =
     {
-      { 65538*9/13, 65538*1/6,  65538*1/13 },
-      { 65538*3/13, 65538*4/6,  65538*3/13 },
-      { 65538*1/13, 65538*1/6,  65538*9/13 }
+      { 65538 * 9/13, 65538 * 1/6, 65538 * 1/13 },
+      { 65538 * 3/13, 65538 * 4/6, 65538 * 3/13 },
+      { 65538 * 1/13, 65538 * 1/6, 65538 * 9/13 }
     };
 
-    FT_UNUSED(library);
+    FT_UNUSED( library );
 
+
     /* horizontal in-place FIR filter */
     if ( mode == FT_RENDER_MODE_LCD && width >= 3 )
     {
@@ -189,6 +191,7 @@
       {
         FT_UInt  xx;
 
+
         for ( xx = 0; xx < width; xx += 3 )
         {
           FT_UInt  r = 0;
@@ -196,37 +199,40 @@
           FT_UInt  b = 0;
           FT_UInt  p;
 
+
           p  = line[xx];
-          r += filters[0][0]*p;
-          g += filters[0][1]*p;
-          b += filters[0][2]*p;
+          r += filters[0][0] * p;
+          g += filters[0][1] * p;
+          b += filters[0][2] * p;
 
-          p = line[xx+1];
-          r += filters[1][0]*p;
-          g += filters[1][1]*p;
-          b += filters[1][2]*p;
+          p  = line[xx + 1];
+          r += filters[1][0] * p;
+          g += filters[1][1] * p;
+          b += filters[1][2] * p;
 
-          p  = line[xx+2];
-          r += filters[2][0]*p;
-          g += filters[2][1]*p;
-          b += filters[2][2]*p;
+          p  = line[xx + 2];
+          r += filters[2][0] * p;
+          g += filters[2][1] * p;
+          b += filters[2][2] * p;
 
-          line[xx]   = (FT_Byte)( r / 65536 );
-          line[xx+1] = (FT_Byte)( g / 65536 );
-          line[xx+2] = (FT_Byte)( b / 65536 );
+          line[xx]     = (FT_Byte)( r / 65536 );
+          line[xx + 1] = (FT_Byte)( g / 65536 );
+          line[xx + 2] = (FT_Byte)( b / 65536 );
         }
       }
     }
     else if ( mode == FT_RENDER_MODE_LCD_V && height >= 3 )
     {
-      FT_Byte*   column = bitmap->buffer;
+      FT_Byte*  column = bitmap->buffer;
 
+
       for ( ; width > 0; width--, column++ )
       {
-        FT_Byte*   col     = column;
-        FT_Byte*   col_end = col + height*pitch;
+        FT_Byte*  col     = column;
+        FT_Byte*  col_end = col + height * pitch;
 
-        for ( ; col < col_end; col += 3*pitch )
+
+        for ( ; col < col_end; col += 3 * pitch )
         {
           FT_UInt  r = 0;
           FT_UInt  g = 0;
@@ -233,76 +239,92 @@
           FT_UInt  b = 0;
           FT_UInt  p;
 
+
           p  = col[0];
-          r += filters[0][0]*p;
-          g += filters[0][1]*p;
-          b += filters[0][2]*p;
+          r += filters[0][0] * p;
+          g += filters[0][1] * p;
+          b += filters[0][2] * p;
 
-          p = col[pitch];
-          r += filters[1][0]*p;
-          g += filters[1][1]*p;
-          b += filters[1][2]*p;
+          p  = col[pitch];
+          r += filters[1][0] * p;
+          g += filters[1][1] * p;
+          b += filters[1][2] * p;
 
-          p  = col[pitch*2];
-          r += filters[2][0]*p;
-          g += filters[2][1]*p;
-          b += filters[2][2]*p;
+          p  = col[pitch * 2];
+          r += filters[2][0] * p;
+          g += filters[2][1] * p;
+          b += filters[2][2] * p;
 
-          col[0]       = (FT_Byte)( r / 65536 );
-          col[pitch]   = (FT_Byte)( g / 65536 );
-          col[2*pitch] = (FT_Byte)( b / 65536 );
+          col[0]         = (FT_Byte)( r / 65536 );
+          col[pitch]     = (FT_Byte)( g / 65536 );
+          col[2 * pitch] = (FT_Byte)( b / 65536 );
         }
       }
     }
   }
+
 #endif /* USE_LEGACY */
 
+
   FT_EXPORT( FT_Error )
   FT_Library_SetLcdFilter( FT_Library     library,
                            FT_LcdFilter   filter )
   {
-    static const FT_Byte  light_filter[5]   = { 0, 85, 86, 85, 0 };
-    static const FT_Byte  default_filter[5] = { 0x10, 0x40, 0x70, 0x40, 0x10 };
+    static const FT_Byte  light_filter[5] =
+                            { 0, 85, 86, 85, 0 };
+    static const FT_Byte  default_filter[5] =
+                            { 0x10, 0x40, 0x70, 0x40, 0x10 };
 
+
     if ( library == NULL )
       return FT_Err_Invalid_Argument;
 
     switch ( filter )
     {
-        case FT_LCD_FILTER_NONE:
-            library->lcd_filter_func = NULL;
-            library->lcd_extra       = 0;
-            break;
+    case FT_LCD_FILTER_NONE:
+      library->lcd_filter_func = NULL;
+      library->lcd_extra       = 0;
+      break;
 
-        case FT_LCD_FILTER_DEFAULT:
-#if defined(FT_FORCE_LEGACY_LCD_FILTER)
-            library->lcd_filter_func = _ft_lcd_filter_legacy;
-            library->lcd_extra       = 0;
-#elif defined(FT_FORCE_LIGHT_LCD_FILTER)
-            memcpy( library->lcd_weights, default_filter, 5 );
-            library->lcd_filter_func = _ft_lcd_filter_fir;
-            library->lcd_extra       = 2;
+    case FT_LCD_FILTER_DEFAULT:
+#if defined( FT_FORCE_LEGACY_LCD_FILTER )
+
+      library->lcd_filter_func = _ft_lcd_filter_legacy;
+      library->lcd_extra       = 0;
+
+#elif defined( FT_FORCE_LIGHT_LCD_FILTER )
+
+      memcpy( library->lcd_weights, default_filter, 5 );
+      library->lcd_filter_func = _ft_lcd_filter_fir;
+      library->lcd_extra       = 2;
+
 #else
-            memcpy( library->lcd_weights, default_filter, 5 );
-            library->lcd_filter_func = _ft_lcd_filter_fir;
-            library->lcd_extra       = 2;
+
+      memcpy( library->lcd_weights, default_filter, 5 );
+      library->lcd_filter_func = _ft_lcd_filter_fir;
+      library->lcd_extra       = 2;
+
 #endif
-            break;
 
-        case FT_LCD_FILTER_LIGHT:
-            memcpy( library->lcd_weights, light_filter, 5 );
-            library->lcd_filter_func = _ft_lcd_filter_fir;
-            library->lcd_extra       = 2;
-            break;
+      break;
 
+    case FT_LCD_FILTER_LIGHT:
+      memcpy( library->lcd_weights, light_filter, 5 );
+      library->lcd_filter_func = _ft_lcd_filter_fir;
+      library->lcd_extra       = 2;
+      break;
+
 #ifdef USE_LEGACY
-        case FT_LCD_FILTER_LEGACY:
-            library->lcd_filter_func = _ft_lcd_filter_legacy;
-            library->lcd_extra       = 0;
-            break;
+
+    case FT_LCD_FILTER_LEGACY:
+      library->lcd_filter_func = _ft_lcd_filter_legacy;
+      library->lcd_extra       = 0;
+      break;
+
 #endif
-        default:
-            return FT_Err_Invalid_Argument;
+
+    default:
+      return FT_Err_Invalid_Argument;
     }
 
     library->lcd_filter = filter;
--- a/src/smooth/ftsmooth.c
+++ b/src/smooth/ftsmooth.c
@@ -175,18 +175,20 @@
     {
       FT_Int  extra = slot->library->lcd_extra;
 
+
       if ( hmul )
       {
-        x_shift -= 64*(extra >> 1);
-        width   += 3*extra;
+        x_shift -= 64 * ( extra >> 1 );
+        width   += 3 * extra;
         pitch    = FT_PAD_CEIL( width, 4 );
-        x_left  -= (extra >> 1);
+        x_left  -= extra >> 1;
       }
+
       if ( vmul )
       {
-        y_shift -= 64*(extra >> 1);
-        height  += 3*extra;
-        y_top   += (extra >> 1);
+        y_shift -= 64 * ( extra >> 1 );
+        height  += 3 * extra;
+        y_top   += extra >> 1;
       }
     }