* MANY FILES... Mergin with main branch (HEAD)
diff --git a/ChangeLog b/ChangeLog
index 3c358b8..5f9c30e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -21,6 +21,8 @@
       moving "ftc_node_destroy" to private headers, it's now a local,
       non-public, function
 
+    * MANY FILES... Mergin with main branch (HEAD)
+
 2005-09-21  David Turner  <david@freetype.org>
 
     * massive redesign of the cache sub-system internals.
@@ -28,6 +30,69 @@
     performance (ftbench shows a 3% improvements in the SBit
     and Image caches)
 
+
+2005-09-05  Werner Lemberg  <wl@gnu.org>
+
+	Add FT_FACE_FLAG_HINTER to indicate that a specific font driver has
+	a hinting engine of its own.
+
+	* include/freetype/freetype.h (FT_FACE_FLAG_HINTER): New macro.
+
+	* src/cff/cffobjs.c (cff_face_init), src/cid/cidobjs.c
+	(cid_face_init), src/truetype/ttobjs.c (tt_face_init)
+	[TT_CONFIG_OPTION_BYTECODE_INTERPRETER], src/type1/t1objs.c
+	(T1_Face_Init), src/type42/t42objs.c (T42_Face_Init)
+	[TT_CONFIG_OPTION_BYTECODE_INTERPRETER]: Update face flags.
+
+	* docs/CHANGES: Document it.
+
+2005-09-27  Werner Lemberg  <wl@gnu.org>
+
+	* builds/unix/freetype2.m4: Add license exception so that the file
+	can be used in any other autoconf script.
+
+2005-09-26  David Turner  <david@freetype.org>
+
+	* src/autofit/aflatin.c (af_latin_compute_stem_width): Fix bad
+	computation of the `vertical' flag, causing ugly things in LCD mode
+	and others.
+
+2005-09-23  David Turner  <david@freetype.org>
+
+	* src/autofit/aflatin.c (af_latin_hints_init): Fix a bug that
+	prevented internal hint mode bitflags from being computed correctly.
+
+	* src/base/Jamfile: Adding src/base/ftgxval.c.
+
+	* src/gxvalid/gxvbsln.c, src/gxvalid/gxvcommn.c,
+	src/gxvalid/gxvfeat.c, src/gxvalid/gxvjust.c, src/gxvalid/gxvkern.c,
+	src/gxvalid/gxvlcar.c, src/gxvalid/gxvmort.c,
+	src/gxvalid/gxvmort0.c, src/gxvalid/gxvmort1.c,
+	src/gxvalid/gxvmort2.c, src/gxvalid/gxvmort4.c,
+	src/gxvalid/gxvmort5.c, src/gxvalid/gxvmorx.c,
+	src/gxvalid/gxvmorx0.c, src/gxvalid/gxvmorx1.c,
+	src/gxvalid/gxvmorx2.c, src/gxvalid/gxvmorx5.c,
+	src/gxvalid/gxvopbd.c, src/gxvalid/gxvprop.c,
+	src/truetype/ttgload.c: Remove _many_ compiler warnings when
+	compiling with Visual C++ at maximum level (/W4).
+
+	* src/autofit/afangles.c (af_angle_atan): Replaced CORDIC-based
+	implementation with one using lookup tables.  This simple thing
+	speeds up glyph loading by 18%, according to ftbench!
+
+	* src/sfnt/sfdriver.c (sfnt_get_interface): Don't check for
+	`get_sfnt' and `load_sfnt' module interfaces.
+
+2005-09-22  Werner Lemberg  <wl@gnu.org>
+
+	* docs/CHANGES: Mention SING Glyphlet support.
+
+2005-09-22  David Turner  <david@freetype.org>
+
+	* src/base/Jamfile: Disable compilation of ftgxval module
+	temporarily.
+
+
 2005-09-19  David Somers  <dsomers@omz13.com>
 
 	* freetype2/src/sfnt/ttload.c (sfnt_dir_check): Modified to allow a
diff --git a/builds/unix/freetype2.m4 b/builds/unix/freetype2.m4
index fc2242f..cf6b0ab 100644
--- a/builds/unix/freetype2.m4
+++ b/builds/unix/freetype2.m4
@@ -10,6 +10,11 @@
 # indicate that you have read the license and understand and accept it
 # fully.
 #
+# As a special exception to the FreeType project license, this file may be
+# distributed as part of a program that contains a configuration script
+# generated by Autoconf, under the same distribution terms as the rest of
+# that program.
+#
 # serial 2
 
 # AC_CHECK_FT2([MINIMUM-VERSION [, ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]])
diff --git a/docs/CHANGES b/docs/CHANGES
index 4497829..76947d9 100644
--- a/docs/CHANGES
+++ b/docs/CHANGES
@@ -33,6 +33,13 @@
 
   III. MISCELLANEOUS
 
+    - A new  face flag `FT_FACE_FLAG_HINTER'  has been added  which is
+      set if the font's driver has  a hinting engine of its own.  This
+      makes  it possible  to check  at run-time  whether  the TrueType
+      bytecode interpreter  has been activated.  An example  use is to
+      enable  the interpretation of  the `gasp'  table only  if native
+      TrueType hinting is available.
+
     - The demo programs  `ftview' and  `ftstring' have been  rewritten
       for better readability.
 
@@ -40,6 +47,19 @@
       (meaning `left  sidebearing  point  at x=0').   This helps  with
       some buggy fonts.
 
+    - Rudimentary support for Adobe's new `SING Glyphlet' format.  See
+
+        http://www.adobe.com/products/indesign/sing_gaiji.html
+
+      for more information.
+
+    - The Cache API has been severely updated. However, that doesn't
+      change the public API located in FT_CACHE_H, only the types and
+      functions from FT_CACHE_INTERNAL_XXXX_H headers which should
+      only be included if you want to create custom caches.
+      
+      The Cache API is still experimental, don't use it on production
+      code though !!!
 
 ======================================================================
 
diff --git a/include/freetype/freetype.h b/include/freetype/freetype.h
index 7976b4f..6119023 100644
--- a/include/freetype/freetype.h
+++ b/include/freetype/freetype.h
@@ -120,6 +120,7 @@
   /*    FT_FACE_FLAG_GLYPH_NAMES                                           */
   /*    FT_FACE_FLAG_EXTERNAL_STREAM                                       */
   /*    FT_FACE_FLAG_FAST_GLYPHS                                           */
+  /*    FT_FACE_FLAG_HINTER                                                */
   /*                                                                       */
   /*    FT_STYLE_FLAG_BOLD                                                 */
   /*    FT_STYLE_FLAG_ITALIC                                               */
@@ -336,6 +337,9 @@
   /*    It also embeds a memory manager (see @FT_Memory), as well as a     */
   /*    scan-line converter object (see @FT_Raster).                       */
   /*                                                                       */
+  /*    For multi-threading applications each thread should have its own   */
+  /*    FT_Library object.                                                 */
+  /*                                                                       */
   /* <Note>                                                                */
   /*    Library objects are normally created by @FT_Init_FreeType, and     */
   /*    destroyed with @FT_Done_FreeType.                                  */
@@ -419,7 +423,7 @@
   /*                                                                       */
   /* <Note>                                                                */
   /*    Each face object owns one or more sizes.  There is however a       */
-  /*    single _active_ size for the face at any time that will be used by */
+  /*    single _active_ size for the face at any time that is used by      */
   /*    functions like @FT_Load_Glyph, @FT_Get_Kerning, etc.               */
   /*                                                                       */
   /*    You can use the @FT_Activate_Size API to change the current        */
@@ -616,8 +620,8 @@
   /* <Note>                                                                */
   /*   By default, FreeType automatically synthetizes a Unicode charmap    */
   /*   for Postscript fonts, using their glyph names dictionaries.         */
-  /*   However, it will also report the encodings defined explicitly in    */
-  /*   the font file, for the cases when they are needed, with the Adobe   */
+  /*   However, it also reports the encodings defined explicitly in the    */
+  /*   font file, for the cases when they are needed, with the Adobe       */
   /*   values as well.                                                     */
   /*                                                                       */
   /*   FT_ENCODING_NONE is set by the BDF and PCF drivers if the charmap   */
@@ -1038,8 +1042,9 @@
   /*    FT_FACE_FLAG_KERNING ::                                            */
   /*      Indicates that the face contains kerning information.  If set,   */
   /*      the kerning distance can be retrieved through the function       */
-  /*      @FT_Get_Kerning.  Note that if unset, this function will always  */
-  /*      return the vector (0,0).                                         */
+  /*      @FT_Get_Kerning.  Otherwise the function always return the       */
+  /*      vector (0,0).  Note that FreeType doesn't handle kerning data    */
+  /*      from the `GPOS' table (as present in some OpenType fonts).       */
   /*                                                                       */
   /*    FT_FACE_FLAG_FAST_GLYPHS ::                                        */
   /*      THIS FLAG IS DEPRECATED.  DO NOT USE OR TEST IT.                 */
@@ -1060,6 +1065,12 @@
   /*      provided by the client application and should not be destroyed   */
   /*      when @FT_Done_Face is called.  Don't read or test this flag.     */
   /*                                                                       */
+  /*    FT_FACE_FLAG_HINTER ::                                             */
+  /*      Set if the font driver has a hinting machine of its own.  For    */
+  /*      example, with TrueType fonts, it makes sense to use data from    */
+  /*      the SFNT `gasp' table only if the native TrueType hinting engine */
+  /*      (with the bytecode interpreter) is available and active.         */
+  /*                                                                       */
 #define FT_FACE_FLAG_SCALABLE          ( 1L <<  0 )
 #define FT_FACE_FLAG_FIXED_SIZES       ( 1L <<  1 )
 #define FT_FACE_FLAG_FIXED_WIDTH       ( 1L <<  2 )
@@ -1071,6 +1082,7 @@
 #define FT_FACE_FLAG_MULTIPLE_MASTERS  ( 1L <<  8 )
 #define FT_FACE_FLAG_GLYPH_NAMES       ( 1L <<  9 )
 #define FT_FACE_FLAG_EXTERNAL_STREAM   ( 1L << 10 )
+#define FT_FACE_FLAG_HINTER            ( 1L << 11 )
 
   /* */
 
@@ -1485,9 +1497,9 @@
   /*                         data.                                         */
   /*                                                                       */
   /*    other             :: Really wicked formats can use this pointer to */
-  /*                         present their own glyph image to client apps. */
-  /*                         Note that the app will need to know about the */
-  /*                         image format.                                 */
+  /*                         present their own glyph image to client       */
+  /*                         applications.  Note that the application      */
+  /*                         needs to know about the image format.         */
   /*                                                                       */
   /*    lsb_delta         :: The difference between hinted and unhinted    */
   /*                         left side bearing while autohinting is        */
@@ -1761,8 +1773,8 @@
   /*                                                                       */
   /*    driver      :: This field is exclusively used by @FT_Open_Face;    */
   /*                   it simply specifies the font driver to use to open  */
-  /*                   the face.  If set to 0, FreeType will try to load   */
-  /*                   the face with each one of the drivers in its list.  */
+  /*                   the face.  If set to 0, FreeType tries to load the  */
+  /*                   face with each one of the drivers in its list.      */
   /*                                                                       */
   /*    num_params  :: The number of extra parameters.                     */
   /*                                                                       */
@@ -1782,12 +1794,11 @@
   /*    Otherwise, if the `FT_OPEN_PATHNAME' bit is set, assume that this  */
   /*    is a normal file and use `pathname' to open it.                    */
   /*                                                                       */
-  /*    If the `FT_OPEN_DRIVER' bit is set, @FT_Open_Face will only try to */
+  /*    If the `FT_OPEN_DRIVER' bit is set, @FT_Open_Face only tries to    */
   /*    open the file with the driver whose handler is in `driver'.        */
   /*                                                                       */
   /*    If the `FT_OPEN_PARAMS' bit is set, the parameters given by        */
-  /*    `num_params' and `params' will be used.  They are ignored          */
-  /*    otherwise.                                                         */
+  /*    `num_params' and `params' is used.  They are ignored otherwise.    */
   /*                                                                       */
   typedef struct  FT_Open_Args_
   {
@@ -1834,7 +1845,7 @@
   /*                                                                       */
   /*    @FT_New_Face can be used to determine and/or check the font format */
   /*    of a given font resource.  If the `face_index' field is negative,  */
-  /*    the function will _not_ return any face handle in `aface';  the    */
+  /*    the function does _not_ return any face handle in `aface';  the    */
   /*    return value is 0 if the font format is recognized, or non-zero    */
   /*    otherwise.                                                         */
   /*                                                                       */
@@ -1886,7 +1897,7 @@
   /*                                                                       */
   /*    @FT_New_Memory_Face can be used to determine and/or check the font */
   /*    format of a given font resource.  If the `face_index' field is     */
-  /*    negative, the function will _not_ return any face handle in        */
+  /*    negative, the function does _not_ return any face handle in        */
   /*    `aface'; the return value is 0 if the font format is recognized,   */
   /*    or non-zero otherwise.                                             */
   /*                                                                       */
@@ -1906,7 +1917,7 @@
   /* <Description>                                                         */
   /*    Opens a face object from a given resource and typeface index using */
   /*    an `FT_Open_Args' structure.  If the face object doesn't exist, it */
-  /*    will be created.                                                   */
+  /*    is created.                                                        */
   /*                                                                       */
   /* <InOut>                                                               */
   /*    library    :: A handle to the library resource.                    */
@@ -1931,7 +1942,7 @@
   /*                                                                       */
   /*    @FT_Open_Face can be used to determine and/or check the font       */
   /*    format of a given font resource.  If the `face_index' field is     */
-  /*    negative, the function will _not_ return any face handle in        */
+  /*    negative, the function does _not_ return any face handle in        */
   /*    `*aface'; the function's return value is 0 if the font format is   */
   /*    recognized, or non-zero otherwise.                                 */
   /*                                                                       */
@@ -2104,11 +2115,10 @@
   /*                                                                       */
   /*    The `character size' is really the size of an abstract square      */
   /*    called the `EM', used to design the font.  However, depending      */
-  /*    on the font design, glyphs will be smaller or greater than the     */
-  /*    EM.                                                                */
+  /*    on the font design, glyphs is smaller or greater than the EM.      */
   /*                                                                       */
   /*    This means that setting the pixel size to, say, 8x8 doesn't        */
-  /*    guarantee in any way that you will get glyph bitmaps that all fit  */
+  /*    guarantee in any way that you get glyph bitmaps that all fit       */
   /*    within an 8x8 cell (sometimes even far from it).                   */
   /*                                                                       */
   /*    For bitmap fonts, `pixel_height' usually is a reliable value for   */
@@ -2136,7 +2146,7 @@
   /*                                                                       */
   /* <InOut>                                                               */
   /*    face        :: A handle to the target face object where the glyph  */
-  /*                   will be loaded.                                     */
+  /*                   is loaded.                                          */
   /*                                                                       */
   /* <Input>                                                               */
   /*    glyph_index :: The index of the glyph in the font file.  For       */
@@ -2154,8 +2164,8 @@
   /*                                                                       */
   /* <Note>                                                                */
   /*    If the glyph image is not a bitmap, and if the bit flag            */
-  /*    FT_LOAD_IGNORE_TRANSFORM is unset, the glyph image will be         */
-  /*    transformed with the information passed to a previous call to      */
+  /*    FT_LOAD_IGNORE_TRANSFORM is unset, the glyph image is transformed  */
+  /*    with the information passed to a previous call to                  */
   /*    @FT_Set_Transform.                                                 */
   /*                                                                       */
   /*    Note that this also transforms the `face.glyph.advance' field, but */
@@ -2178,7 +2188,7 @@
   /*                                                                       */
   /* <InOut>                                                               */
   /*    face        :: A handle to a target face object where the glyph    */
-  /*                   will be loaded.                                     */
+  /*                   is loaded.                                          */
   /*                                                                       */
   /* <Input>                                                               */
   /*    char_code   :: The glyph's character code, according to the        */
@@ -2195,11 +2205,10 @@
   /*                                                                       */
   /* <Note>                                                                */
   /*    If the face has no current charmap, or if the character code       */
-  /*    is not defined in the charmap, this function will return an        */
-  /*    error.                                                             */
+  /*    is not defined in the charmap, this function returns an error.     */
   /*                                                                       */
   /*    If the glyph image is not a bitmap, and if the bit flag            */
-  /*    FT_LOAD_IGNORE_TRANSFORM is unset, the glyph image will be         */
+  /*    FT_LOAD_IGNORE_TRANSFORM is unset, the glyph image is              */
   /*    transformed with the information passed to a previous call to      */
   /*    @FT_Set_Transform.                                                 */
   /*                                                                       */
@@ -2224,7 +2233,7 @@
   * @values:
   *   FT_LOAD_DEFAULT ::
   *     Corresponding to 0, this value is used a default glyph load.  In this
-  *     case, the following will happen:
+  *     case, the following happens:
   *
   *     1. FreeType looks for a bitmap for the glyph corresponding to the
   *        face's current size.  If one is found, the function returns.  The
@@ -2264,7 +2273,7 @@
   *
   *   FT_LOAD_NO_BITMAP ::
   *     Don't look for bitmaps when loading the glyph.  Only scalable
-  *     outlines will be loaded when available, and scaled, hinted, or
+  *     outlines are loaded when available, and scaled, hinted, or
   *     rendered depending on other bit flags.
   *
   *     This does not prevent you from rendering outlines to bitmaps
@@ -2272,9 +2281,9 @@
   *
   *   FT_LOAD_VERTICAL_LAYOUT ::
   *     Prepare the glyph image for vertical text layout.  This basically
-  *     means that `face.glyph.advance' will correspond to the vertical
+  *     means that `face.glyph.advance' corresponds to the vertical
   *     advance height (instead of the default horizontal advance width),
-  *     and that the glyph image will be translated to match the vertical
+  *     and that the glyph image is translated to match the vertical
   *     bearings positions.
   *
   *   FT_LOAD_FORCE_AUTOHINT ::
@@ -2349,6 +2358,23 @@
   *
   *   FT_LOAD_TARGET_LCD_V ::
   *     Use hinting for @FT_RENDER_MODE_LCD_V.
+  *
+  * @note:
+  *   You should use only _one_ of the FT_LOAD_TARGET_XXX values; they
+  *   can't be ORed.
+  *
+  *   However, FreeType makes a distinction between the hinting algorithm
+  *   being used, and the pixel mode of the target bitmaps.  For example,
+  *   it is possible to use the `light' hinting algorithm and have the
+  *   results rendered in horizontal LCD pixel mode, with code like this:
+  *
+  *   {
+  *     FT_Load_Glyph( face, glyph_index,
+  *                    load_flags | FT_LOAD_TARGET_LIGHT );
+  *
+  *     FT_Render_Glyph( face->glyph, FT_RENDER_MODE_LCD );
+  *   }
+  *
   */
 #define FT_LOAD_DEFAULT                      0x0
 #define FT_LOAD_NO_SCALE                     0x1
@@ -2644,7 +2670,7 @@
   /*                   buffer.                                             */
   /*                                                                       */
   /* <Output>                                                              */
-  /*    buffer      :: A pointer to a target buffer where the name will be */
+  /*    buffer      :: A pointer to a target buffer where the name is      */
   /*                   copied to.                                          */
   /*                                                                       */
   /* <Return>                                                              */
@@ -2653,7 +2679,7 @@
   /* <Note>                                                                */
   /*    An error is returned if the face doesn't provide glyph names or if */
   /*    the glyph index is invalid.  In all cases of failure, the first    */
-  /*    byte of `buffer' will be set to 0 to indicate an empty name.       */
+  /*    byte of `buffer' is set to 0 to indicate an empty name.            */
   /*                                                                       */
   /*    The glyph name is truncated to fit within the buffer if it is too  */
   /*    long.  The returned string is always zero-terminated.              */
@@ -2711,7 +2737,7 @@
   /*    FreeType error code.  0 means success.                             */
   /*                                                                       */
   /* <Note>                                                                */
-  /*    This function will return an error if no charmap in the face       */
+  /*    This function returns an error if no charmap in the face           */
   /*    corresponds to the encoding queried here.                          */
   /*                                                                       */
   FT_EXPORT( FT_Error )
@@ -2738,7 +2764,7 @@
   /*    FreeType error code.  0 means success.                             */
   /*                                                                       */
   /* <Note>                                                                */
-  /*    This function will return an error if the charmap is not part of   */
+  /*    This function returns an error if the charmap is not part of       */
   /*    the face (i.e., if it is not listed in the face->charmaps[]        */
   /*    table).                                                            */
   /*                                                                       */
@@ -2801,7 +2827,7 @@
   /*                                                                       */
   /* <Description>                                                         */
   /*    This function is used to return the first character code in the    */
-  /*    current charmap of a given face.  It will also return the          */
+  /*    current charmap of a given face.  It also returns the              */
   /*    corresponding glyph index.                                         */
   /*                                                                       */
   /* <Input>                                                               */
@@ -2833,9 +2859,9 @@
   /*      }                                                                */
   /*    }                                                                  */
   /*                                                                       */
-  /*    Note that `*agindex' will be set to 0 if the charmap is empty.     */
-  /*    The result itself can be 0 in two cases: if the charmap is empty   */
-  /*    or when the value 0 is the first valid character code.             */
+  /*    Note that `*agindex' is set to 0 if the charmap is empty.  The     */
+  /*    result itself can be 0 in two cases: if the charmap is empty or    */
+  /*    when the value 0 is the first valid character code.                */
   /*                                                                       */
   FT_EXPORT( FT_ULong )
   FT_Get_First_Char( FT_Face   face,
@@ -2868,8 +2894,8 @@
   /*    through all character codes available in a given charmap.  See     */
   /*    the note for this function for a simple code example.              */
   /*                                                                       */
-  /*    Note that `*agindex' will be set to 0 when there are no more codes */
-  /*    in the charmap.                                                    */
+  /*    Note that `*agindex' is set to 0 when there are no more codes in   */
+  /*    the charmap.                                                       */
   /*                                                                       */
   FT_EXPORT( FT_ULong )
   FT_Get_Next_Char( FT_Face    face,
diff --git a/include/freetype/ftcache.h b/include/freetype/ftcache.h
index 20e9a1e..0ec33ac 100644
--- a/include/freetype/ftcache.h
+++ b/include/freetype/ftcache.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType Cache subsystem (specification).                            */
 /*                                                                         */
-/*  Copyright 1996-2001, 2002, 2003, 2004 by                               */
+/*  Copyright 1996-2001, 2002, 2003, 2004, 2005 by                         */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -272,8 +272,10 @@
   /* <Input>                                                               */
   /*    library     :: The parent FreeType library handle to use.          */
   /*                                                                       */
-  /*    max_bytes   :: Maximum number of bytes to use for cached data.     */
-  /*                   Use 0 for defaults.                                 */
+  /*    max_bytes   :: Maximum number of bytes to use for cached data      */
+  /*                   nodes.  Use 0 for defaults.  Note that this value   */
+  /*                   does not account for managed FT_Face and FT_Size    */
+  /*                   objects.                                            */
   /*                                                                       */
   /*    requester   :: An application-provided callback used to translate  */
   /*                   face IDs into real @FT_Face objects.                */
@@ -288,6 +290,15 @@
   /* <Return>                                                              */
   /*    FreeType error code.  0 means success.                             */
   /*                                                                       */
+  /* <Note>                                                                */
+  /*    When you perform a lookup, out-of-memory errors are detected       */
+  /*    _within_ the lookup and force incremental flushes of the cache     */
+  /*    until enough memory is released for the lookup to succeed.         */
+  /*                                                                       */
+  /*    If a lookup fails with FT_Err_Out_Of_Memory the cache has already  */
+  /*    been completely flushed, and still no memory is available for the  */
+  /*    operation.                                                         */
+  /*                                                                       */
   FT_EXPORT( FT_Error )
   FTC_Manager_New( FT_Library          library,
                    FT_UInt             max_faces,
diff --git a/src/autofit/afangles.c b/src/autofit/afangles.c
index 7411be7..a59246d 100644
--- a/src/autofit/afangles.c
+++ b/src/autofit/afangles.c
@@ -20,6 +20,112 @@
 #include "aftypes.h"
 
 
+#if 1
+
+  /* the following table has been automatically generated with */
+  /* the `mather.py' Python script                             */
+
+#define AF_ATAN_BITS  8
+
+  static const FT_Byte  af_arctan[1L << AF_ATAN_BITS] =
+  {
+     0,  0,  1,  1,  1,  2,  2,  2,
+     3,  3,  3,  3,  4,  4,  4,  5,
+     5,  5,  6,  6,  6,  7,  7,  7,
+     8,  8,  8,  9,  9,  9, 10, 10,
+    10, 10, 11, 11, 11, 12, 12, 12,
+    13, 13, 13, 14, 14, 14, 14, 15,
+    15, 15, 16, 16, 16, 17, 17, 17,
+    18, 18, 18, 18, 19, 19, 19, 20,
+    20, 20, 21, 21, 21, 21, 22, 22,
+    22, 23, 23, 23, 24, 24, 24, 24,
+    25, 25, 25, 26, 26, 26, 26, 27,
+    27, 27, 28, 28, 28, 28, 29, 29,
+    29, 30, 30, 30, 30, 31, 31, 31,
+    31, 32, 32, 32, 33, 33, 33, 33,
+    34, 34, 34, 34, 35, 35, 35, 35,
+    36, 36, 36, 36, 37, 37, 37, 38,
+    38, 38, 38, 39, 39, 39, 39, 40,
+    40, 40, 40, 41, 41, 41, 41, 42,
+    42, 42, 42, 42, 43, 43, 43, 43,
+    44, 44, 44, 44, 45, 45, 45, 45,
+    46, 46, 46, 46, 46, 47, 47, 47,
+    47, 48, 48, 48, 48, 48, 49, 49,
+    49, 49, 50, 50, 50, 50, 50, 51,
+    51, 51, 51, 51, 52, 52, 52, 52,
+    52, 53, 53, 53, 53, 53, 54, 54,
+    54, 54, 54, 55, 55, 55, 55, 55,
+    56, 56, 56, 56, 56, 57, 57, 57,
+    57, 57, 57, 58, 58, 58, 58, 58,
+    59, 59, 59, 59, 59, 59, 60, 60,
+    60, 60, 60, 61, 61, 61, 61, 61,
+    61, 62, 62, 62, 62, 62, 62, 63,
+    63, 63, 63, 63, 63, 64, 64, 64
+  };
+
+
+  FT_LOCAL_DEF( AF_Angle )
+  af_angle_atan( FT_Fixed  dx,
+                 FT_Fixed  dy )
+  {
+    AF_Angle  angle;
+
+
+    /* check trivial cases */
+    if ( dy == 0 )
+    {
+      angle = 0;
+      if ( dx < 0 )
+        angle = AF_ANGLE_PI;
+      return angle;
+    }
+    else if ( dx == 0 )
+    {
+      angle = AF_ANGLE_PI2;
+      if ( dy < 0 )
+        angle = -AF_ANGLE_PI2;
+      return angle;
+    }
+
+    angle = 0;
+    if ( dx < 0 )
+    {
+      dx = -dx;
+      dy = -dy;
+      angle = AF_ANGLE_PI;
+    }
+
+    if ( dy < 0 )
+    {
+      FT_Pos  tmp;
+
+
+      tmp = dx;
+      dx  = -dy;
+      dy  = tmp;
+      angle -= AF_ANGLE_PI2;
+    }
+
+    if ( dx == 0 && dy == 0 )
+      return 0;
+
+    if ( dx == dy )
+      angle += AF_ANGLE_PI4;
+    else if ( dx > dy )
+      angle += af_arctan[FT_DivFix( dy, dx ) >> ( 16 - AF_ATAN_BITS )];
+    else
+      angle += AF_ANGLE_PI2 -
+               af_arctan[FT_DivFix( dx, dy ) >> ( 16 - AF_ATAN_BITS )];
+
+    if ( angle > AF_ANGLE_PI )
+      angle -= AF_ANGLE_2PI;
+
+    return angle;
+  }
+
+
+#else /* 0 */
+
 /*
  * a python script used to generate the following table
  *
@@ -216,6 +322,8 @@
     return v.y;
   }
 
+#endif /* 0 */
+
 
   FT_LOCAL_DEF( AF_Angle )
   af_angle_diff( AF_Angle  angle1,
diff --git a/src/autofit/aflatin.c b/src/autofit/aflatin.c
index ab47f88..b7e04e3 100644
--- a/src/autofit/aflatin.c
+++ b/src/autofit/aflatin.c
@@ -1409,7 +1409,7 @@
     AF_LatinAxis     axis     = & metrics->axis[dim];
     FT_Pos           dist     = width;
     FT_Int           sign     = 0;
-    FT_Int           vertical = AF_HINTS_DO_VERTICAL( hints );
+    FT_Int           vertical = ( dim == AF_DIMENSION_VERT );
 
 
     if ( !AF_LATIN_HINTS_DO_STEM_ADJUST( hints ) )
diff --git a/src/base/Jamfile b/src/base/Jamfile
index 945b05c..2c486d1 100644
--- a/src/base/Jamfile
+++ b/src/base/Jamfile
@@ -30,11 +30,15 @@
 
 # Add the optional/replaceable files.
 #
-Library  $(FT2_LIB) : ftsystem.c   ftinit.c    ftglyph.c  ftmm.c     ftbdf.c
-                      ftbbox.c     ftdebug.c   ftxf86.c   fttype1.c  ftpfr.c
-                      ftstroke.c   ftwinfnt.c  ftotval.c  ftgxval.c  ftbitmap.c
-                      ftsynth.c
-                      ;
+{
+  local  _sources =  system  init    glyph  mm      bdf
+                     bbox    debug   xf86   type1   pfr
+                     stroke  winfnt  otval  bitmap  synth
+                     gxval
+                     ;
+
+  Library  $(FT2_LIB) : ft$(_sources).c ;
+}
 
 # Add Macintosh-specific file to the library when necessary.
 #
diff --git a/src/cache/ftccback.h b/src/cache/ftccback.h
new file mode 100644
index 0000000..6b47e09
--- /dev/null
+++ b/src/cache/ftccback.h
@@ -0,0 +1,85 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftccback.h                                                             */
+/*                                                                         */
+/*    Callback functions of the caching sub-system (specification only).   */
+/*                                                                         */
+/*  Copyright 2004 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 __FTCCBACK_H__
+#define __FTCCBACK_H__
+
+#include <ft2build.h>
+#include FT_CACHE_H
+#include FT_CACHE_INTERNAL_MRU_H
+#include FT_CACHE_INTERNAL_IMAGE_H
+#include FT_CACHE_INTERNAL_MANAGER_H
+#include FT_CACHE_INTERNAL_GLYPH_H
+#include FT_CACHE_INTERNAL_SBITS_H
+
+
+  FT_LOCAL( void )
+  ftc_inode_free( FTC_Node   inode,
+                  FTC_Cache  cache );
+
+  FT_LOCAL( FT_Error )
+  ftc_inode_new( FTC_Node   *pinode,
+                 FT_Pointer  gquery,
+                 FTC_Cache   cache );
+
+  FT_LOCAL( FT_ULong )
+  ftc_inode_weight( FTC_Node   inode,
+                    FTC_Cache  cache );
+
+
+  FT_LOCAL( void )
+  ftc_snode_free( FTC_Node   snode,
+                  FTC_Cache  cache );
+
+  FT_LOCAL( FT_Error )
+  ftc_snode_new( FTC_Node   *psnode,
+                 FT_Pointer  gquery,
+                 FTC_Cache   cache );
+
+  FT_LOCAL( FT_ULong )
+  ftc_snode_weight( FTC_Node   snode,
+                    FTC_Cache  cache );
+
+  FT_LOCAL( FT_Bool )
+  ftc_snode_compare( FTC_Node    snode,
+                     FT_Pointer  gquery,
+                     FTC_Cache   cache );
+
+
+  FT_LOCAL( FT_Bool )
+  ftc_gnode_compare( FTC_Node    gnode,
+                     FT_Pointer  gquery,
+                     FTC_Cache   cache );
+
+
+  FT_LOCAL( FT_Error )
+  ftc_gcache_init( FTC_Cache  cache );
+
+  FT_LOCAL( void )
+  ftc_gcache_done( FTC_Cache  cache );
+
+
+  FT_LOCAL( FT_Error )
+  ftc_cache_init( FTC_Cache  cache );
+
+  FT_LOCAL( void )
+  ftc_cache_done( FTC_Cache  cache );
+
+
+#endif /* __FTCCBACK_H__ */
+
+/* END */
diff --git a/src/cff/cffobjs.c b/src/cff/cffobjs.c
index 8522c1f..19ea482 100644
--- a/src/cff/cffobjs.c
+++ b/src/cff/cffobjs.c
@@ -636,8 +636,9 @@
         /*                                                                 */
         /* Compute face flags.                                             */
         /*                                                                 */
-        flags = FT_FACE_FLAG_SCALABLE  |    /* scalable outlines */
-                FT_FACE_FLAG_HORIZONTAL;    /* horizontal data   */
+        flags = FT_FACE_FLAG_SCALABLE   |       /* scalable outlines */
+                FT_FACE_FLAG_HORIZONTAL |       /* horizontal data   */
+                FT_FACE_FLAG_HINTER;            /* has native hinter */
 
         if ( sfnt_format )
           flags |= FT_FACE_FLAG_SFNT;
diff --git a/src/cid/cidobjs.c b/src/cid/cidobjs.c
index 3fb47bc..efeb47e 100644
--- a/src/cid/cidobjs.c
+++ b/src/cid/cidobjs.c
@@ -362,9 +362,9 @@
       cidface->num_charmaps = 0;
 
       cidface->face_index = face_index;
-      cidface->face_flags = FT_FACE_FLAG_SCALABLE;
-
-      cidface->face_flags |= FT_FACE_FLAG_HORIZONTAL;
+      cidface->face_flags = FT_FACE_FLAG_SCALABLE   | /* scalable outlines */
+                            FT_FACE_FLAG_HORIZONTAL | /* horizontal data   */
+                            FT_FACE_FLAG_HINTER;      /* has native hinter */
 
       if ( info->is_fixed_pitch )
         cidface->face_flags |= FT_FACE_FLAG_FIXED_WIDTH;
diff --git a/src/gxvalid/gxvbsln.c b/src/gxvalid/gxvbsln.c
index c330138..6cca658 100644
--- a/src/gxvalid/gxvbsln.c
+++ b/src/gxvalid/gxvbsln.c
@@ -131,8 +131,9 @@
     FT_UShort            offset;
     GXV_LookupValueDesc  value;
 
-
-    offset = base_value.u + ( relative_gindex * sizeof ( FT_UShort ) );
+    /* XXX: check range ? */
+    offset = (FT_UShort)( base_value.u +
+                          ( relative_gindex * sizeof ( FT_UShort ) ) );
 
     p     = valid->lookuptbl_head + offset;
     limit = lookuptbl_limit;
diff --git a/src/gxvalid/gxvcommn.c b/src/gxvalid/gxvcommn.c
index c7bdfd1..82fd6b3 100644
--- a/src/gxvalid/gxvcommn.c
+++ b/src/gxvalid/gxvcommn.c
@@ -94,7 +94,7 @@
       if ( j == nmemb )
         FT_INVALID_OFFSET;
 
-      *(length[i]) = buff[j + 1] - buff[j];
+      *(length[i]) = (FT_UShort)( buff[j + 1] - buff[j] );
 
       if ( 0 != offset[i] && 0 == *(length[i]) )
         FT_INVALID_OFFSET;
@@ -197,8 +197,8 @@
       GXV_LIMIT_CHECK( 1 );
       val = FT_NEXT_BYTE( p );
 
-      *min = FT_MIN( *min, val );
-      *max = FT_MAX( *max, val );
+      *min = (FT_Byte)FT_MIN( *min, val );
+      *max = (FT_Byte)FT_MAX( *max, val );
     }
 
     valid->subtable_length = p - table;
@@ -226,8 +226,8 @@
       GXV_LIMIT_CHECK( 2 );
       val = FT_NEXT_USHORT( p );
 
-      *min = FT_MIN( *min, val );
-      *max = FT_MAX( *max, val );
+      *min = (FT_Byte)FT_MIN( *min, val );
+      *max = (FT_Byte)FT_MAX( *max, val );
     }
 
     valid->subtable_length = p - table;
@@ -282,9 +282,9 @@
       ;
 
     entrySelector--;
-    searchRange *= binSrchHeader->unitSize;
-    rangeShift   = binSrchHeader->nUnits * binSrchHeader->unitSize -
-                     searchRange;
+    searchRange = (FT_UShort)( searchRange * binSrchHeader->unitSize );
+    rangeShift  = (FT_UShort)( binSrchHeader->nUnits * binSrchHeader->unitSize
+                               - searchRange );
 
     if ( searchRange   != binSrchHeader->searchRange   ||
          entrySelector != binSrchHeader->entrySelector ||
@@ -629,8 +629,11 @@
 
       for ( gid = firstGlyph; gid <= lastGlyph; gid++ )
       {
-        value = valid->lookupfmt4_trans( gid - firstGlyph, base_value,
-                                         limit, valid );
+        value = valid->lookupfmt4_trans( (FT_UShort)( gid - firstGlyph ),
+                                         base_value,
+                                         limit,
+                                         valid );
+
         valid->lookupval_func( gid, value, valid );
       }
     }
@@ -739,14 +742,14 @@
     glyphCount = FT_NEXT_USHORT( p );
 
     gxv_glyphid_validate( firstGlyph, valid );
-    gxv_glyphid_validate( firstGlyph + glyphCount, valid );
+    gxv_glyphid_validate( (FT_UShort)( firstGlyph + glyphCount ), valid );
 
     /* valueArray */
     for ( i = 0; i < glyphCount; i++ )
     {
       GXV_LIMIT_CHECK( 2 );
       value = GXV_LOOKUP_VALUE_LOAD( p, valid->lookupval_sign );
-      valid->lookupval_func( firstGlyph + i, value, valid );
+      valid->lookupval_func( (FT_UShort)( firstGlyph + i ), value, valid );
     }
 
     valid->subtable_length = p - table;
@@ -913,12 +916,14 @@
 
     GXV_TRACE(( "  nameIndex = %d (UNTITLED)\n", name_index ));
     FT_INVALID_DATA;
+    goto Exit;  /* make compiler happy */
 
   Out:
     FT_TRACE1(( "  nameIndex = %d (", name_index ));
     GXV_TRACE_HEXDUMP_SFNTNAME( name );
     FT_TRACE1(( ")\n" ));
 
+  Exit:
     GXV_EXIT;
   }
 
@@ -967,7 +972,7 @@
     if ( !nGlyphs )
       goto Out;
 
-    gxv_glyphid_validate( firstGlyph + nGlyphs, valid );
+    gxv_glyphid_validate( (FT_UShort)( firstGlyph + nGlyphs ), valid );
 
     {
       FT_Byte    nGlyphInClass[256];
@@ -1000,12 +1005,12 @@
           break;
         }
       }
-      *length_p = p - table;
+      *length_p = (FT_UShort)( p - table );
 
       /* scan max ClassID in use */
       for ( i = 0; i < stateSize; i++ )
         if ( ( 3 < i ) && ( nGlyphInClass[i] > 0 ) )
-          *maxClassID_p = i;
+          *maxClassID_p = (FT_Byte)i;  /* XXX: Check Range? */
     }
 
   Out:
@@ -1031,6 +1036,8 @@
     FT_Byte   clazz;
     FT_Byte   entry;
 
+    FT_UNUSED( stateSize ); /* for the non-debugging case */
+
 
     GXV_NAME_ENTER( "StateArray" );
 
@@ -1053,13 +1060,13 @@
       for ( clazz = 0; clazz <= maxClassID; clazz++ )
       {
         entry = FT_NEXT_BYTE( p );
-        *maxEntry_p = FT_MAX( *maxEntry_p, entry );
+        *maxEntry_p = (FT_Byte)FT_MAX( *maxEntry_p, entry );
       }
     }
     GXV_TRACE(( "parsed: maxState=%d, maxEntry=%d\n",
                 *maxState_p, *maxEntry_p ));
 
-    *length_p = p - table;
+    *length_p = (FT_UShort)( p - table );
 
     GXV_EXIT;
   }
@@ -1097,7 +1104,7 @@
         FT_INVALID_TOO_SHORT;
 
       /* ftxvalidator and FontValidator both warn and continue */
-      maxEntry = *length_p / entrySize - 1;
+      maxEntry = (FT_Byte)( *length_p / entrySize - 1 );
       GXV_TRACE(( "too large maxEntry, shrinking to %d fit EntryTable length\n",
                   maxEntry ));
     }
@@ -1132,11 +1139,12 @@
         continue;
       }
 
-      state =  ( newState - stateArray ) / ( 1 + maxClassID );
+      state = (FT_Byte)( ( newState - stateArray ) / ( 1 + maxClassID ) );
 
       switch ( GXV_GLYPHOFFSET_FMT( statetable ) )
       {
       case GXV_GLYPHOFFSET_NONE:
+        glyphOffset.uc = 0;  /* make compiler happy */
         break;
 
       case GXV_GLYPHOFFSET_UCHAR:
@@ -1166,6 +1174,7 @@
       default:
         if ( valid->root->level >= FT_VALIDATE_PARANOID )
           FT_INVALID_FORMAT;
+        goto Exit;
       }
 
       if ( NULL != valid->statetable.entry_validate_func )
@@ -1176,7 +1185,9 @@
                                                statetable_limit,
                                                valid );
     }
-    *length_p = p - table;
+
+  Exit:
+    *length_p = (FT_UShort)( p - table );
 
     GXV_EXIT;
   }
@@ -1258,7 +1269,7 @@
     else
       setup_func = gxv_StateTable_subtable_setup;
 
-    setup_func( limit - table,
+    setup_func( (FT_UShort)( limit - table ),
                 classTable,
                 stateArray,
                 entryTable,
@@ -1276,7 +1287,7 @@
                                &maxClassID,
                                valid );
     else
-      maxClassID = stateSize - 1;
+      maxClassID = (FT_Byte)( stateSize - 1 );
 
     if ( stateArray != 0 )
       gxv_StateArray_validate( table + stateArray,
@@ -1389,8 +1400,9 @@
     FT_UShort            offset;
     GXV_LookupValueDesc  value;
 
-
-    offset = base_value.u + relative_gindex * sizeof ( FT_UShort );
+    /* XXX: check range? */
+    offset = (FT_UShort)( base_value.u +
+                          relative_gindex * sizeof ( FT_UShort ) );
 
     p     = valid->lookuptbl_head + offset;
     limit = lookuptbl_limit;
@@ -1416,6 +1428,8 @@
     FT_UShort  clazz;
     FT_UShort  entry;
 
+    FT_UNUSED( stateSize ); /* for the non-debugging case */
+
 
     GXV_NAME_ENTER( "XStateArray" );
 
@@ -1438,7 +1452,7 @@
       for ( clazz = 0; clazz <= maxClassID; clazz++ )
       {
         entry = FT_NEXT_USHORT( p );
-        *maxEntry_p = FT_MAX( *maxEntry_p, entry );
+        *maxEntry_p = (FT_UShort)FT_MAX( *maxEntry_p, entry );
       }
     }
     GXV_TRACE(( "parsed: maxState=%d, maxEntry=%d\n",
@@ -1492,7 +1506,7 @@
           FT_INVALID_OFFSET;
       }
 
-      state = newState_idx / ( 1 + maxClassID );
+      state = (FT_UShort)( newState_idx / ( 1 + maxClassID ) );
       if ( 0 != ( newState_idx % ( 1 + maxClassID ) ) )
       {
         FT_TRACE4(( "-> new state = %d (supposed)\n"
@@ -1505,6 +1519,7 @@
       switch ( GXV_GLYPHOFFSET_FMT( xstatetable ) )
       {
       case GXV_GLYPHOFFSET_NONE:
+        glyphOffset.uc = 0; /* make compiler happy */
         break;
 
       case GXV_GLYPHOFFSET_UCHAR:
@@ -1534,6 +1549,7 @@
       default:
         if ( valid->root->level >= FT_VALIDATE_PARANOID )
           FT_INVALID_FORMAT;
+        goto Exit;
       }
 
       if ( NULL != valid->xstatetable.entry_validate_func )
@@ -1545,6 +1561,7 @@
                                                 valid );
     }
 
+  Exit:
     *length_p = p - table;
 
     GXV_EXIT;
@@ -1622,7 +1639,11 @@
         classTable_length = valid->subtable_length;
     }
     else
-      valid->xstatetable.maxClassID = valid->xstatetable.nClasses - 1;
+    {
+      /* XXX: check range? */
+      valid->xstatetable.maxClassID =
+        (FT_UShort)( valid->xstatetable.nClasses - 1 );
+    }
 
     if ( stateArray != 0 )
       gxv_XStateArray_validate( table + stateArray,
diff --git a/src/gxvalid/gxvfeat.c b/src/gxvalid/gxvfeat.c
index 05e784b..d7c6ad1 100644
--- a/src/gxvalid/gxvfeat.c
+++ b/src/gxvalid/gxvfeat.c
@@ -225,14 +225,15 @@
          ( featureFlags & GXV_FEAT_MASK_UNUSED ) == 0 )
       FT_INVALID_DATA;
 
-    exclusive = featureFlags & GXV_FEAT_MASK_EXCLUSIVE_SETTINGS;
+    exclusive = FT_BOOL( featureFlags & GXV_FEAT_MASK_EXCLUSIVE_SETTINGS );
     if ( exclusive )
     {
       FT_Byte  dynamic_default;
 
 
       if ( featureFlags & GXV_FEAT_MASK_DYNAMIC_DEFAULT )
-        dynamic_default = featureFlags & GXV_FEAT_MASK_DEFAULT_SETTING;
+        dynamic_default = (FT_Byte)( featureFlags &
+                                     GXV_FEAT_MASK_DEFAULT_SETTING );
       else
         dynamic_default = 0;
 
diff --git a/src/gxvalid/gxvjust.c b/src/gxvalid/gxvjust.c
index ec092eb..29bf840 100644
--- a/src/gxvalid/gxvjust.c
+++ b/src/gxvalid/gxvjust.c
@@ -401,10 +401,10 @@
     FT_UNUSED( valid );
 
 
-    setMark      = ( 0x8000U & flags ) / 0x8000U;
-    dontAdvance  = ( 0x4000  & flags ) / 0x4000;
-    markClass    = ( 0x3F80  & flags ) / 0x0080;
-    currentClass =   0x007F  & flags ;
+    setMark      = (FT_UShort)( ( flags >> 15 ) & 1    );
+    dontAdvance  = (FT_UShort)( ( flags >> 14 ) & 1    );
+    markClass    = (FT_UShort)( ( flags >> 7  ) & 0x7F );
+    currentClass = (FT_UShort)(   flags         & 0x7F );
 
     /* TODO: validate markClass & currentClass */
   }
diff --git a/src/gxvalid/gxvkern.c b/src/gxvalid/gxvkern.c
index a17ba9c..edc9af2 100644
--- a/src/gxvalid/gxvkern.c
+++ b/src/gxvalid/gxvkern.c
@@ -234,9 +234,9 @@
     FT_UNUSED( glyphOffset );
 
 
-    push        =   flags / 0x8000U;
-    dontAdvance = ( flags & 0x4000 ) / 0x4000;
-    valueOffset =   flags & 0x3FFF;
+    push        = (FT_UShort)( ( flags >> 15 ) & 1      );
+    dontAdvance = (FT_UShort)( ( flags >> 14 ) & 1      );
+    valueOffset = (FT_UShort)(   flags         & 0x3FFF );
 
     {
       GXV_kern_fmt1_StateOptRecData  vt_rec =
@@ -341,7 +341,7 @@
                 tag, firstGlyph, nGlyphs ));
 
     gxv_glyphid_validate( firstGlyph, valid );
-    gxv_glyphid_validate( firstGlyph + nGlyphs - 1, valid );
+    gxv_glyphid_validate( (FT_UShort)( firstGlyph + nGlyphs - 1 ), valid );
 
     gxv_array_getlimits_ushort( p, p + ( 2 * nGlyphs ),
                                 &( GXV_KERN_FMT2_DATA( offset_min[spec] ) ),
@@ -512,15 +512,18 @@
     FT_Bool  kernCrossStream;
     FT_Bool  kernVariation;
 
+    FT_UNUSED( valid );
+
 
     /* reserved bits = 0 */
     if ( coverage & 0x1FFC )
       return 0;
 
-    kernVertical    = ( coverage >> 15 ) & 1;
-    kernCrossStream = ( coverage >> 14 ) & 1;
-    kernVariation   = ( coverage >> 13 ) & 1;
-    *format         =   coverage & 0x0003;
+    kernVertical    = FT_BOOL( ( coverage >> 15 ) & 1 );
+    kernCrossStream = FT_BOOL( ( coverage >> 14 ) & 1 );
+    kernVariation   = FT_BOOL( ( coverage >> 13 ) & 1 );
+
+    *format = (FT_UShort)( coverage & 0x0003 );
 
     GXV_TRACE(( "new Apple-dialect: "
                 "horizontal=%d, cross-stream=%d, variation=%d, format=%d\n",
@@ -550,9 +553,10 @@
     if ( coverage & 0x02FC )
       return 0;
 
-    horizontal   = ( coverage >> 15 ) & 1;
-    cross_stream = ( coverage >> 13 ) & 1;
-    *format      =   coverage & 0x0003;
+    horizontal   = FT_BOOL( ( coverage >> 15 ) & 1 );
+    cross_stream = FT_BOOL( ( coverage >> 13 ) & 1 );
+
+    *format = (FT_UShort)( coverage & 0x0003 );
 
     GXV_TRACE(( "classic Apple-dialect: "
                 "horizontal=%d, cross-stream=%d, format=%d\n",
@@ -579,16 +583,19 @@
     FT_Bool  cross_stream;
     FT_Bool  override;
 
+    FT_UNUSED( valid );
+
 
     /* reserved bits = 0 */
     if ( coverage & 0xFDF0 )
       return 0;
 
-    horizontal   =   coverage & 1;
-    minimum      = ( coverage >> 1 ) & 1;
-    cross_stream = ( coverage >> 2 ) & 1;
-    override     = ( coverage >> 3 ) & 1;
-    *format      = ( coverage >> 8 ) & 0x0003;
+    horizontal   = FT_BOOL(   coverage        & 1 );
+    minimum      = FT_BOOL( ( coverage >> 1 ) & 1 );
+    cross_stream = FT_BOOL( ( coverage >> 2 ) & 1 );
+    override     = FT_BOOL( ( coverage >> 3 ) & 1 );
+
+    *format = (FT_UShort)( ( coverage >> 8 ) & 0x0003 );
 
     GXV_TRACE(( "classic Microsoft-dialect: "
                 "horizontal=%d, minimum=%d, cross-stream=%d, "
diff --git a/src/gxvalid/gxvlcar.c b/src/gxvalid/gxvlcar.c
index 3888358..48821ea 100644
--- a/src/gxvalid/gxvlcar.c
+++ b/src/gxvalid/gxvlcar.c
@@ -157,8 +157,9 @@
 
     FT_UNUSED( lookuptbl_limit );
 
-
-    offset = base_value.u + relative_gindex * sizeof ( FT_UShort );
+    /* XXX: check range? */
+    offset = (FT_UShort)( base_value.u +
+                          relative_gindex * sizeof ( FT_UShort ) );
     p      = valid->root->base + offset;
     limit  = valid->root->limit;
 
diff --git a/src/gxvalid/gxvmort.c b/src/gxvalid/gxvmort.c
index 4cb3a19..6fb71b9 100644
--- a/src/gxvalid/gxvmort.c
+++ b/src/gxvalid/gxvmort.c
@@ -64,10 +64,9 @@
 
 
       /* nSettings in gxvfeat.c is halved for exclusive on/off settings */
+      nSettings_max = gxv_feat_registry[f->featureType].nSettings;
       if ( gxv_feat_registry[f->featureType].exclusive )
-        nSettings_max = 2 * gxv_feat_registry[f->featureType].nSettings;
-      else
-        nSettings_max = gxv_feat_registry[f->featureType].nSettings;
+        nSettings_max = (FT_Byte)( 2 * nSettings_max );
 
       GXV_TRACE(( "featureType %d is registered", f->featureType ));
       GXV_TRACE(( "setting %d", f->featureSetting ));
@@ -125,6 +124,8 @@
   gxv_mort_coverage_validate( FT_UShort      coverage,
                               GXV_Validator  valid )
   {
+    FT_UNUSED( valid );
+
     if ( coverage & 0x8000U )
       GXV_TRACE(( " this subtable is for vertical text only\n" ));
     else
diff --git a/src/gxvalid/gxvmort0.c b/src/gxvalid/gxvmort0.c
index c93ee4d..bb04589 100644
--- a/src/gxvalid/gxvmort0.c
+++ b/src/gxvalid/gxvmort0.c
@@ -79,14 +79,16 @@
     FT_UNUSED( table );
     FT_UNUSED( limit );
 
+    FT_UNUSED( GXV_Mort_IndicScript_Msg[verb] ); /* for the non-debugging */
+    FT_UNUSED( glyphOffset );                    /* case                  */
 
-    markFirst   =   flags / 0x8000U;
-    dontAdvance = ( flags & 0x4000 ) / 0x4000;
-    markLast    = ( flags & 0x2000 ) / 0x2000;
-    reserved    =   flags & 0x1FF0;
-    verb        =   flags & 0x000F;
 
-    FT_UNUSED( GXV_Mort_IndicScript_Msg[verb] );
+    markFirst   = (FT_UShort)( ( flags >> 15 ) & 1 );
+    dontAdvance = (FT_UShort)( ( flags >> 14 ) & 1 );
+    markLast    = (FT_UShort)( ( flags >> 13 ) & 1 );
+
+    reserved = (FT_UShort)( flags & 0x1FF0 );
+    verb     = (FT_UShort)( flags & 0x000F );
 
     GXV_TRACE(( "  IndicScript MorphRule for glyphOffset 0x%04x",
                 glyphOffset.u ));
diff --git a/src/gxvalid/gxvmort1.c b/src/gxvalid/gxvmort1.c
index 86d667c..0b4c180 100644
--- a/src/gxvalid/gxvmort1.c
+++ b/src/gxvalid/gxvmort1.c
@@ -113,15 +113,19 @@
     FT_UNUSED( state );
 
 
-    substTable       = ((GXV_mort_subtable_type1_StateOptRec *)
-                        (valid->statetable.optdata))->substitutionTable;
-    substTable_limit = substTable +
-                       ((GXV_mort_subtable_type1_StateOptRec *)
-                        (valid->statetable.optdata))->substitutionTable_length;
+    substTable =
+      ((GXV_mort_subtable_type1_StateOptRec *)
+       (valid->statetable.optdata))->substitutionTable;
+    substTable_limit =
+      (FT_UShort)( substTable +
+                   ((GXV_mort_subtable_type1_StateOptRec *)
+                    (valid->statetable.optdata))->substitutionTable_length );
 
-    min_gid = ( substTable       - wordOffset * 2 ) / 2;
-    max_gid = ( substTable_limit - wordOffset * 2 ) / 2;
-    max_gid = FT_MAX( max_gid, valid->face->num_glyphs );
+    min_gid = (FT_UShort)( ( substTable       - wordOffset * 2 ) / 2 );
+    max_gid = (FT_UShort)( ( substTable_limit - wordOffset * 2 ) / 2 );
+    max_gid = (FT_UShort)( FT_MAX( max_gid, valid->face->num_glyphs ) );
+
+    /* XXX: check range? */
 
     /* TODO: min_gid & max_gid comparison with ClassTable contents */
   }
@@ -146,11 +150,12 @@
     FT_UNUSED( limit );
 
 
-    setMark     =   flags / 0x8000U;
-    dontAdvance = ( flags & 0x4000 ) / 0x4000;
-    reserved    =   flags & 0x3FFF;
-    markOffset    = GXV_USHORT_TO_SHORT( glyphOffset.ul / 0x00010000UL );
-    currentOffset = GXV_USHORT_TO_SHORT( glyphOffset.ul & 0x0000FFFFUL );
+    setMark       = (FT_UShort)(   flags >> 15            );
+    dontAdvance   = (FT_UShort)( ( flags >> 14 ) & 1      );
+    reserved      = (FT_Short)(    flags         & 0x3FFF );
+
+    markOffset    = (FT_Short)( glyphOffset.ul >> 16 );
+    currentOffset = (FT_Short)( glyphOffset.ul       );
 
     if ( 0 < reserved )
     {
@@ -177,9 +182,9 @@
                                                GXV_Validator  valid )
   {
     FT_Bytes   p = table;
-    FT_UShort  num_gids =
+    FT_UShort  num_gids = (FT_UShort)(
                  ((GXV_mort_subtable_type1_StateOptRec *)
-                  (valid->statetable.optdata))->substitutionTable_length / 2;
+                  (valid->statetable.optdata))->substitutionTable_length / 2 );
     FT_UShort  i;
 
 
diff --git a/src/gxvalid/gxvmort2.c b/src/gxvalid/gxvmort2.c
index bfbe473..92ccf06 100644
--- a/src/gxvalid/gxvmort2.c
+++ b/src/gxvalid/gxvmort2.c
@@ -177,9 +177,10 @@
 
 
       lig_action = FT_NEXT_ULONG( p );
-      last   = (lig_action & 0x80000000UL) / 0x80000000UL;
-      store  = (lig_action & 0x40000000UL) / 0x40000000UL;
-      offset =  lig_action & 0x3FFFFFFFUL;
+      last   = (FT_UShort)( ( lig_action >> 31 ) & 1 );
+      store  = (FT_UShort)( ( lig_action >> 30 ) & 1 );
+
+      offset = lig_action & 0x3FFFFFFFUL;
     }
   }
 
@@ -202,9 +203,10 @@
     FT_UNUSED( limit );
 
 
-    setComponent  = ( flags & 0x8000U ) / 0x8000U;
-    dontAdvance   = ( flags & 0x4000  ) / 0x4000;
-    offset        =   flags & 0x3FFF;
+    setComponent = (FT_UShort)( ( flags >> 15 ) & 1 );
+    dontAdvance  = (FT_UShort)( ( flags >> 14 ) & 1 );
+    
+    offset = (FT_UShort)( flags & 0x3FFFU );
 
     if ( 0 < offset )
       gxv_mort_subtable_type2_ligActionOffset_validate( table, offset,
diff --git a/src/gxvalid/gxvmort4.c b/src/gxvalid/gxvmort4.c
index 959220e..a04bc1e 100644
--- a/src/gxvalid/gxvmort4.c
+++ b/src/gxvalid/gxvmort4.c
@@ -87,8 +87,9 @@
     FT_UShort            offset;
     GXV_LookupValueDesc  value;
 
-
-    offset = base_value.u + relative_gindex * sizeof ( FT_UShort );
+    /* XXX: check range? */
+    offset = (FT_UShort)( base_value.u +
+                          relative_gindex * sizeof ( FT_UShort ) );
 
     p     = valid->lookuptbl_head + offset;
     limit = lookuptbl_limit;
diff --git a/src/gxvalid/gxvmort5.c b/src/gxvalid/gxvmort5.c
index 5c90ed7..a7cabc3 100644
--- a/src/gxvalid/gxvmort5.c
+++ b/src/gxvalid/gxvmort5.c
@@ -158,16 +158,18 @@
     FT_UNUSED( state );
 
 
-    setMark              = ( flags >> 15 ) & 1;
-    dontAdvance          = ( flags >> 14 ) & 1;
-    currentIsKashidaLike = ( flags >> 13 ) & 1;
-    markedIsKashidaLike  = ( flags >> 12 ) & 1;
-    currentInsertBefore  = ( flags >> 11 ) & 1;
-    markedInsertBefore   = ( flags >> 10 ) & 1;
-    currentInsertCount   = ( flags & 0x03E0 ) / 0x0020;
-    markedInsertCount    = ( flags & 0x001F );
-    currentInsertList    = glyphOffset.ul / 0x00010000UL;
-    markedInsertList     = glyphOffset.ul & 0x0000FFFFUL;
+    setMark              = FT_BOOL( ( flags >> 15 ) & 1 );
+    dontAdvance          = FT_BOOL( ( flags >> 14 ) & 1 );
+    currentIsKashidaLike = FT_BOOL( ( flags >> 13 ) & 1 );
+    markedIsKashidaLike  = FT_BOOL( ( flags >> 12 ) & 1 );
+    currentInsertBefore  = FT_BOOL( ( flags >> 11 ) & 1 );
+    markedInsertBefore   = FT_BOOL( ( flags >> 10 ) & 1 );
+
+    currentInsertCount   = (FT_Byte)( ( flags >> 5 ) & 0x1F   );
+    markedInsertCount    = (FT_Byte)(   flags        & 0x001F );
+
+    currentInsertList    = (FT_UShort)( glyphOffset.ul >> 16 );
+    markedInsertList     = (FT_UShort)( glyphOffset.ul       );
 
     if ( 0 != currentInsertList && 0 != currentInsertCount )
     {
diff --git a/src/gxvalid/gxvmorx.c b/src/gxvalid/gxvmorx.c
index 5f894c7..849d5e9 100644
--- a/src/gxvalid/gxvmorx.c
+++ b/src/gxvalid/gxvmorx.c
@@ -85,8 +85,8 @@
       GXV_LIMIT_CHECK( rest );
 
       /* morx coverage consists of mort_coverage & 16bit padding */
-      gxv_mort_coverage_validate( ( coverage >> 16 ) | coverage, valid );
-
+      gxv_mort_coverage_validate( (FT_UShort)( ( coverage >> 16 ) | coverage ),
+                                  valid );
       if ( type > 5 )
         FT_INVALID_FORMAT;
 
@@ -128,7 +128,13 @@
     /* feature-array of morx is same with that of mort */
     gxv_mort_featurearray_validate( p, limit, nFeatureFlags, valid );
     p += valid->subtable_length;
-    gxv_morx_subtables_validate( p, table + chainLength, nSubtables, valid );
+
+    if ( nSubtables >= 0x10000 )
+      FT_INVALID_DATA;
+
+    gxv_morx_subtables_validate( p, table + chainLength,
+                                 (FT_UShort)nSubtables, valid );
+
     valid->subtable_length = chainLength;
 
     GXV_EXIT;
diff --git a/src/gxvalid/gxvmorx0.c b/src/gxvalid/gxvmorx0.c
index a902941..ca92b6c 100644
--- a/src/gxvalid/gxvmorx0.c
+++ b/src/gxvalid/gxvmorx0.c
@@ -59,11 +59,12 @@
     FT_UNUSED( limit );
 
 
-    markFirst   =   flags / 0x8000U;
-    dontAdvance = ( flags & 0x4000 ) / 0x4000;
-    markLast    = ( flags & 0x2000 ) / 0x2000;
-    reserved    =   flags & 0x1FF0;
-    verb        =   flags & 0x000F;
+    markFirst   = (FT_UShort)( ( flags >> 15 ) & 1 );
+    dontAdvance = (FT_UShort)( ( flags >> 14 ) & 1 );
+    markLast    = (FT_UShort)( ( flags >> 13 ) & 1 );
+
+    reserved = (FT_UShort)( flags & 0x1FF0 );
+    verb     = (FT_UShort)( flags & 0x000F );
 
     if ( 0 < reserved )
     {
diff --git a/src/gxvalid/gxvmorx1.c b/src/gxvalid/gxvmorx1.c
index 689e4a7..4090be9 100644
--- a/src/gxvalid/gxvmorx1.c
+++ b/src/gxvalid/gxvmorx1.c
@@ -122,11 +122,13 @@
     FT_UNUSED( limit );
 
 
-    setMark      =   flags / 0x8000U;
-    dontAdvance  = ( flags & 0x4000 ) / 0x4000;
-    reserved     =   flags & 0x3FFF;
-    markIndex    = GXV_USHORT_TO_SHORT( glyphOffset.ul / 0x00010000UL );
-    currentIndex = GXV_USHORT_TO_SHORT( glyphOffset.ul & 0x0000FFFFUL );
+    setMark      = (FT_UShort)( ( flags >> 15 ) & 1 );
+    dontAdvance  = (FT_UShort)( ( flags >> 14 ) & 1 );
+
+    reserved = (FT_UShort)( flags & 0x3FFF );
+
+    markIndex    = (FT_Short)( glyphOffset.ul >> 16 );
+    currentIndex = (FT_Short)( glyphOffset.ul       );
 
     GXV_TRACE(( " setMark=%01d dontAdvance=%01d\n",
                 setMark, dontAdvance ));
@@ -142,10 +144,12 @@
                 markIndex, currentIndex ));
 
     if ( optdata->substitutionTable_num_lookupTables < markIndex + 1 )
-      optdata->substitutionTable_num_lookupTables = markIndex + 1;
+      optdata->substitutionTable_num_lookupTables =
+        (FT_Short)( markIndex + 1 );
 
     if ( optdata->substitutionTable_num_lookupTables < currentIndex + 1 )
-      optdata->substitutionTable_num_lookupTables = currentIndex + 1;
+      optdata->substitutionTable_num_lookupTables =
+        (FT_Short)( currentIndex + 1 );
   }
 
 
@@ -154,7 +158,10 @@
                                                 GXV_LookupValueDesc  value,
                                                 GXV_Validator        valid )
   {
+    FT_UNUSED( glyph ); /* for the non-debugging case */
+
     GXV_TRACE(( "morx subtable type1 subst.: %d -> %d\n", glyph, value.u ));
+
     if ( value.u > valid->face->num_glyphs )
       FT_INVALID_GLYPH_ID;
   }
@@ -172,8 +179,9 @@
     FT_UShort            offset;
     GXV_LookupValueDesc  value;
 
-
-    offset = base_value.u + relative_gindex * sizeof ( FT_UShort );
+    /* XXX: check range? */
+    offset = (FT_UShort)( base_value.u +
+                          relative_gindex * sizeof ( FT_UShort ) );
 
     p     = valid->lookuptbl_head + offset;
     limit = lookuptbl_limit;
diff --git a/src/gxvalid/gxvmorx2.c b/src/gxvalid/gxvmorx2.c
index 93fe318..5cad516 100644
--- a/src/gxvalid/gxvmorx2.c
+++ b/src/gxvalid/gxvmorx2.c
@@ -174,9 +174,10 @@
 
 
       lig_action = FT_NEXT_ULONG( p );
-      last   = (lig_action & 0x80000000UL) / 0x80000000UL;
-      store  = (lig_action & 0x40000000UL) / 0x40000000UL;
-      offset =  lig_action & 0x3FFFFFFFUL;
+      last       = (FT_UShort)( ( lig_action >> 31 ) & 1 );
+      store      = (FT_UShort)( ( lig_action >> 30 ) & 1 );
+
+      offset = lig_action & 0x3FFFFFFFUL;
     }
   }
 
@@ -200,10 +201,11 @@
     FT_UNUSED( limit );
 
 
-    setComponent   = ( flags & 0x8000U ) / 0x8000U;
-    dontAdvance    = ( flags & 0x4000  ) / 0x4000;
-    performAction  = ( flags & 0x2000  ) / 0x2000;
-    reserved       =   flags & 0x1FFF;
+    setComponent   = (FT_UShort)( ( flags >> 15 ) & 1 );
+    dontAdvance    = (FT_UShort)( ( flags >> 14 ) & 1 );
+    performAction  = (FT_UShort)( ( flags >> 13 ) & 1 );
+
+    reserved       = (FT_UShort)( flags & 0x1FFF );
     ligActionIndex = glyphOffset.u;
 
     if ( reserved > 0 )
diff --git a/src/gxvalid/gxvmorx5.c b/src/gxvalid/gxvmorx5.c
index de9aebc..2920f54 100644
--- a/src/gxvalid/gxvmorx5.c
+++ b/src/gxvalid/gxvmorx5.c
@@ -147,7 +147,7 @@
     FT_Bool    markedIsKashidaLike;
     FT_Bool    currentInsertBefore;
     FT_Bool    markedInsertBefore;
-    FT_Bool    currentInsertCount;
+    FT_Byte    currentInsertCount;
     FT_Byte    markedInsertCount;
     FT_Byte    currentInsertList;
     FT_UShort  markedInsertList;
@@ -155,16 +155,18 @@
     FT_UNUSED( state );
 
 
-    setMark              = ( flags >> 15 ) & 1;
-    dontAdvance          = ( flags >> 14 ) & 1;
-    currentIsKashidaLike = ( flags >> 13 ) & 1;
-    markedIsKashidaLike  = ( flags >> 12 ) & 1;
-    currentInsertBefore  = ( flags >> 11 ) & 1;
-    markedInsertBefore   = ( flags >> 10 ) & 1;
-    currentInsertCount   = ( flags & 0x03E0 ) / 0x20;
-    markedInsertCount    = ( flags & 0x001F );
-    currentInsertList    = glyphOffset.ul / 0x00010000UL;
-    markedInsertList     = glyphOffset.ul & 0x0000FFFFUL;
+    setMark              = FT_BOOL( ( flags >> 15 ) & 1 );
+    dontAdvance          = FT_BOOL( ( flags >> 14 ) & 1 );
+    currentIsKashidaLike = FT_BOOL( ( flags >> 13 ) & 1 );
+    markedIsKashidaLike  = FT_BOOL( ( flags >> 12 ) & 1 );
+    currentInsertBefore  = FT_BOOL( ( flags >> 11 ) & 1 );
+    markedInsertBefore   = FT_BOOL( ( flags >> 10 ) & 1 );
+
+    currentInsertCount = (FT_Byte)( ( flags >> 5 ) & 0x1F   );
+    markedInsertCount  = (FT_Byte)(   flags        & 0x001F );
+
+    currentInsertList = (FT_Byte)  ( glyphOffset.ul >> 16 );
+    markedInsertList  = (FT_UShort)( glyphOffset.ul       );
 
     if ( currentInsertList && 0 != currentInsertCount )
       gxv_morx_subtable_type5_InsertList_validate( currentInsertList,
diff --git a/src/gxvalid/gxvopbd.c b/src/gxvalid/gxvopbd.c
index 12a21d4..8d6fe66 100644
--- a/src/gxvalid/gxvopbd.c
+++ b/src/gxvalid/gxvopbd.c
@@ -141,8 +141,9 @@
     FT_UNUSED( lookuptbl_limit );
     FT_UNUSED( valid );
 
-
-    value.u = base_value.u + relative_gindex * 4 * sizeof ( FT_Short );
+    /* XXX: check range? */
+    value.u = (FT_UShort)( base_value.u +
+                           relative_gindex * 4 * sizeof ( FT_Short ) );
 
     return value;
   }
diff --git a/src/gxvalid/gxvprop.c b/src/gxvalid/gxvprop.c
index b5211f1..010eeda 100644
--- a/src/gxvalid/gxvprop.c
+++ b/src/gxvalid/gxvprop.c
@@ -117,17 +117,17 @@
       char       complement;
 
 
-      offset = property & GXV_PROP_COMPLEMENTARY_BRACKET_OFFSET;
+      offset = (FT_UShort)( property & GXV_PROP_COMPLEMENTARY_BRACKET_OFFSET );
       if ( offset == 0 )
         FT_INVALID_DATA;
 
-      complement = offset >> 8;
+      complement = (char)( offset >> 8 );
       if ( complement & 0x08 )
       {
         /* Top bit is set: negative */
 
         /* Calculate the absolute offset */
-        complement = ( complement & 0x07 ) + 1;
+        complement = (char)( ( complement & 0x07 ) + 1 );
 
         /* The gid for complement must be greater than 0 */
         if ( glyph <= complement )
@@ -136,7 +136,7 @@
       else
       {
         /* The gid for complement must be the face. */
-        gxv_glyphid_validate( glyph + complement, valid );
+        gxv_glyphid_validate( (FT_UShort)( glyph + complement ), valid );
       }
     }
     else
@@ -213,8 +213,9 @@
     FT_UShort            offset;
     GXV_LookupValueDesc  value;
 
-
-    offset = base_value.u + relative_gindex * sizeof( FT_UShort );
+    /* XXX: check range? */
+    offset = (FT_UShort)( base_value.u +
+                          relative_gindex * sizeof( FT_UShort ) );
     p      = valid->lookuptbl_head + offset;
     limit  = lookuptbl_limit;
 
diff --git a/src/sfnt/sfdriver.c b/src/sfnt/sfdriver.c
index a282681..2c6f347 100644
--- a/src/sfnt/sfdriver.c
+++ b/src/sfnt/sfdriver.c
@@ -318,12 +318,6 @@
   {
     FT_UNUSED( module );
 
-    if ( ft_strcmp( module_interface, "get_sfnt" ) == 0 )
-      return (FT_Module_Interface)get_sfnt_table;
-
-    if ( ft_strcmp( module_interface, "load_sfnt" ) == 0 )
-      return (FT_Module_Interface)tt_face_load_any;
-
     return ft_service_list_lookup( sfnt_services, module_interface );
   }
 
diff --git a/src/sfnt/sfobjs.c b/src/sfnt/sfobjs.c
index 9e84662..bb6752a 100644
--- a/src/sfnt/sfobjs.c
+++ b/src/sfnt/sfobjs.c
@@ -536,9 +536,11 @@
       /* Compute face flags.                                               */
       /*                                                                   */
       if ( has_outline == TRUE )
-        flags |= FT_FACE_FLAG_SCALABLE;    /* scalable outlines */
+        flags |= FT_FACE_FLAG_SCALABLE;   /* scalable outlines */
 
-      flags |= FT_FACE_FLAG_SFNT      |   /* SFNT file format  */
+      /* The sfnt driver only supports bitmap fonts natively, thus we */
+      /* don't set FT_FACE_FLAG_HINTER.                               */
+      flags |= FT_FACE_FLAG_SFNT       |  /* SFNT file format  */
                FT_FACE_FLAG_HORIZONTAL;   /* horizontal data   */
 
 #ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES
diff --git a/src/truetype/ttgload.c b/src/truetype/ttgload.c
index 1c00866..d606cdb 100644
--- a/src/truetype/ttgload.c
+++ b/src/truetype/ttgload.c
@@ -755,20 +755,23 @@
   /*                                                                       */
 #define cur_to_org( n, zone ) \
           FT_ARRAY_COPY( (zone)->org, (zone)->cur, (n) )
+
   static FT_Error
-  TT_Hint_Glyph( TT_Loader     loader,
-                 FT_Bool       is_composite )
+  TT_Hint_Glyph( TT_Loader  loader,
+                 FT_Bool    is_composite )
   {
     TT_GlyphZone  zone = &loader->zone;
     FT_Pos        origin;
 
 #ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
-
     FT_UInt       n_ins;
+#else
+    FT_UNUSED( is_composite );
+#endif
 
 
+#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
     n_ins = loader->glyph->control_len;
-
 #endif
 
     origin = zone->cur[zone->n_points - 4].x;
@@ -777,16 +780,16 @@
       translate_array( zone->n_points, zone->cur, origin, 0 );
 
 #ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
-
     /* save original point positioin in org */
     if ( n_ins > 0 )
       cur_to_org( zone->n_points, zone );
-
 #endif
 
     /* round pp2 and pp4 */
-    zone->cur[zone->n_points - 3].x = FT_PIX_ROUND( zone->cur[zone->n_points - 3].x );
-    zone->cur[zone->n_points - 1].y = FT_PIX_ROUND( zone->cur[zone->n_points - 1].y );
+    zone->cur[zone->n_points - 3].x =
+      FT_PIX_ROUND( zone->cur[zone->n_points - 3].x );
+    zone->cur[zone->n_points - 1].y =
+      FT_PIX_ROUND( zone->cur[zone->n_points - 1].y );
 
 #ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
 
@@ -801,8 +804,8 @@
       if ( error )
         return error;
 
-      loader->exec->is_composite     = is_composite;
-      loader->exec->pts              = *zone;
+      loader->exec->is_composite = is_composite;
+      loader->exec->pts          = *zone;
 
       debug = !( loader->load_flags & FT_LOAD_NO_SCALE ) &&
               ( (TT_Size)loader->size )->debug;
@@ -840,13 +843,13 @@
   static FT_Error
   TT_Process_Simple_Glyph( TT_Loader  loader )
   {
-    FT_GlyphLoader  gloader  = loader->gloader;
-    FT_Error        error    = TT_Err_Ok;
+    FT_GlyphLoader  gloader = loader->gloader;
+    FT_Error        error   = TT_Err_Ok;
     FT_Outline*     outline;
     FT_UInt         n_points;
 
 
-    outline = &gloader->current.outline;
+    outline  = &gloader->current.outline;
     n_points = outline->n_points;
 
     /* set phantom points */
@@ -868,9 +871,9 @@
     if ( ((TT_Face)loader->face)->doblend )
     {
       /* Deltas apply to the unscaled data. */
-      FT_Vector*    deltas;
-      FT_Memory     memory = loader->face->memory;
-      FT_UInt       i;
+      FT_Vector*  deltas;
+      FT_Memory   memory = loader->face->memory;
+      FT_UInt     i;
 
 
       error = TT_Vary_Get_Glyph_Deltas( (TT_Face)(loader->face),
@@ -944,11 +947,11 @@
     FT_UInt         num_points = gloader->base.outline.n_points;
     FT_Bool         have_scale;
     FT_Pos          x, y;
-    
 
-    have_scale = subglyph->flags & ( WE_HAVE_A_SCALE     |
-                                     WE_HAVE_AN_XY_SCALE |
-                                     WE_HAVE_A_2X2       );
+
+    have_scale = FT_BOOL( subglyph->flags & ( WE_HAVE_A_SCALE     |
+                                              WE_HAVE_AN_XY_SCALE |
+                                              WE_HAVE_A_2X2       ) );
 
     /* perform the transform required for this subglyph */
     if ( have_scale )
@@ -1004,6 +1007,7 @@
             ( subglyph->flags & SCALED_COMPONENT_OFFSET ) )
 #endif
       {
+
 #if 0
 
   /*************************************************************************/
@@ -1039,7 +1043,7 @@
                                  FT_MulFix( subglyph->transform.xx,
                                             subglyph->transform.xx ) +
                                  FT_MulFix( subglyph->transform.xy,
-                                            subglyph->transform.xy) );
+                                            subglyph->transform.xy ) );
         FT_Fixed  mac_yscale = FT_SqrtFixed(
                                  FT_MulFix( subglyph->transform.yy,
                                             subglyph->transform.yy ) +
@@ -1126,7 +1130,7 @@
 
 
       /* TT_Load_Composite_Glyph only gives us the offset of instructions */
-      /* so we read them here */
+      /* so we read them here                                             */
       if ( FT_STREAM_SEEK( loader->ins_pos ) ||
            FT_READ_USHORT( n_ins )           )
         return error;
@@ -1198,17 +1202,13 @@
     FT_Bool         opened_frame = 0;
 
 #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
-
     FT_Vector*      deltas       = NULL;
-
 #endif
 
 #ifdef FT_CONFIG_OPTION_INCREMENTAL
-
     FT_StreamRec    inc_stream;
     FT_Data         glyph_data;
     FT_Bool         glyph_data_loaded = 0;
-
 #endif
 
 
@@ -1276,9 +1276,9 @@
         left_bearing  = (FT_Short)metrics.bearing_x;
         advance_width = (FT_UShort)metrics.advance;
 
-# if 0
+#if 0
 
-        /* GWW: Do I do the same for vertical metrics ??? */
+        /* GWW: Do I do the same for vertical metrics? */
         metrics.bearing_x = 0;
         metrics.bearing_y = top_bearing;
         metrics.advance = advance_height;
@@ -1290,7 +1290,7 @@
         top_bearing  = (FT_Short)metrics.bearing_y;
         advance_height = (FT_UShort)metrics.advance;
 
-# endif
+#endif /* 0 */
 
       }
 
diff --git a/src/truetype/ttobjs.c b/src/truetype/ttobjs.c
index b61d50c..e73efb6 100644
--- a/src/truetype/ttobjs.c
+++ b/src/truetype/ttobjs.c
@@ -203,7 +203,11 @@
       goto Bad_Format;
     }
 
-    /* If we are performing a simple font format check, exit immediately */
+#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
+    face->root.face_flags |= FT_FACE_FLAG_HINTER;
+#endif
+
+    /* If we are performing a simple font format check, exit immediately. */
     if ( face_index < 0 )
       return TT_Err_Ok;
 
diff --git a/src/type1/t1objs.c b/src/type1/t1objs.c
index 519fa08..0e56590 100644
--- a/src/type1/t1objs.c
+++ b/src/type1/t1objs.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Type 1 objects manager (body).                                       */
 /*                                                                         */
-/*  Copyright 1996-2001, 2002, 2003, 2004 by                               */
+/*  Copyright 1996-2001, 2002, 2003, 2004, 2005 by                         */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -329,9 +329,10 @@
       root->num_glyphs = type1->num_glyphs;
       root->face_index = face_index;
 
-      root->face_flags  = FT_FACE_FLAG_SCALABLE;
-      root->face_flags |= FT_FACE_FLAG_HORIZONTAL;
-      root->face_flags |= FT_FACE_FLAG_GLYPH_NAMES;
+      root->face_flags = FT_FACE_FLAG_SCALABLE    |
+                         FT_FACE_FLAG_HORIZONTAL  |
+                         FT_FACE_FLAG_GLYPH_NAMES |
+                         FT_FACE_FLAG_HINTER;
 
       if ( info->is_fixed_pitch )
         root->face_flags |= FT_FACE_FLAG_FIXED_WIDTH;
diff --git a/src/type42/t42objs.c b/src/type42/t42objs.c
index d51a91c..814ad90 100644
--- a/src/type42/t42objs.c
+++ b/src/type42/t42objs.c
@@ -202,13 +202,17 @@
     root->num_charmaps = 0;
     root->face_index   = face_index;
 
-    root->face_flags  = FT_FACE_FLAG_SCALABLE;
-    root->face_flags |= FT_FACE_FLAG_HORIZONTAL;
-    root->face_flags |= FT_FACE_FLAG_GLYPH_NAMES;
+    root->face_flags = FT_FACE_FLAG_SCALABLE    |
+                       FT_FACE_FLAG_HORIZONTAL  |
+                       FT_FACE_FLAG_GLYPH_NAMES;
 
     if ( info->is_fixed_pitch )
       root->face_flags |= FT_FACE_FLAG_FIXED_WIDTH;
 
+#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
+    root->face_flags |= FT_FACE_FLAG_HINTER;
+#endif
+
     /* XXX: TODO -- add kerning with .afm support */
 
     /* get style name -- be careful, some broken fonts only */