--- /dev/null
+--- 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 */
+ /* */