A first try to integrate the Infinality patches for the autohinter.

It provides a framework for properties and adds a single property, `adjust
glyph heights'.
diff --git a/include/freetype/config/ftheader.h b/include/freetype/config/ftheader.h
index 2a7b8c4..aebeb17 100644
--- a/include/freetype/config/ftheader.h
+++ b/include/freetype/config/ftheader.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Build macros of the FreeType 2 library.                              */
 /*                                                                         */
-/*  Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2010 by */
+/*  Copyright 1996-2008, 2010, 2012 by                                     */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -709,6 +709,18 @@
   /*************************************************************************
    *
    * @macro:
+   *   FT_AUTOHINTER_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   FreeType~2 API which controls the behaviour of the auto-hinter.
+   */
+#define FT_AUTOHINTER_H  <freetype/ftautoh.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
    *   FT_UNPATENTED_HINTING_H
    *
    * @description:
diff --git a/include/freetype/ftautoh.h b/include/freetype/ftautoh.h
new file mode 100644
index 0000000..d435621
--- /dev/null
+++ b/include/freetype/ftautoh.h
@@ -0,0 +1,195 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftautoh.h                                                              */
+/*                                                                         */
+/*    FreeType API for setting and accessing auto-hinter properties        */
+/*    (specification).                                                     */
+/*                                                                         */
+/*  Copyright 2012 by                                                      */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTAUTOH_H__
+#define __FTAUTOH_H__
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    autohinter                                                         */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    The Auto-hinter                                                    */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    Controlling the behaviour of the auto-hinting engine.              */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This section contains the declaration of functions specific to the */
+  /*    auto-hinter.                                                       */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /**********************************************************************
+   *
+   * @enum:
+   *    FT_AUTOHINTER_XXX
+   *
+   * @description:
+   *    A list of bit-field constants used with
+   *    @FT_Library_GetAutohinterProperties,
+   *    @FT_Face_GetAutohinterProperties,
+   *    @FT_Library_SetAutohinterProperties, and
+   *    @FT_Face_SetAutohinterProperties to control the behaviour of the
+   *    auto-hinter.
+   *
+   * @values:
+   *    FT_AUTOHINTER_DEFAULT::
+   *      Corresponding to~0, this value indicates the default value.
+   *
+   *    FT_AUTOHINTER_INCREASE_GLYPH_HEIGHTS ::
+   *      For glyphs in the size range 5 < PPEM < 15, round up the glyph
+   *      height much more often than normally.
+   */
+#define FT_AUTOHINTER_DEFAULT                 0x0
+#define FT_AUTOHINTER_INCREASE_GLYPH_HEIGHTS  ( 1L << 0 )
+
+
+ /**********************************************************************
+  *
+  * @function:
+  *    FT_Library_GetAutohinterProperties
+  *
+  * @description:
+  *    Retrieve the global property flags which control the behaviour of the
+  *    auto-hinter.
+  *
+  * @output:
+  *    properties ::
+  *       The current global auto-hinter property flags, consisting of
+  *       @FT_AUTOHINTER_XXX constants which are ORed together.
+  *
+  *       Use @FT_Face_GetAutohinterProperties to retrieve the local
+  *       properties of a face.
+  *
+  * @return:
+  *   FreeType error code.  0~means success.
+  */
+  FT_EXPORT( FT_Error )
+  FT_Library_GetAutohinterProperties( FT_Library  library,
+                                      FT_Int32   *properties );
+
+
+ /**********************************************************************
+  *
+  * @function:
+  *    FT_Library_SetAutohinterProperties
+  *
+  * @description:
+  *    Set the global property flags which control the behaviour of the
+  *    auto-hinter.
+  *
+  * @input:
+  *    properties ::
+  *       The auto-hinter property flags to be set globally, consisting of
+  *       @FT_AUTOHINTER_XXX constants which are ORed together.  All faces
+  *       created after a call to this function inherit the new auto-hinter
+  *       properties.
+  *
+  *       Use @FT_Face_SetAutohinterProperties to override the properties
+  *       locally.
+  *
+  * @return:
+  *   FreeType error code.  0~means success.
+  */
+  FT_EXPORT( FT_Error )
+  FT_Library_SetAutohinterProperties( FT_Library  library,
+                                      FT_Int32    properties );
+
+
+ /**********************************************************************
+  *
+  * @function:
+  *    FT_Face_GetAutohinterProperties
+  *
+  * @description:
+  *    Retrieve the property flags which control the behaviour of the
+  *    auto-hinter for the given face.
+  *
+  * @input:
+  *    face ::
+  *       A handle to the input face.
+  *
+  * @output:
+  *    properties ::
+  *       The current auto-hinter property flags of the given face,
+  *       consisting of @FT_AUTOHINTER_XXX constants which are ORed
+  *       together.
+  *
+  * @return:
+  *   FreeType error code.  0~means success.
+  *
+  */
+  FT_EXPORT( FT_Error )
+  FT_Face_GetAutohinterProperties( FT_Face    face,
+                                   FT_Int32  *properties );
+
+
+ /**********************************************************************
+  *
+  * @function:
+  *    FT_Face_SetAutohinterProperties
+  *
+  * @description:
+  *    Set the property flags which control the behaviour of the autolhinter
+  *    for the given face.
+  *
+  * @input:
+  *    face ::
+  *       A handle to the input face.
+  *
+  *    properties ::
+  *       The auto-hinter property flags to be set for the given face,
+  *       consisting of @FT_AUTOHINTER_XXX constants which are ORed
+  *       together.
+  *
+  *       By default, a face inherits the global auto-hinter properties (set
+  *       with @FT_Library_SetAutohinterProperties, if any) at the time of
+  *       its creation.  Using this function you can override them locally.
+  *
+  * @return:
+  *   FreeType error code.  0~means success.
+  */
+  FT_EXPORT( FT_Error )
+  FT_Face_SetAutohinterProperties( FT_Face   face,
+                                   FT_Int32  properties );
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __FTAUTOH_H__ */
+
+
+/* END */
diff --git a/include/freetype/ftchapters.h b/include/freetype/ftchapters.h
index 6cdf54e..ad0a6b0 100644
--- a/include/freetype/ftchapters.h
+++ b/include/freetype/ftchapters.h
@@ -100,5 +100,6 @@
 /*    lzw                                                                  */
 /*    bzip2                                                                */
 /*    lcd_filtering                                                        */
+/*    autohinter                                                           */
 /*                                                                         */
 /***************************************************************************/
diff --git a/include/freetype/internal/ftobjs.h b/include/freetype/internal/ftobjs.h
index 5c227e1..0259f84 100644
--- a/include/freetype/internal/ftobjs.h
+++ b/include/freetype/internal/ftobjs.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType private base classes (specification).                   */
 /*                                                                         */
-/*  Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2008, 2010 by       */
+/*  Copyright 1996-2006, 2008, 2010, 2012 by                               */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -305,6 +305,9 @@
   /*      this data when first opened.  This field exists only if          */
   /*      @FT_CONFIG_OPTION_INCREMENTAL is defined.                        */
   /*                                                                       */
+  /*    auto_hinter_flags ::                                               */
+  /*      Flags controlling the behaviour of the auto-hinter locally.      */
+  /*                                                                       */
   /*    ignore_unpatented_hinter ::                                        */
   /*      This boolean flag instructs the glyph loader to ignore the       */
   /*      native font hinter, if one is found.  This is exclusively used   */
@@ -333,6 +336,8 @@
     FT_Incremental_InterfaceRec*  incremental_interface;
 #endif
 
+    FT_Int32            auto_hinter_flags;
+
     FT_Bool             ignore_unpatented_hinter;
     FT_UInt             refcount;
 
@@ -803,7 +808,10 @@
   /*                        handle to the current renderer for the         */
   /*                        FT_GLYPH_FORMAT_OUTLINE format.                */
   /*                                                                       */
-  /*    auto_hinter      :: XXX                                            */
+  /*    auto_hinter      :: The current auto-hinter.                       */
+  /*                                                                       */
+  /*    auto_hinter_flags :: Flags controlling the behaviour of the        */
+  /*                         auto-hinter globally.                         */
   /*                                                                       */
   /*    raster_pool      :: The raster object's render pool.  This can     */
   /*                        ideally be changed dynamically at run-time.    */
@@ -850,6 +858,8 @@
     FT_ListRec         renderers;        /* list of renderers        */
     FT_Renderer        cur_renderer;     /* current outline renderer */
     FT_Module          auto_hinter;
+    FT_Int32           auto_hinter_flags; /* global flags controlling */
+                                          /* the autohinter behaviour */
 
     FT_Byte*           raster_pool;      /* scan-line conversion */
                                          /* render pool          */
diff --git a/src/autofit/aflatin.c b/src/autofit/aflatin.c
index 30145a2..5853d9e 100644
--- a/src/autofit/aflatin.c
+++ b/src/autofit/aflatin.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Auto-fitter hinting routines for latin script (body).                */
 /*                                                                         */
-/*  Copyright 2003-2011 by                                                 */
+/*  Copyright 2003-2012 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -18,6 +18,7 @@
 
 #include <ft2build.h>
 #include FT_ADVANCES_H
+#include FT_AUTOHINTER_H
 #include FT_INTERNAL_DEBUG_H
 
 #include "aflatin.h"
@@ -569,10 +570,22 @@
 
       if ( blue )
       {
-        FT_Pos  scaled = FT_MulFix( blue->shoot.org, scaler->y_scale );
-        FT_Pos  fitted = ( scaled + 40 ) & ~63;
+        FT_Pos  scaled;
+        FT_Pos  threshold;
+        FT_Pos  fitted;
 
 
+        scaled = FT_MulFix( blue->shoot.org, scaler->y_scale );
+
+        threshold = 40;
+        if ( ( metrics->root.scaler.face->internal->auto_hinter_flags &
+               FT_AUTOHINTER_INCREASE_GLYPH_HEIGHTS                   ) &&
+             metrics->root.scaler.face->size->metrics.x_ppem < 15       &&
+             metrics->root.scaler.face->size->metrics.x_ppem > 5        )
+          threshold = 52;
+
+        fitted = ( scaled + threshold ) & ~63;
+
         if ( scaled != fitted )
         {
 #if 0
diff --git a/src/base/ftautoh.c b/src/base/ftautoh.c
new file mode 100644
index 0000000..b704abe
--- /dev/null
+++ b/src/base/ftautoh.c
@@ -0,0 +1,84 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftautoh.c                                                              */
+/*                                                                         */
+/*    FreeType API for setting and accessing auto-hinter properties        */
+/*    (body).                                                              */
+/*                                                                         */
+/*  Copyright 2012 by                                                      */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_INTERNAL_OBJECTS_H
+
+
+  /* documentation is in ftautoh.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Library_GetAutohinterProperties( FT_Library  library,
+                                      FT_Int32   *properties )
+  {
+    if ( !library || !properties )
+      return FT_Err_Invalid_Argument;
+
+    *properties = library->auto_hinter_flags;
+
+    return FT_Err_Ok;
+  }
+
+
+  /* documentation is in ftautoh.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Library_SetAutohinterProperties( FT_Library  face,
+                                      FT_Int32    properties )
+  {
+    if ( !library )
+      return FT_Err_Invalid_Argument;
+
+    library->auto_hinter_flags = properties;
+
+    return FT_Err_Ok;
+  }
+
+
+  /* documentation is in ftautoh.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Face_GetAutohinterProperties( FT_Face    face,
+                                   FT_Int32  *properties )
+  {
+    if ( !face || !properties )
+      return FT_Err_Invalid_Argument;
+
+    *properties = face->internal->auto_hinter_flags;
+
+    return FT_Err_Ok;
+  }
+
+
+  /* documentation is in ftautoh.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Face_SetAutohinterProperties( FT_Face   face,
+                                   FT_Int32  properties )
+  {
+    if ( !face )
+      return FT_Err_Invalid_Argument;
+
+    face->internal->auto_hinter_flags = properties;
+
+    return FT_Err_Ok;
+  }
+
+
+/* END */
diff --git a/src/base/ftobjs.c b/src/base/ftobjs.c
index b776a95..00c9455 100644
--- a/src/base/ftobjs.c
+++ b/src/base/ftobjs.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType private base classes (body).                            */
 /*                                                                         */
-/*  Copyright 1996-2011 by                                                 */
+/*  Copyright 1996-2012 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -2222,6 +2222,8 @@
       internal->transform_delta.x = 0;
       internal->transform_delta.y = 0;
 
+      internal->auto_hinter_flags = library->auto_hinter_flags;
+
       internal->refcount = 1;
     }