]> git.pld-linux.org Git - packages/freetype.git/blobdiff - freetype2-slighthint.patch
- fixes
[packages/freetype.git] / freetype2-slighthint.patch
diff --git a/freetype2-slighthint.patch b/freetype2-slighthint.patch
new file mode 100644 (file)
index 0000000..a742218
--- /dev/null
@@ -0,0 +1,448 @@
+--- freetype-2.1.2/src/base/ftobjs.c.slighthint        Sat Jun 15 21:14:16 2002
++++ freetype-2.1.2/src/base/ftobjs.c   Wed Jul  3 16:40:03 2002
+@@ -380,6 +380,22 @@
+   }
++  /* documentation is in freetype.h */
++
++  FT_EXPORT_DEF( void )
++  FT_Set_Hint_Flags( FT_Face     face,
++                     FT_ULong    flags )
++  {
++    FT_Face_Internal  internal;
++
++    if ( !face )
++      return;
++
++    internal = face->internal;
++
++    internal->hint_flags = (FT_UInt)flags;
++  }
++
+   static FT_Renderer
+   ft_lookup_glyph_renderer( FT_GlyphSlot  slot );
+--- freetype-2.1.2/src/psaux/t1decode.c.slighthint     Wed May 22 00:53:25 2002
++++ freetype-2.1.2/src/psaux/t1decode.c        Wed Jul  3 17:35:04 2002
+@@ -752,7 +752,8 @@
+             /* apply hints to the loaded glyph outline now */
+             hinter->apply( hinter->hints,
+                            builder->current,
+-                           (PSH_Globals)builder->hints_globals );
++                           (PSH_Globals)builder->hints_globals,
++                         decoder->hint_flags );
+           }
+           /* add current outline to the glyph slot */
+@@ -1147,10 +1148,13 @@
+     decoder->num_glyphs     = face->num_glyphs;
+     decoder->glyph_names    = glyph_names;
+     decoder->blend          = blend;
++    decoder->hint_flags     = face->internal->hint_flags;
+     decoder->parse_callback = parse_callback;
+     decoder->funcs          = t1_decoder_funcs;
++    
++
+     return 0;
+   }
+--- freetype-2.1.2/src/pshinter/pshalgo1.c.slighthint  Fri Apr 12 05:31:46 2002
++++ freetype-2.1.2/src/pshinter/pshalgo1.c     Wed Jul  3 16:40:03 2002
+@@ -744,7 +744,8 @@
+   FT_Error
+   ps1_hints_apply( PS_Hints     ps_hints,
+                    FT_Outline*  outline,
+-                   PSH_Globals  globals )
++                   PSH_Globals  globals,
++                 FT_ULong     hint_flags )
+   {
+     PSH1_Hint_TableRec  hints;
+     FT_Error            error = 0;
+--- freetype-2.1.2/src/pshinter/pshalgo1.h.slighthint  Tue Dec  4 20:22:05 2001
++++ freetype-2.1.2/src/pshinter/pshalgo1.h     Wed Jul  3 16:40:03 2002
+@@ -88,7 +88,8 @@
+   extern FT_Error
+   ps1_hints_apply( PS_Hints     ps_hints,
+                    FT_Outline*  outline,
+-                   PSH_Globals  globals );
++                   PSH_Globals  globals,
++                 FT_ULong     hint_flags );
+ #ifdef DEBUG_HINTER
+--- freetype-2.1.2/src/pshinter/pshalgo2.c.slighthint  Wed Jul  3 16:40:03 2002
++++ freetype-2.1.2/src/pshinter/pshalgo2.c     Wed Jul  3 18:08:53 2002
+@@ -352,10 +352,29 @@
+ #endif
++static FT_Fixed
++  psh2_hint_snap_stem_side_delta ( FT_Fixed pos,
++                                 FT_Fixed len )
++  {
++    FT_Fixed delta1 = ( ( pos + 32 ) & -64 ) - pos;
++    FT_Fixed delta2 = ( ( pos + len + 32 ) & -64  ) - pos - len;
++            
++    if ( ABS( delta1 ) <= ABS( delta2 ) )
++    {
++      return delta1;
++    }
++    else
++    {
++      return delta2;
++    }
++  }
++
++
+   static void
+   psh2_hint_align( PSH2_Hint    hint,
+                    PSH_Globals  globals,
+-                   FT_Int       dimension )
++                   FT_Int       dimension,
++                 FT_ULong     hint_flags )
+   {
+     PSH_Dimension  dim   = &globals->dimension[dimension];
+     FT_Fixed       scale = dim->scale_mult;
+@@ -372,16 +391,33 @@
+       PSH_AlignmentRec  align;
++      if ( ( dimension == 0 && ( hint_flags & FT_HINT_NO_VSTEM_ALIGN ) != 0 ) ||
++         ( dimension == 1 && ( hint_flags & FT_HINT_NO_HSTEM_ALIGN ) != 0 ) )
++      {
++      hint->cur_pos = pos;
++      hint->cur_len = len;
++
++      psh2_hint_set_fitted( hint );
+-      /* compute fitted width/height */
+-      fit_len = 0;
+-      if ( hint->org_len )
+-      {
+-        fit_len = psh_dimension_snap_width( dim, hint->org_len );
+-        if ( fit_len < 64 )
+-          fit_len = 64;
+-        else
+-          fit_len = ( fit_len + 32 ) & -64;
++      return;
++      }
++    
++      if ( ( hint_flags & FT_HINT_NO_INTEGER_STEM ) == 0 )
++      {
++      /* compute fitted width/height */
++      fit_len = 0;
++      if ( hint->org_len )
++      {
++        fit_len = psh_dimension_snap_width( dim, hint->org_len );
++        if ( fit_len < 64 )
++          fit_len = 64;
++        else
++            fit_len = ( fit_len + 32 ) & -64;
++      }
++      }
++      else
++      {
++      fit_len = len;
+       }
+       hint->cur_len = fit_len;
+@@ -427,7 +463,7 @@
+             /* ensure that parent is already fitted */
+             if ( !psh2_hint_is_fitted( parent ) )
+-              psh2_hint_align( parent, globals, dimension );
++              psh2_hint_align( parent, globals, dimension, hint_flags );
+             par_org_center = parent->org_pos + ( parent->org_len / 2);
+             par_cur_center = parent->cur_pos + ( parent->cur_len / 2);
+@@ -443,22 +479,105 @@
+             pos = par_cur_center + cur_delta - ( len >> 1 );
+           }
+-          /* normal processing */
+-          if ( ( fit_len / 64 ) & 1 )
+-          {
+-            /* odd number of pixels */
+-            fit_center = ( ( pos + ( len >> 1 ) ) & -64 ) + 32;
+-          }
+-          else
+-          {
+-            /* even number of pixels */
+-            fit_center = ( pos + ( len >> 1 ) + 32 ) & -64;
+-          }
+-
+-          hint->cur_pos = fit_center - ( fit_len >> 1 );
+-        }
++        if ( ( hint_flags & FT_HINT_NO_INTEGER_STEM ) == 0 )
++        {
++          /* normal processing */
++          if ( ( fit_len / 64 ) & 1 )
++            {
++            /* odd number of pixels */
++            fit_center = ( ( pos + ( len >> 1 ) ) & -64 ) + 32;
++            }
++          else
++          {
++            /* even number of pixels */
++              fit_center = ( pos + ( len >> 1 ) + 32 ) & -64;
++          }
++
++          hint->cur_pos = fit_center - ( fit_len >> 1 );
++        }
++        else
++        {
++          /* Stems less than one pixel wide are easy - we want to
++           * make them as dark as possible, so they must fall within
++           * one pixel. If the stem is split between two pixels
++           * then snap the edge that is nearer to the pixel boundary
++           * to the pixel boundary
++           */
++          if (len <= 64)
++          {
++            if ( ( pos + len + 63 ) / 64  != pos / 64 + 1 )
++              pos += psh2_hint_snap_stem_side_delta ( pos, len );
++          }
++          /* Position stems other to minimize the amount of mid-grays.
++           * There are, in general, two positions that do this,
++           * illustrated as A) and B) below.
++           *
++           *   +                   +                   +                   +
++           *
++           * A)             |--------------------------------|
++           * B)   |--------------------------------|
++           * C)       |--------------------------------|
++           *
++           * Position A) (split the excess stem equally) should be better
++           * for stems of width N + f where f < 0.5
++           *
++           * Position B) (split the deficiency equally) should be better
++           * for stems of width N + f where f > 0.5
++           *
++           * It turns out though that minimizing the total number of lit
++           * pixels is also important, so position C), with one edge
++           * aligned with a pixel boundary is actually preferable
++           * to A). There are also more possibile positions for C) than
++           * for A) or B), so it involves less distortion of the overall
++           * character shape.
++           */
++          else
++          {
++            FT_Fixed frac_len = len & 63;
++            FT_Fixed center = pos + ( len >> 1 );
++
++            FT_Fixed delta_a, delta_b;
++
++            if ( ( len / 64 ) & 1 )
++            {
++              delta_a = ( center & -64 ) + 32 - center;
++              delta_b = ( ( center + 32 ) & - 64 ) - center;
++            }
++            else
++            {
++              delta_a = ( ( center + 32 ) & - 64 ) - center;
++              delta_b = ( center & -64 ) + 32 - center;
++            }
++
++            /* We choose between B) and C) above based on the amount
++             * of fractinal stem width; for small amounts, choose
++             * C) always, for large amounts, B) always, and inbetween,
++             * pick whichever one involves less stem movement.
++             */
++            if (frac_len < 32)
++            {
++              pos += psh2_hint_snap_stem_side_delta ( pos, len );
++            }
++            else if (frac_len < 48)
++            {
++              FT_Fixed side_delta = psh2_hint_snap_stem_side_delta ( pos, len );
++                
++              if ( ABS( side_delta ) < ABS( delta_b ) )
++                pos += side_delta;
++              else
++                pos += delta_b;
++            }
++            else
++            {
++              pos += delta_b;
++            }
++          }
++
++          hint->cur_pos = pos;
++        }
++      }
+       }
+-
++      
+       psh2_hint_set_fitted( hint );
+ #ifdef DEBUG_HINTER
+@@ -472,7 +591,8 @@
+   static void
+   psh2_hint_table_align_hints( PSH2_Hint_Table  table,
+                                PSH_Globals      globals,
+-                               FT_Int           dimension )
++                               FT_Int           dimension,
++                             FT_ULong         hint_flags )
+   {
+     PSH2_Hint      hint;
+     FT_UInt        count;
+@@ -500,7 +620,7 @@
+     count = table->max_hints;
+     for ( ; count > 0; count--, hint++ )
+-      psh2_hint_align( hint, globals, dimension );
++      psh2_hint_align( hint, globals, dimension, hint_flags );
+   }
+@@ -1494,7 +1614,8 @@
+   FT_Error
+   ps2_hints_apply( PS_Hints     ps_hints,
+                    FT_Outline*  outline,
+-                   PSH_Globals  globals )
++                   PSH_Globals  globals,
++                 FT_ULong     hint_flags )
+   {
+     PSH2_GlyphRec  glyphrec;
+     PSH2_Glyph     glyph = &glyphrec;
+@@ -1532,7 +1653,8 @@
+       /* compute aligned stem/hints positions */
+       psh2_hint_table_align_hints( &glyph->hint_tables[dimension],
+                                    glyph->globals,
+-                                   dimension );
++                                   dimension,
++                                 hint_flags );
+       /* find strong points, align them, then interpolate others */
+       psh2_glyph_find_strong_points( glyph, dimension );
+--- freetype-2.1.2/src/pshinter/pshalgo2.h.slighthint  Tue Dec  4 20:22:05 2001
++++ freetype-2.1.2/src/pshinter/pshalgo2.h     Wed Jul  3 16:40:03 2002
+@@ -190,7 +190,8 @@
+   extern FT_Error
+   ps2_hints_apply( PS_Hints     ps_hints,
+                    FT_Outline*  outline,
+-                   PSH_Globals  globals );
++                   PSH_Globals  globals,
++                 FT_ULong     hint_flags );
+ FT_END_HEADER
+--- freetype-2.1.2/include/freetype/internal/ftobjs.h.slighthint       Mon Jun 10 19:03:35 2002
++++ freetype-2.1.2/include/freetype/internal/ftobjs.h  Wed Jul  3 16:40:03 2002
+@@ -302,6 +302,8 @@
+     FT_Vector    transform_delta;
+     FT_Int       transform_flags;
++    FT_UInt      hint_flags;
++
+     const char*  postscript_name;
+   } FT_Face_InternalRec;
+--- freetype-2.1.2/include/freetype/internal/pshints.h.slighthint      Sat Mar 30 08:16:33 2002
++++ freetype-2.1.2/include/freetype/internal/pshints.h Wed Jul  3 16:40:03 2002
+@@ -280,7 +280,8 @@
+   typedef FT_Error
+   (*T1_Hints_ApplyFunc)( T1_Hints     hints,
+                          FT_Outline*  outline,
+-                         PSH_Globals  globals );
++                         PSH_Globals  globals,
++                       FT_ULong     hint_flags );
+   /*************************************************************************/
+--- freetype-2.1.2/include/freetype/internal/psaux.h.slighthint        Fri Mar 29 18:23:28 2002
++++ freetype-2.1.2/include/freetype/internal/psaux.h   Wed Jul  3 16:40:03 2002
+@@ -644,6 +644,7 @@
+     FT_Vector            flex_vectors[7];
+     PS_Blend             blend;       /* for multiple master support */
++    FT_ULong             hint_flags;
+     T1_Decoder_Callback  parse_callback;
+     T1_Decoder_FuncsRec  funcs;
+--- freetype-2.1.2/include/freetype/freetype.h.slighthint      Sun Jun 23 06:57:31 2002
++++ freetype-2.1.2/include/freetype/freetype.h Wed Jul  3 16:40:03 2002
+@@ -121,6 +121,12 @@
+   /*    FT_Set_Char_Size                                                   */
+   /*    FT_Set_Pixel_Sizes                                                 */
+   /*    FT_Set_Transform                                                   */
++  /*    FT_Set_Hint_Flags                                                  */
++  /*                                                                       */
++  /*    FT_HINT_NO_INTEGER_STEM                                            */
++  /*    FT_HINT_NO_HSTEM_ALIGN                                             */
++  /*    FT_HINT_NO_VSTEM_ALIGN                                             */
++  /*                                                                       */
+   /*    FT_Load_Glyph                                                      */
+   /*    FT_Get_Char_Index                                                  */
+   /*    FT_Get_Name_Index                                                  */
+@@ -2181,9 +2187,67 @@
+                     FT_Matrix*  matrix,
+                     FT_Vector*  delta );
++  
++  /*************************************************************************/
++  /*                                                                       */
++  /* <Function>                                                            */
++  /*    FT_Set_Hint_Flags                                                  */
++  /*                                                                       */
++  /* <Description>                                                         */
++  /*    A function used to set a number of flags that are used to control  */
++  /*    the hinting process when glyphs are loaded.                        */
++  /*                                                                       */
++  /* <InOut>                                                               */
++  /*    face   :: A handle to the source face object.                      */
++  /*                                                                       */
++  /* <Input>                                                               */
++  /*    flags  :: A set of bit flags that control the hinting process      */
++  /*              see the FT_HINT_XXX constants for details.               */
++  /*                                                                       */
++  /* <Note>                                                                */
++  /*    The interpretation of the flags depends on the hinter module in    */
++  /*    use. Not all modules will support all flags                        */
++  /*                                                                       */
++  FT_EXPORT( void )
++  FT_Set_Hint_Flags( FT_Face     face,
++                     FT_ULong    hint_flags );
++  
++
++  /*************************************************************************/
++  /*                                                                       */
++  /* <Constant>                                                            */
++  /*    FT_HINT_NO_INTEGER_STEM                                            */
++  /*                                                                       */
++  /* <Description>                                                         */
++  /*    A bit-field constant, used with FT_Set_Hint_Flags() to to suppress */
++  /*    snapping of stem widths to integer values                          */
++  /*                                                                       */
++#define FT_HINT_NO_INTEGER_STEM 1
++
++  /*************************************************************************/
++  /*                                                                       */
++  /* <Constant>                                                            */
++  /*    FT_HINT_NO_HSTEM_ALIGN                                             */
++  /*                                                                       */
++  /* <Description>                                                         */
++  /*    A bit-field constant, used with FT_Set_Hint_Flags() to to suppress */
++  /*    alignment of horizontal stems with the pixel grid.                 */
++  /*                                                                       */
++#define FT_HINT_NO_HSTEM_ALIGN 2
+   /*************************************************************************/
+   /*                                                                       */
++  /* <Constant>                                                            */
++  /*    FT_HINT_NO_VSTEM_ALIGN                                             */
++  /*                                                                       */
++  /* <Description>                                                         */
++  /*    A bit-field constant, used with FT_Set_Hint_Flags() to to suppress */
++  /*    alignment of vertical stems with the pixel grid                    */
++  /*                                                                       */
++#define FT_HINT_NO_VSTEM_ALIGN 4
++  
++  /*************************************************************************/
++  /*                                                                       */
+   /* <Enum>                                                                */
+   /*    FT_Render_Mode                                                     */
+   /*                                                                       */
This page took 0.109093 seconds and 4 git commands to generate.